使用Trigger审计一张表的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_DATE	OPT_TYPE		TERMINAL				SESSION_IDHOSTNAME
-------------------------------------------------------------------------------------------------------------------------------------------
	3		ZX	2017010421:32:46INSERT		VICTOR-PC					10WORKGROUP\VICTOR-PC
	1		ZX	2017010421:30:32INSERT		pts/0					24rhel6
	2		ZX	2017010421:31:47INSERT		VICTOR-PC					146WORKGROUP\VICTOR-PC
	4		SYS	2017010421:33:52INSERT		pts/0					24rhel6
	10	1ZX	2017010421:37:26UPDATE		pts/0					24rhel6
		2ZX	2017010421:37:50DELETE		pts/0					24rhel6

已选择6行。

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

参考:

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

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

猜你在找的Oracle相关文章