最近ogg的灾备端复制进程中的一张表老是报错ORA-04031,但是又查不到原因,于是想用审计的方法来看到底这张表是被谁做了DML操作,把数据搞没了。本来想用数据库自带的审计功能参考:
但是需要重启数据库,就放弃了,上网查资料看到有人用触发器来实现这个功能,于是自己也做了尝试。
平台11.2.0.4
sys@ORCL>select * from v$version; BANNER ------------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production PL/SQL Release 11.2.0.4.0 - Production CORE 11.2.0.4.0 Production TNS for Linux: Version 11.2.0.4.0 - Production NLSRTL Version 11.2.0.4.0 - Production创建测试表Orders
创建用于记录DML操作记录的表
zx@ORCL>create table AUDIT_ORDERS 2 ( 3 orderid_new NUMBER(38), 4 orderid_old NUMBER(38), 5 username VARCHAR2(30), 6 opt_date DATE, 7 opt_type VARCHAR2(10), 8 terminal VARCHAR2(50), 9 session_id NUMBER(10), 10 hostname VARCHAR2(50) 11 ); Table created.创建触发器
zx@ORCL>CREATE OR REPLACE TRIGGER TRI_AUDIT_ORDERS 2 BEFORE INSERT OR UPDATE OR DELETE ON ORDERS 3 FOR EACH ROW 4 BEGIN 5 IF INSERTING THEN 6 INSERT INTO AUDIT_ORDERS 7 VALUES 8 (:NEW.ORDER_ID, 9 :OLD.ORDER_ID, 10 USER, 11 SYSDATE, --记录操作的时间 12 'INSERT', 13 SYS_CONTEXT('USERENV', 'TERMINAL'),--记录操作来源的终端信息 14 USERENV('SID'), --记录操作的SID 15 SYS_CONTEXT('USERENV', 'HOST')); --记录操作的主机名 16 ELSIF UPDATING THEN 17 INSERT INTO AUDIT_ORDERS 18 VALUES 19 (:NEW.ORDER_ID, 20 :OLD.ORDER_ID, 21 USER, 22 SYSDATE, 23 'UPDATE', 24 SYS_CONTEXT('USERENV', 'TERMINAL'), 25 USERENV('SID'), 26 SYS_CONTEXT('USERENV', 'HOST')); 27 ELSIF DELETING THEN 28 INSERT INTO AUDIT_ORDERS 29 VALUES 30 (:NEW.ORDER_ID, 31 :OLD.ORDER_ID, 32 USER, 33 SYSDATE, 34 'DELETE', 35 SYS_CONTEXT('USERENV', 'TERMINAL'), 36 USERENV('SID'), 37 SYS_CONTEXT('USERENV', 'HOST')); 38 END IF; 39 END; 40 / Trigger created.郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。