最近数据库中莫名其妙的丢失了一些订单的数据,为了找出到底是什么原因,所以创建了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; / |
这样就可以,简单的记录下什么东西在偷偷的删数据了。