Oracle 10g 及以上版本,有一个“闪回”(flashback)命令,它使用了这种底层多版本技术,可以把对象返回到以前某个时间点的状态。
在这个例子中,可以将EMP 表放回到删除信息前的那个时间点:
sql>variable scn number
sql>exec :scn:=dbms_flashback.get_sys_change_number
PL/SQL procedure successfully completed.
sql>print scn
scn
--------
8232203
sql>select count(0) from emp;
COUNT(0)
----------
23
sql>delete from emp;
23 rows deleted.
sql>select count(0) from emp;
COUNT(0)
----------
0
sql>flashback table emp to scn:scn
Flashback complete.
sql>select *
2 from (select count(0) from emp),
3 (select count(0) from emp as of scn:scn)
4 /
COUNT(0) COUNT(0)
--------------------
23 23
如果你得到一个错误“ORA-08189: cannot flashback the table because row movement is not enabled using the FLASHBACK command”(ORA-08189:无法闪回表,因为不支持使用FLASHBACK 命令完成行移动),就必须先执行一个命令:ALTER TABLE EMP ENABLE ROW MOVEMENT。
这个命令的作用是,允许Oracle 修改分配给行的rowid。在Oracle 中,插入一行时就会为它分配一个rowid,而且这一行永远拥有这个rowid。闪回表处理会对EMP 完成DELETE,并且重新插入行,这样就会为这些行分配一个的rowid。要支持闪回就必须允许Oracle 执行这个操作。
在这个例子中,可以将EMP 表放回到删除信息前的那个时间点:
sql>variable scn number
sql>exec :scn:=dbms_flashback.get_sys_change_number
PL/SQL procedure successfully completed.
sql>print scn
scn
--------
8232203
sql>select count(0) from emp;
COUNT(0)
----------
23
sql>delete from emp;
23 rows deleted.
sql>select count(0) from emp;
COUNT(0)
----------
0
sql>flashback table emp to scn:scn
Flashback complete.
sql>select *
2 from (select count(0) from emp),
3 (select count(0) from emp as of scn:scn)
4 /
COUNT(0) COUNT(0)
--------------------
23 23
如果你得到一个错误“ORA-08189: cannot flashback the table because row movement is not enabled using the FLASHBACK command”(ORA-08189:无法闪回表,因为不支持使用FLASHBACK 命令完成行移动),就必须先执行一个命令:ALTER TABLE EMP ENABLE ROW MOVEMENT。
这个命令的作用是,允许Oracle 修改分配给行的rowid。在Oracle 中,插入一行时就会为它分配一个rowid,而且这一行永远拥有这个rowid。闪回表处理会对EMP 完成DELETE,并且重新插入行,这样就会为这些行分配一个的rowid。要支持闪回就必须允许Oracle 执行这个操作。