SQL> col vname for a8
SQL> /
SQL> col VERSIONS_STARTTIME for a30
SQL> col VERSIONS_ENDTIME for a30
SQL> /
SQL> set linesize 150
SQL> /
VID VNAME VVERSIONS_STARTTIME VERSIONS_ENDTIME
---------- -------- - ------------------------------
1Tom I 21-9月 -11 11.01.09 上午
2Mary I 21-9月 -11 11.01.24 上午 21-9月 -11 11.02.00 上午
2Mary123 U 21-9月 -11 11.02.00 上午
3Mike I 21-9月 -11 11.01.39 上午
SQL> /*
SQL> selectvid,vname,versions_operation,versions_starttime,versions_endtime
SQL> from versions_table
SQL> versions between timestamp minvalueand maxvalue
SQL> order by 1,4;
SQL> */
SQL> --通过闪回版本查询,可以获取某个表过去已经提交了的历史版本信息
SQL> host cls
SQL> --闪回事务查询
SQL> create table transaction_table
2 (tid number,tnamevarchar(20));
表已创建。
SQL> --第一个事务
SQL> insert into transaction_tableva lues(1,'Tom');
已创建 1 行。
SQL> insert into transaction_table values(2,'Mary');
已创建 1 行。
SQL> insert into transaction_tableva lues(3,'Mike');
已创建 1 行。
SQL> commit;
提交完成。
SQL> --第二个事务
SQL> update transaction_table settname='Mary123' where tid=2;
已更新 1 行。
SQL> delete from transaction_table wheretid=3;
已删除 1 行。
SQL> commit;
提交完成。
l闪回事务查询实际上闪回版本查询的一个扩充,通过它可以审计某个事务甚至撤销一个已经提交的事务。
l实现闪回事务查询,需要先了解flashback_transaction_query视图,从该视图中可以获取事务的历史操作记录以及撤销语句(UNDO_SQL)。
l使用闪回事务查询,可以了解某个表的历史操作记录,这个操作记录对应一个撤销SQL语句,如果想要撤销这个操作,就可以执行这个SQL语句。
Flashback_transaction_query
名称 类型 说明
------------------------------------------------------------------------------------------------
XID RAW(8) 事务编号
START_SCN NUMBER 事务的开始的系统改变号
START_TIMESTAMP DATE 事务的开始时间
COMMIT_SCN NUMBER 事务提交时的系统改变号
COMMIT_TIMESTAMP DATE 事务提交时的时间
LOGON_USER VARCHAR2(30) 对应的用户
UNDO_CHANGE# NUMBER 撤销操作对应的编号
OPERATION VARCHAR2(32) 操作
TABLE_NAME VARCHAR2(256) 表
TABLE_OWNER VARCHAR2(32) 所有者
ROW_ID VARCHAR2(19) 行号
UNDO_SQL VARCHAR2(4000) 撤销事务的SQL语句
注意,要查询flashback_transaction_query视图的信息,需要有select any transaction的权限。
SQL> --如何撤销第二个事务 ----闪回事务查询
SQL> --授权select any transaction给scott
SQL> conn / as sysdba
已连接。
SQL> grant select any transaction toscott;
授权成功。
SQL> conn scott/tiger
已连接。
SQL> /*
SQL> 闪回事务查询的步骤:1
SQL> 1. 通过闪回版本查询获取事务号(xid)
SQL> 2. 通过xid查询Flashback_transaction_query,获取undo_sql
SQL> */
SQL> select tid,tname,versions_operation