当前位置:  数据库>oracle

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

    来源: 互联网  发布时间:2017-06-26

    本文导语: 最近ogg的灾备端复制进程中的一张表老是报错ORA-04031,但是又查不到原因,于是想用审计的方法来看到底这张表是被谁做了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(20),
  9    session_id  NUMBER(10),
 10    hostname    VARCHAR2(20)
 11  );
 
Table created.

创建触发器
  1 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.

测试数据
--linux的sqlplus插入
zx@ORCL>insert into orders values(1,'zx');
 
1 row created.
 
zx@ORCL>commit;
 
Commit complete.
--windows的sqlplus插入
SQL> insert into orders values(2,'wl');
 
已创建 1 行。
 
SQL> commit;
 
提交完成。
--plsql插入
INSERT INTO orders VALUES(3,'yhz');
COMMIT;
--使用sys用户插入
zx@ORCL>conn / as sysdba
Connected.
sys@ORCL>insert into zx.orders values(4,'wj');
 
1 row created.
 
sys@ORCL>commit;
 
Commit complete.
--更新数据
zx@ORCL>update orders set order_id=10 where order_id=1;
 
1 row updated.
 
zx@ORCL>commit;
 
Commit complete.
--删除数据
zx@ORCL>delete from orders where order_idcommit;
 
Commit complete.

查看记录表中的记录
--测试表记录
zx@ORCL>select * from orders;
 
  ORDER_ID ORDER_NAME
---------- ------------------------------
        3 yhz
        10 zx
        4 wj
--审计表记录
SQL> col username for a10
SQL> col hostname for a20
SQL> alter session set nls_date_format='yyyymmdd hh24:mi:ss';
 
会话已更改。
 
SQL> set linesize 200
SQL> select * from audit_orders;
 
ORDERID_NEW ORDERID_OLD USERNAME  OPT_DATE        OPT_TYPE        TERMINAL                  SESSION_ID HOSTNAME
----------- ----------- ---------- ----------------- -------------------- ---------------------------------------- ---------- --------------------
      3      ZX    20170104 21:32:46 INSERT          VICTOR-PC                      10 WORKGROUPVICTOR-PC
      1      ZX    20170104 21:30:32 INSERT          pts/0                    24 rhel6
      2      ZX    20170104 21:31:47 INSERT          VICTOR-PC                    146 WORKGROUPVICTOR-PC
      4      SYS    20170104 21:33:52 INSERT          pts/0                    24 rhel6
    10          1 ZX      20170104 21:37:26 UPDATE          pts/0                    24 rhel6
              2 ZX      20170104 21:37:50 DELETE          pts/0                    24 rhel6
 
已选择 6 行。

审计表记录了所有的DML操作,可以用于审计哪些用户对表做了哪些操作。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下不使用sudo命令执行docker的操作步骤
  • [请置顶]关于Linux的安装使用问题 请放到 软件使用/操作系统 里提问
  • 在Python3中使用urllib实现http的get和post提交数据操作
  • 请教,如何使用JDOM操作XML文档?
  • TinyXML(c++下操作xml的库)介绍,下载地址及使用代码举例
  • 紧急:请问有谁会使用Free BSD操作系统,请给予指点
  • c++ stl multimap基本操作使用技巧详细介绍
  • linux下使用tcl操作excel
  • ftp协议介绍及ftp常用的上传下载等操作命令使用方法
  • 说说你使用的操作系统
  • windows7操作系统介绍及各种使用技巧总结
  • 急问:!!如何使用shell作如下操作?
  • 操作系统的使用的处理死锁的算法
  • 有谁知道linux操作系统察看cpu使用率的命令,回答正确给高分,急,在线等待!!!
  • 有谁告诉我如何使用main中的args进行输入输出的操作?
  • 有没有使用最新内核的占用空间较小的linux操作系统
  • 只使用InputStream/OutputStream进行IO操作行吗?
  • 在用户态如何使用原子操作?
  • jquery链式操作的正确使用方法
  • 如何用ANSI C来获取操作系统文件系统使用率?
  • 在unix上如何使用磁带机,相关命令有那些,操作系统版本为aix 4.3
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3