最近數據庫中莫名其妙的丟失了一些訂單的數據,爲了找出到底是什麼原因,所以創建了oracle的一個觸發器,記錄數據庫***數據的一些情況,我相信應該有很多朋友都有這種需求,但是不知道具體如何做,這裏我跟大家分享一下。
一、建表。
create table aa as select a.SID, a.SERIAL#, a.SCHEMANAME 數據庫用戶名, a.STATUS 狀態, a.OSUSER 系統登陸用戶, a.MACHINE 連接數據庫的機器名, sys_context('userenv', 'ip_address') 登陸用戶的IP, a.TERMINAL 登陸用戶所用終端, a.PROGRAM 連接數據庫的程序, a.MODULE 功能模塊, a.TYPE 連接類型, a.SQL_ID 用戶執行的SQL_ID, a.LOGON_TIME 用戶登陸時間, B.SQL_TEXT SQL語句, B.SQL_FULLTEXT 完整的sql語句, SYSDATE 記錄時間 from v$session a left join v$sqlarea b on A.SQL_ID=B.SQL_ID ;
二、建觸發器
CREATE OR REPLACE TRIGGER jiankong_ordertickets after delete ON ORDERTICKETS FOR EACH ROW BEGIN insert into deletejiankong select a.SID, a.SERIAL#, a.SCHEMANAME 數據庫用戶名, a.STATUS 狀態, a.OSUSER 系統登陸用戶, a.MACHINE 連接數據庫的機器名, sys_context('userenv', 'ip_address') 登陸用戶的IP, a.TERMINAL 登陸用戶所用終端, a.PROGRAM 連接數據庫的程序, a.MODULE 功能模塊, a.TYPE 連接類型, a.SQL_ID 用戶執行的SQL_ID, a.LOGON_TIME 用戶登陸時間, B.SQL_TEXT SQL語句, B.SQL_FULLTEXT 完整的sql語句, SYSDATE 記錄時間 from v$session a left join v$sqlarea b on A.SQL_ID=B.SQL_ID where a.TYPE='USER' and length(a.SQL_ID) >0 and (B.SQL_TEXT like 'delete%ordertickets%' OR B.SQL_TEXT like 'DELETE%ordertickets%' or B.SQL_TEXT like 'delete%ORDERTICKETS%' OR B.SQL_TEXT like 'DELETE%ORDERTICKETS%' ); --注意:這個關鍵字的大小寫一定要注意,大小寫不一樣是不會起作用的。 END; /
這樣就可以,簡單的記錄下什麼東西在偷偷的刪數據了。