在Oracle中如果错误地提交了修改操作,然后想查看修改前的值,这时候可以使用查询闪回(query flashback)。
查询闪回可以根据根据一个时间值或者系统变更号(SCN)进行。
执行闪回操作,要使用户具有EXECUTE权限,下面以sys身份登录,并授权给store用户
一、时间查询闪回
用户store登录,查询customers表
select * from customers;
然后update customers set LAST_NAME=LAST_NAME || 's' ;
commit;
可以看到LAST_NAME被修改了,现在如何查看修改前的数据呢?
使用sqlplus store登录,执行如下语句,就可以查看修改之前LAST_NAME 没有加“s”
DBMS_FLASHBACK.ENABLE_AT_TIME() 该过程将数据库状态闪回到一个特定的时间值。
DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE-10/1440 ) 也就是闪存到10分钟之前。
现在执行任何查询就将显示10分钟之前的状态。但是在pl/sql中查询的话 还是现在现在的状态。
所以可以从这里查看之前数据,然后在pl/sql修改回原来的值。
禁用闪回 EXECUTE DBMS_FLASHBACK.DISABLE();
这些命令只能在sqlplus 中使用,在pl/sql中不能使用。
二、系统变更号查询闪回
根据SCN进行闪回操作比根据时间进行要更精确,因为数据库就是使用SCN来跟踪数据库的变化。
获得当前SCN命令:
通过下面语句可以闪回到这个SCN的状态
EXECUTE DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:CURRENT_SCN);
禁用闪回操作
EXECUTE DBMS_FLASHBACK.DISABLE();