出自: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