查詢oracle 數據庫中回滾段中一個時間點被修改的表數據並還原表中原來數據


利用下面的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;

通過以上小實驗可以看出,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.cnblogs.com/wzmenjoy/archive/2012/01/17/2367636.html)

下面是我寫的一個存儲,用來還原一個表pub_goods中某個時間點做的數據的更新:

create or replace procedure supplytaxrate_to_his_withdate(hisdate in date) is

cursor c_modifiedgoods is
SELECT distinct goodsid FROM pub_goods VERSIONS BETWEEN TIMESTAMP MINVALUE AND
MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL and VERSIONS_STARTTIME > hisdate;

r_modifiedgoods c_modifiedgoods%rowtype;

begin


open c_modifiedgoods;
loop

fetch c_modifiedgoods into r_modifiedgoods;
if c_modifiedgoods%notfound then
exit;
end if;

UPDATE pub_goods aa
SET (supplytaxratebak) = (select a.supplytaxrate
from pub_goods VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE a,
(SELECT goodsid,
min(VERSIONS_STARTTIME) VERSIONS_STARTTIME
FROM pub_goods VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE VERSIONS_STARTTIME IS NOT NULL
and VERSIONS_STARTTIME >
to_date('2017-07-01',
'YYYY-MM-DD')
group by goodsid) b
where a.goodsid = b.goodsid
and a.VERSIONS_STARTTIME = b.VERSIONS_STARTTIME
and a.goodsid=r_modifiedgoods.goodsid)
where aa.goodsid=r_modifiedgoods.goodsid;
end loop;
commit;
close c_modifiedgoods;



end supplytaxrate_to_his_withdate;
/

 

上面的存儲中,我是將修改的字段的值還原到一個我新增的bak字段中了,具體如何還原可視情況而定,具體關於insert和delete操作同樣可以通過sql查詢出數據並做還原。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM