oracle触发器记录所有dml,使用Trigger审计一张表的DML操作

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

-------------------------------------------------------------------------------------------------------------------------------------------

3ZX2017010421:32:46INSERTVICTOR-PC10WORKGROUP\VICTOR-PC

1ZX2017010421:30:32INSERTpts/024rhel6

2ZX2017010421:31:47INSERTVICTOR-PC146WORKGROUP\VICTOR-PC

4SYS2017010421:33:52INSERTpts/024rhel6

101ZX2017010421:37:26UPDATEpts/024rhel6

2ZX2017010421:37:50DELETEpts/024rhel6

已选择6行。

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

参考:

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值