ORACLE查詢表最近更改的數據

SQL> create table test(id number,name varchar2(10),gender varchar2(5));
表已建立。
SQL> insert into test values(1,'宋春風','男');
已建立 1 行。
SQL> insert into test values(2,'葉民','男');
已建立 1 行。
SQL> insert into test values(3,'白冰','男');
已建立 1 行。
SQL> insert into test values(4,'方巍森','男');
已建立 1 行。
SQL> insert into test values(5,'孫書禎','男');
已建立 1 行。
SQL> insert into test values(6,'史波','男');
已建立 1 行。
SQL> commit;
提交完成。

利用下面的SQL就能夠查處最近更改的數據。工具

SQL> SELECT ID,NAME,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION 
FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE 
VERSIONS_STARTTIME IS NOT NULL ORDER BY VERSIONS_STARTTIME DESC;
        ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V
---------- ------ ----- ------------------------- ------------------------- -
         6 史波   男    30-11月-11 04.02.28 下午                            I
         5 孫書禎 男    30-11月-11 04.02.28 下午                            I
         1 宋春風 男    30-11月-11 04.02.28 下午                            I
         3 白冰   男    30-11月-11 04.02.28 下午                            I
         2 葉民   男    30-11月-11 04.02.28 下午                            I
         4 方巍森 男    30-11月-11 04.02.28 下午                            I
已選擇6行。

修改幾條數據和接下來的查詢作對比。日誌

SQL> UPDATE TEST SET GENDER='女' WHERE NAME='孫書禎';
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> UPDATE TEST SET GENDER='女' WHERE NAME='史波';
已更新 1 行。
SQL> COMMIT;
提交完成。

再次查詢,被修改的數據就能夠看到被修改和修改前的數據。code

SQL> SELECT ID,NAME,GENDER,VERSIONS_STARTTIME,VERSIONS_ENDTIME,
VERSIONS_OPERATION FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND 
MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL ORDER BY 
VERSIONS_STARTTIME DESC;
        ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V
---------- ------ ----- ------------------------- ------------------------- -
         6 史波   女    30-11月-11 04.15.07 下午                            U
         5 孫書禎 女    30-11月-11 04.14.31 下午                            U
         4 方巍森 男    30-11月-11 04.02.28 下午                            I
         3 白冰   男    30-11月-11 04.02.28 下午                            I
         2 葉民   男    30-11月-11 04.02.28 下午                            I
         1 宋春風 男    30-11月-11 04.02.28 下午                            I
         6 史波   男    30-11月-11 04.02.28 下午  30-11月-11 04.15.07 下午  I
         5 孫書禎 男    30-11月-11 04.02.28 下午  30-11月-11 04.14.31 下午  I
已選擇8行。

再修改幾條數據後後查詢。it

SQL> delete from test WHERE NAME='史波';
已刪除 1 行。
SQL> delete from test WHERE NAME='孫書禎';
已刪除 1 行。
SQL> commit;
提交完成。
SQL> SELECT ID,NAME,GENDER,VERSIONS_STARTTIME,VERSIONS_ENDTIME,
VERSIONS_OPERATION FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND 
MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL ORDER BY 
VERSIONS_STARTTIME DESC;
        ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V
---------- ------ ----- ------------------------- ------------------------- -
         5 孫書禎 男    30-11月-11 04.26.02 下午                            D
         6 史波   男    30-11月-11 04.26.02 下午                            D
         6 史波   女    30-11月-11 04.15.07 下午  30-11月-11 04.19.08 下午  U
         5 孫書禎 女    30-11月-11 04.14.31 下午  30-11月-11 04.19.08 下午  U
         2 葉民   男    30-11月-11 04.02.28 下午                            I
         3 白冰   男    30-11月-11 04.02.28 下午                            I
         4 方巍森 男    30-11月-11 04.02.28 下午                            I
         5 孫書禎 男    30-11月-11 04.02.28 下午  30-11月-11 04.14.31 下午  I
         1 宋春風 男    30-11月-11 04.02.28 下午                            I
         6 史波   男    30-11月-11 04.02.28 下午  30-11月-11 04.15.07 下午  I
已選擇10行。

經過以上小實驗能夠看出,VERSIONS_STARTTIME是數據被修改的起始時間,VERSIONS_ENDTIME是數據被修改後新數據的有效時間,也就是VERSIONS_STARTTIME和VERSIONS_ENDTIME時間段內,這條數據再沒被修改過,若是VERSIONS_ENDTIME爲空,就說明這天記錄從VERSIONS_STARTTIME時間起再沒被修改過。VERSIONS_OPERATION是修改狀態,I表明INSERT,U表明UPDATE,D表明DELETE。此時若是想回滾INSERT的數據,只須要DELETE反向操做便可,若是想回滾UPDATE操做,將數據反向UPDATE回去便可,好比本實驗已經能夠看到進行UPDATE操做的是NAME爲史波和孫書禎的兩條記錄,並且也能夠看到進行UPDATE以前的數據他們的性別是男,因此只須要在作個反向UPDATE,將性別該爲男便可實現回退,若是要回滾DELETE操做,一樣作個INSERT操做,將刪除的數據在插回去便可。
注:此SQL只能查詢到回滾段內的信息,超出回滾段範圍這個SQL就無能爲力了,須要藉助LOGMGR工具挖掘日誌了(詳見http://www.dbdream.org/?p=149)。table

相關文章
相關標籤/搜索