一篇关于 flashback version qrery 的好文章

来源:互联网 发布:常用动画制作软件 编辑:程序博客网 时间:2024/06/04 00:55

出自:http://hi.baidu.com/sunboy_zzc/item/290337d754cd623f2b35c75f

flashback version query提供了一个审计行改变的功能,它能找到所有已经提交了的行的记录,比如说,时间1,我插入一条记录,时间2我删除了这条记录,对于时间3,当然查询不到这条记录,但是flashback version query能够把时间1、时间2的操作给记录下来,并详细的查询出来。
flashback version query一样依赖于AUM,所以,这里就不再多说AUM的配置。flashback version query采用VERSIONS BETWEEN语句来进行查询,常用的有
·        VERSIONS_SCN - 系统改变号 
·        VERSIONS_TIMESTAMP - 时间 
flashback version query是一个功能强大的工具,可以分析到什么时间执行了什么操作的问题。也可以用于记录的审计,而没有必要去开启细粒度审计功能或者是使用LOGMNR了。
下面将展示这个具有电影功能的flashback version query
SQL> connect test/test
Connected.
SQL> create table test(a int,b varchar2(10));
Table created.
我们执行一系列如下的操作
16:33:17 SQL> insert into test values(1,'16:33:17');
1 row created.
16:33:31 SQL> commit;
Commit complete.
16:33:34 SQL> update test set a=2,b='16:33:34';
1 row updated.
16:33:53 SQL> commit;
Commit complete.
16:33:57 SQL> update test set a=3;
1 row updated.
16:34:04 SQL> commit;
Commit complete.
16:34:06 SQL> delete test;
1 row deleted.
16:34:11 SQL> commit;
Commit complete.
16:34:13 SQL> insert into test values(4,'16:34:13');
1 row created.
16:34:32 SQL> commit;
Commit complete.
16:34:34 SQL> update test set a=5,b='16:34:34';
1 row updated.
16:34:46 SQL> commit;
Commit complete.
现在,我们看到该表最后的记录是
16:34:49 SQL> select * from test;
         A B
---------- ----------
         5 16:34:34
这个时候,如果我们利用flash table或者是flash query,我们也只能是看到过去的莫一个快照而已,利用flashback version query,我们将找到其中的任何变化,如
SQL>select versions_starttime, versions_endtime, versions_xid,
      versions_operation, a,b
      from test versions between timestamp minvalue and maxvalue
      order by VERSIONS_STARTTIME;


VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID VERSIONS_OPERATION  A B
----------------  ------------- ----------- ----------------  ------ ------
07-APR-04 04.33.33 PM  07-APR-04 04.33.55 PM  0400230098010000 I  1 16:33:17
07-APR-04 04.33.55 PM  07-APR-04 04.34.04 PM  0400270098010000 U  2 16:33:34
07-APR-04 04.34.04 PM  07-APR-04 04.34.13 PM  0400280098010000 U  3 16:33:34
07-APR-04 04.34.13 PM                         0400290098010000 D  3 16:33:34
07-APR-04 04.34.31 PM  07-APR-04 04.34.47 PM  0400260098010000 I  4 16:34:13
07-APR-04 04.34.47 PM                         04000C0099010000 U  5 16:34:34
6 rows selected

注意:
此处显示了对该表所作的所有更改,甚至包括该行被删除和重新插入的情况。VERSION_OPERATION 列显示对该行执行了什么操作 (Insert/Update/Delete)。所做的这些工作不需要历史表或额外的列。
flashback version query记载的是行的改变,如果一个操作有多行的改变,如delete from tablename,那么,在flashback version query对应的也是多行。

在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 ROWNUM、LEVEL 等其他熟悉的伪列相类似。其他伪列 - 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN - 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到(这个将在flashback transaction query中描述)。

当然,除了分析以上所有的变更之外,我们可以指定时间段,如
select a,b
from test versions between timestamp 
to_date('2004-04-07 04:34:04','yyyy-mm-dd hh24:mi:ss')
and to_date('2004-04-07 04:34:50','yyyy-mm-dd hh24:mi:ss')

还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例: 
select versions_starttime, versions_endtime
from test versions
between scn 1000 and 1001

原创粉丝点击