在列删除

时间:2016-04-22 15:31:56

标签: oracle oracle11g version flashback

1 / FLASHBACKSELECT 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?

请原谅我手边没有数据库来测试。

2 个答案:

答案 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 TABLESELECT .. 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;