加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 15:29:44 所属栏目:百科 来源:网络整理
导读:最近ogg的灾备端复制进程中的一张表老是报错ORA-04031,但是又查不到原因,于是想用审计的方法来看到底这张表是被谁做了DML操作,把数据搞没了。本来想用数据库自带的审计功能参考:http://www.jb51.cc/article/p-zchlscoj-xe.html 但是需要重启数据库,就放

最近ogg的灾备端复制进程中的一张表老是报错ORA-04031,但是又查不到原因,于是想用审计的方法来看到底这张表是被谁做了DML操作,把数据搞没了。本来想用数据库自带的审计功能参考:http://www.52php.cn/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					10WORKGROUPVICTOR-PC
	1		ZX	2017010421:30:32INSERT		pts/0					24rhel6
	2		ZX	2017010421:31:47INSERT		VICTOR-PC					146WORKGROUPVICTOR-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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读