Oracle10g数据库中闪回表特性剖析[3]

文章作者 100test 发表时间 2007:05:02 16:31:11
来源 100Test.Com百考试题网


表版本和闪回功能

  用户可能会经常多次创建和删除同一个表,如:

CREATE TABLE TEST (COL1 NUMBER).

INSERT INTO TEST VALUES (1).

commit.

DROP TABLE TEST.

CREATE TABLE TEST (COL1 NUMBER).

INSERT INTO TEST VALUES (2).

commit.

DROP TABLE TEST.

CREATE TABLE TEST (COL1 NUMBER).

INSERT INTO TEST VALUES (3).

commit.

DROP TABLE TEST.

  此时,如果您要对表 TEST 执行闪回操作,那么列 COL1 的值应该是什么?常规想法可能认为从回收站取回表的第一个版本,列 COL1 的值是 1。实际上,取回的是表的第三个版本,而不是第一个。因此列 COL1 的值为 3,而不是 1。

  此时您还可以取回被删除表的其他版本。但是,表 TEST 的存在不允许出现这种情况。您有两种选择:

  使用重命名选项:

FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST2.

FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST1.

  这些语句将表的第一个版本恢复到 TEST1,将第二个版本恢复到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值将分别是 1 和 2。或者,使用表的特定回收站名称进行恢复。为此,首先要识别表的回收站名称,然后执行:

FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw

==$0" TO BEFORE DROP RENAME TO TEST2.

FLASHBACK TABLE "BIN$04LhcpnqanfgMAAAAAANPw

==$0" TO BEFORE DROP RENAME TO TEST1.

  这些语句将恢复被删除表的两个版本。

  警告

  取消删除特性使表恢复其原始名称,但是索引和触发器等相关对象并没有恢复原始名称,它们仍然使用回收站的名称。在表上定义的源(如视图和过程)没有重新编译,仍然保持无效状态。必须手动得到这些原有名称并应用到闪回表。

  信息保留在名为 USER_RECYCLEBIN 的视图中。在对表进行闪回操作前,请使用以下查询来检索原有名称。

SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE

FROM USER_RECYCLEBIN

WHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBIN

WHERE ORIGINAL_NAME = RECYCLETEST)

AND ORIGINAL_NAME != RECYCLETEST.

OBJECT_NAMEORIGINAL_N TYPE

------------------------------ ---------- --------

BIN$04LhcpnianfgMAAAAAANPw==$0 IN_RT_01  INDEX

BIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT TRIGGER

  在表进行闪回操作后,表 RECYCLETEST 上的索引和触发器将按照 OBJECT_NAME 列中所示进行命名。根据以上查询,可以使用原始名称重新命名对象,如下所示:

ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01.

ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT.

  一个值得注意的例外情况是位图索引。当删除位图索引时,它们并不放置在回收站中 — 因此无法检索它们。约束名称也无法从视图中检索。必须从其他来源对它们进行重命名。

           [1] [2] [3]



相关文章


Oracle数据库字符集转换规律全面剖析
Unix环境下Oracle数据库优化心得介绍
关于Oracle中执行计划稳定性深入研究
OracleSQL性能优化技巧大总结
Oracle10g数据库中闪回表特性剖析[3]
Oracle10g数据库中闪回表特性剖析[1]
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛