SELECT 列删除前的版本
SELECT AS OF a version before column drop
1/ FLASHBACK
和 SELECT 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 TABLE
和 SELECT .. 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;
1/ FLASHBACK
和 SELECT 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 TABLE
和 SELECT .. 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;