所有已经提交了的行记录。其语法格式如下:
select column_name[,column_name,...]
from table_name
versionsbetween [SCN|TIMESTAMP] [expr|MINVALUE]
and [epxr|MAXVALUE] as of [SCN|TIMESTAMP] expr;
?其中:column_name列名;table_name表名;between...and时间段;SCN系统改变号;TIMESTAMP时间戳;AS OF表示恢复单个版本;MAXVALUE最大值;MINVALUE最小值;expr指定一个值或者表达式。
闪回版本查询举例
--闪回版本查询
SQL> create table versions_table
2 (vid number,vname varchar2(20));
表已创建。
SQL> --第一天
SQL> insert into versions_table values(1,'Tom');
已创建 1 行。
SQL> commit;
提交完成。
SQL> --第二天
SQL> insert into versions_table values(2,'Mary');
已创建 1 行。
SQL> commit;
提交完成。
SQL> --第三天
SQL> insert into versions_table values(3,'Mike');
已创建 1 行。
SQL> commit
2 ;
提交完成。
SQL> --第四天
SQL> update versions_table set vname='Mary123' where vid=2;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from versions_table;
VID VNAME
---------- --------------------
1 Tom
2 Mary123
3 Mike
SQL> --执行闪回版本查询
SQL> select vid,vname
2 from versions_table
3 versions between timestamp minvalue and maxvalue;
VID VNAME
---------- --------------------
2 Mary123
3 Mike
2 Mary
1 Tom
SQL> select vid,vname,versions_operation,versions_starttime,versions_endtime
2 from versions_table
3 versions between timestamp minvalue and maxvalue
4 order by 1,4;
VID VNAME V VERSIONS_STARTTIME VERSIONS_ENDTIME
--- --------- - ---------------------------------------- ---------------------------------------------------------------------------
1 Tom I 29-3月 -12 11.07.26 上午
2 Mary I 29-3月 -12 11.07.41 上午 29-3月 -12 11.08.26 上午
2 Mary123 U 29-3月 -12 11.08.26 上午
3 Mike I 29-3月 -12 11.07.53 上午
闪回事务查询
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语句
注意
l注意,要查询flashback_transaction_query视图的信息,需要有select any transaction的权限。
闪回事务查询举例
步骤:
l从闪回版本查询中,获取xid号。
l基于xid号,在flashback_transaction_query视图中获取相应事务的信息。
l利用UNDO_SQL撤销事务操作。
代码:
SQL> --闪回事务查询
SQL> create table transaction_table
2 (tid number,tname varchar2(20));
表已创建。
SQL> --第一个事务
SQL> insert into transaction_table values(1,'Tom');
已创建 1 行。
SQL> insert into transaction_table values(2,'Mary');
已创建 1 行。
SQL> commit;
提交完成。
SQL> --第二个事务
SQL> insert into transaction_table values(3,'Mike');
已创建 1 行。
SQL> update transaction_table set tname='Mary123' where tid=2;
已更新 1 行。
SQL> commit;
提交完成。
SQL> --如何撤销第二个事务??
SQL> desc flashback_transaction_query
名称 是否为空? 类型
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
XID RAW(8)
START_SCN NUMBER
START_TIMESTAMP DATE
COMMIT_SCN NUMBER
COMMIT_TIMESTAMP DATE
LOGON_USER VARCHA