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

前端之家收集整理的这篇文章主要介绍了使用Trigger审计一张表的DML操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近ogg的灾备端复制进程中的一张表老是报错ORA-04031,但是又查不到原因,于是想用审计的方法来看到底这张表是被谁做了DML操作,把数据搞没了。本来想用数据库自带的审计功能参考:http://www.jb51.cc/article/p-zchlscoj-xe.html

但是需要重启数据库,就放弃了,上网查资料看到有人用触发器来实现这个功能,于是自己也做了尝试。

平台11.2.0.4

  1. sys@ORCL>select*fromv$version;
  2.  
  3. BANNER
  4. -------------------------------------------------------------------------------------
  5. OracleDatabase11gEnterpriseEditionRelease11.2.0.4.0-64bitProduction
  6. PL/sqlRelease11.2.0.4.0-Production
  7. CORE11.2.0.4.0Production
  8. TNSforLinux:Version11.2.0.4.0-Production
  9. NLSRTLVersion11.2.0.4.0-Production

创建测试表Orders

  1. zx@ORCL>createtableORDERS
  2. 2(
  3. 3order_idNUMBER,4order_nameVARCHAR2(10)
  4. 5);
  5.  
  6. Tablecreated.

创建用于记录DML操作记录的表

  1. zx@ORCL>createtableAUDIT_ORDERS
  2. 2(
  3. 3orderid_newNUMBER(38),4orderid_oldNUMBER(38),5usernameVARCHAR2(30),6opt_dateDATE,7opt_typeVARCHAR2(10),8terminalVARCHAR2(20),9session_idNUMBER(10),10hostnameVARCHAR2(20)
  4. 11);
  5.  
  6. Tablecreated.

创建触发器

  1. zx@ORCL>CREATEORREPLACETRIGGERTRI_AUDIT_ORDERS
  2. 2BEFOREINSERTORUPDATEORDELETEONORDERS
  3. 3FOREACHROW
  4. 4BEGIN
  5. 5IFINSERTINGTHEN
  6. 6INSERTINTOAUDIT_ORDERS
  7. 7VALUES
  8. 8(:NEW.ORDER_ID,9:OLD.ORDER_ID,10USER,11SYSDATE,--记录操作的时间
  9. 12'INSERT',13SYS_CONTEXT('USERENV','TERMINAL'),--记录操作来源的终端信息
  10. 14USERENV('SID'),--记录操作的SID
  11. 15SYS_CONTEXT('USERENV','HOST'));--记录操作的主机名
  12. 16ELSIFUPDATINGTHEN
  13. 17INSERTINTOAUDIT_ORDERS
  14. 18VALUES
  15. 19(:NEW.ORDER_ID,20:OLD.ORDER_ID,21USER,22SYSDATE,23'UPDATE',24SYS_CONTEXT('USERENV',25USERENV('SID'),26SYS_CONTEXT('USERENV','HOST'));
  16. 27ELSIFDELETINGTHEN
  17. 28INSERTINTOAUDIT_ORDERS
  18. 29VALUES
  19. 30(:NEW.ORDER_ID,31:OLD.ORDER_ID,32USER,33SYSDATE,34'DELETE',35SYS_CONTEXT('USERENV',36USERENV('SID'),37SYS_CONTEXT('USERENV','HOST'));
  20. 38ENDIF;
  21. 39END;
  22. 40/
  23.  
  24. Triggercreated.

测试数据

  1. --linuxsqlplus插入
  2. zx@ORCL>insertintoordersvalues(1,'zx');
  3.  
  4. 1rowcreated.
  5.  
  6. zx@ORCL>commit;
  7.  
  8. Commitcomplete.
  9. --windowssqlplus插入
  10. sql>insertintoordersvalues(2,'wl');
  11.  
  12. 已创建1行。
  13.  
  14. sql>commit;
  15.  
  16. 提交完成。
  17. --plsql插入
  18. INSERTINTOordersVALUES(3,'yhz');
  19. COMMIT;
  20. --使用sys用户插入
  21. zx@ORCL>conn/assysdba
  22. Connected.
  23. sys@ORCL>insertintozx.ordersvalues(4,'wj');
  24.  
  25. 1rowcreated.
  26.  
  27. sys@ORCL>commit;
  28.  
  29. Commitcomplete.
  30. --更新数据
  31. zx@ORCL>updateordeRSSetorder_id=10whereorder_id=1;
  32.  
  33. 1rowupdated.
  34.  
  35. zx@ORCL>commit;
  36.  
  37. Commitcomplete.
  38. --删除数据
  39. zx@ORCL>deletefromorderswhereorder_id<3;
  40.  
  41. 1rowdeleted.
  42.  
  43. zx@ORCL>commit;
  44.  
  45. Commitcomplete.

查看记录表中的记录

  1. --测试表记录
  2. zx@ORCL>select*fromorders;
  3.  
  4. ORDER_IDORDER_NAME
  5. ----------------------------------------
  6. 3yhz
  7. 10zx
  8. 4wj
  9. --审计表记录
  10. sql>colusernamefora10
  11. sql>colhostnamefora20
  12. sql>altersessionsetnls_date_format='yyyymmddhh24:mi:ss';
  13.  
  14. 会话已更改。
  15.  
  16. sql>setlinesize200
  17. sql>select*fromaudit_orders;
  18.  
  19. ORDERID_NEWORDERID_OLDUSERNAMEOPT_DATE OPT_TYPE TERMINAL SESSION_IDHOSTNAME
  20. -------------------------------------------------------------------------------------------------------------------------------------------
  21. 3 ZX 2017010421:32:46INSERT VICTOR-PC 10WORKGROUP\VICTOR-PC
  22. 1 ZX 2017010421:30:32INSERT pts/0 24rhel6
  23. 2 ZX 2017010421:31:47INSERT VICTOR-PC 146WORKGROUP\VICTOR-PC
  24. 4 SYS 2017010421:33:52INSERT pts/0 24rhel6
  25. 10 1ZX 2017010421:37:26UPDATE pts/0 24rhel6
  26. 2ZX 2017010421:37:50DELETE pts/0 24rhel6
  27.  
  28. 已选择6行。

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

参考:

http://www.cnblogs.com/wanglibo/articles/2121098.html

http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html

猜你在找的Oracle相关文章