使用Trigger审计一张表的DML操作

最近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

zx@ORCL>create table ORDERS   2  (   3    order_id   NUMBER,   4    order_name VARCHAR2(10)   5  ); Table created.

创建用于记录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.

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。