SELECT 列删除前的版本

SELECT AS OF a version before column drop

1/ FLASHBACKSELECT AS OF/ VERSION BETWEEN 是否使用相同的 source 历史回溯?这个问题和第二个问题有关。

2/ 我知道 FLASHBACK 在 DDL 更改之前无法返回。

我的问题是 SELECT AS OF,在 DDL 更改之前它是否能够 select 一些东西。 举个例子

CREATE TABLE T
(col1 NUMBER, col2 NUMBER)
INSERT INTO T(col1, col2) VALUES('1', '1')
INSERT INTO T(col1, col2) VALUES('2', '2')
COMMIT;
SLEEP(15)
ALTER TABLE T DROP COLUMN col2;
SELECT * FROM T
AS OF SYSTIMESTAMP - INTERVAL '10' SECOND;

select return 是 2 列还是 1 列?

对不起,我手头没有数据库可以测试。

任何改变 table 结构的 DDL 都会使 table 的任何现有撤消数据无效。所以你会得到错误 'ORA-01466' unable to read data - table definition has changed。

这是一个简单的测试

CREATE TABLE T
(col1 NUMBER, col2 NUMBER);
INSERT INTO T(col1, col2) VALUES('1', '1');
INSERT INTO T(col1, col2) VALUES('2', '2');
COMMIT;
SLEEP(15)
ALTER TABLE T DROP COLUMN col2;


SELECT * FROM T
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' SECOND);

ERRROR ORA-01466 执行上述 select 语句后。

但是,更改 table 的存储属性的 DDL 操作不会使撤消数据无效,因此您仍然可以使用闪回查询。

1) FLASHBACK TABLESELECT .. AS OF 使用相同的来源,UNDO。还有 FLASHBACK DATABASE - 虽然它使用相同的机制,但它使用单独的源,必须选择性地配置闪回日志。

2) 如果启用 flashback archive.

,闪回 table 和闪回查询 可以 在 DDL 更改之前返回

要使用该功能,请在示例代码中添加一些语句:

CREATE FLASHBACK ARCHIVE my_flashback_archive TABLESPACE users RETENTION 10 YEAR;
...
ALTER TABLE t FLASHBACK ARCHIVE my_flashback_archive;

现在这条语句将 return 1 列:

SELECT * FROM T;

并且此语句将 return 2 列:

SELECT * FROM T AS OF SYSTIMESTAMP - INTERVAL '10' SECOND;