最近ogg的灾备端复制进程中的一张表老是报错ORA-04031,但是又查不到原因,于是想用审计的方法来看到底这张表是被谁做了DML操作,把数据搞没了。本来想用数据库自带的审计功能参考:http://www.jb51.cc/article/p-zchlscoj-xe.html
但是需要重启数据库,就放弃了,上网查资料看到有人用触发器来实现这个功能,于是自己也做了尝试。
平台11.2.0.4
sys@ORCL>select*fromv$version; BANNER ------------------------------------------------------------------------------------- OracleDatabase11gEnterpriseEditionRelease11.2.0.4.0-64bitProduction PL/sqlRelease11.2.0.4.0-Production CORE11.2.0.4.0Production TNSforLinux:Version11.2.0.4.0-Production NLSRTLVersion11.2.0.4.0-Production
创建测试表Orders
zx@ORCL>createtableORDERS 2( 3order_idNUMBER,4order_nameVARCHAR2(10) 5); Tablecreated.
创建用于记录DML操作记录的表
zx@ORCL>createtableAUDIT_ORDERS 2( 3orderid_newNUMBER(38),4orderid_oldNUMBER(38),5usernameVARCHAR2(30),6opt_dateDATE,7opt_typeVARCHAR2(10),8terminalVARCHAR2(20),9session_idNUMBER(10),10hostnameVARCHAR2(20) 11); Tablecreated.
创建触发器
zx@ORCL>CREATEORREPLACETRIGGERTRI_AUDIT_ORDERS 2BEFOREINSERTORUPDATEORDELETEONORDERS 3FOREACHROW 4BEGIN 5IFINSERTINGTHEN 6INSERTINTOAUDIT_ORDERS 7VALUES 8(:NEW.ORDER_ID,9:OLD.ORDER_ID,10USER,11SYSDATE,--记录操作的时间 12'INSERT',13SYS_CONTEXT('USERENV','TERMINAL'),--记录操作来源的终端信息 14USERENV('SID'),--记录操作的SID 15SYS_CONTEXT('USERENV','HOST'));--记录操作的主机名 16ELSIFUPDATINGTHEN 17INSERTINTOAUDIT_ORDERS 18VALUES 19(:NEW.ORDER_ID,20:OLD.ORDER_ID,21USER,22SYSDATE,23'UPDATE',24SYS_CONTEXT('USERENV',25USERENV('SID'),26SYS_CONTEXT('USERENV','HOST')); 27ELSIFDELETINGTHEN 28INSERTINTOAUDIT_ORDERS 29VALUES 30(:NEW.ORDER_ID,31:OLD.ORDER_ID,32USER,33SYSDATE,34'DELETE',35SYS_CONTEXT('USERENV',36USERENV('SID'),37SYS_CONTEXT('USERENV','HOST')); 38ENDIF; 39END; 40/ Triggercreated.
测试数据
--linux的sqlplus插入 zx@ORCL>insertintoordersvalues(1,'zx'); 1rowcreated. zx@ORCL>commit; Commitcomplete. --windows的sqlplus插入 sql>insertintoordersvalues(2,'wl'); 已创建1行。 sql>commit; 提交完成。 --plsql插入 INSERTINTOordersVALUES(3,'yhz'); COMMIT; --使用sys用户插入 zx@ORCL>conn/assysdba Connected. sys@ORCL>insertintozx.ordersvalues(4,'wj'); 1rowcreated. sys@ORCL>commit; Commitcomplete. --更新数据 zx@ORCL>updateordeRSSetorder_id=10whereorder_id=1; 1rowupdated. zx@ORCL>commit; Commitcomplete. --删除数据 zx@ORCL>deletefromorderswhereorder_id<3; 1rowdeleted. zx@ORCL>commit; Commitcomplete.
查看记录表中的记录
--测试表记录 zx@ORCL>select*fromorders; ORDER_IDORDER_NAME ---------------------------------------- 3yhz 10zx 4wj --审计表记录 sql>colusernamefora10 sql>colhostnamefora20 sql>altersessionsetnls_date_format='yyyymmddhh24:mi:ss'; 会话已更改。 sql>setlinesize200 sql>select*fromaudit_orders; ORDERID_NEWORDERID_OLDUSERNAMEOPT_DATE OPT_TYPE TERMINAL SESSION_IDHOSTNAME ------------------------------------------------------------------------------------------------------------------------------------------- 3 ZX 2017010421:32:46INSERT VICTOR-PC 10WORKGROUP\VICTOR-PC 1 ZX 2017010421:30:32INSERT pts/0 24rhel6 2 ZX 2017010421:31:47INSERT VICTOR-PC 146WORKGROUP\VICTOR-PC 4 SYS 2017010421:33:52INSERT pts/0 24rhel6 10 1ZX 2017010421:37:26UPDATE pts/0 24rhel6 2ZX 2017010421:37:50DELETE pts/0 24rhel6 已选择6行。
审计表记录了所有的DML操作,可以用于审计哪些用户对表做了哪些操作。
参考:
http://www.cnblogs.com/wanglibo/articles/2121098.html
http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html