1 / FLASHBACK
和SELECT AS OF/ VERSION BETWEEN
是否使用相同的来源历史记录来回归?这个问题与第二个问题有关。
2 /我知道FLASHBACK
在DDL更改之前无法返回。
我的问题是SELECT AS OF
,是否可以在DDL更改之前选择一些内容。
举个例子
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会返回2列还是1?
请原谅我手边没有数据库来测试。
答案 0 :(得分:1)
任何改变表结构的DDL都会使表的任何现有撤消数据无效。所以你会得到错误' ORA-01466'无法读取数据 - 表定义已更改。
这是一个简单的测试
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
执行上述选择语句。
但是,更改表的存储属性的DDL操作不会使撤消数据无效,因此您仍然可以使用闪回查询。
答案 1 :(得分:0)
1)FLASHBACK TABLE
和SELECT .. AS OF
使用相同的来源UNDO。还有FLASHBACK DATABASE
- 虽然它使用相同的机制,但它使用单独的源,闪回日志必须可选配置。
2)如果启用flashback archive.,闪回表和闪回查询可以在DDL更改之前返回此功能也称为Oracle Total Recall,它需要单独的许可证。< / p>
要使用该功能,请在示例代码中添加一些语句:
CREATE FLASHBACK ARCHIVE my_flashback_archive TABLESPACE users RETENTION 10 YEAR;
...
ALTER TABLE t FLASHBACK ARCHIVE my_flashback_archive;
现在这个语句将返回1列:
SELECT * FROM T;
此语句将返回2列:
SELECT * FROM T AS OF SYSTIMESTAMP - INTERVAL '10' SECOND;