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

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

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

平台11.2.0.4

[email protected]>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

[email protected]>create table ORDERS
  2  (
  3    order_id   NUMBER,
  4    order_name VARCHAR2(10)
  5  );

Table created.

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

[email protected]>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.

创建触发器

[email protected]>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插入
[email protected]>insert into orders values(1,‘zx‘);

1 row created.

[email protected]>commit;

Commit complete.
--windows的sqlplus插入
SQL> insert into orders values(2,‘wl‘);

已创建 1 行。

SQL> commit;

提交完成。
--plsql插入
INSERT INTO orders VALUES(3,‘yhz‘);
COMMIT;
--使用sys用户插入
[email protected]>conn / as sysdba
Connected.
[email protected]>insert into zx.orders values(4,‘wj‘);

1 row created.

[email protected]>commit;

Commit complete.
--更新数据
[email protected]>update orders set order_id=10 where order_id=1;

1 row updated.

[email protected]>commit;

Commit complete.
--删除数据
[email protected]>delete from orders where order_id<3;

1 row deleted.

[email protected]>commit;

Commit complete.

查看记录表中的记录

--测试表记录
[email protected]>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 WORKGROUP\VICTOR-PC
	  1		ZX	   20170104 21:30:32 INSERT		  pts/0 					   24 rhel6
	  2		ZX	   20170104 21:31:47 INSERT		  VICTOR-PC					  146 WORKGROUP\VICTOR-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操作,可以用于审计哪些用户对表做了哪些操作。

参考:

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

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

时间: 2024-10-25 05:35:23

使用Trigger审计一张表的DML操作的相关文章

Spring控制多张表的提交事务操作

一.Spring配置文件如下: <bean id="test" class="org.apache.commons.dbcp.BasicDataSource">  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />  <property name="url"   value=&q

salesforce零基础学习(七十一)级联表DML操作

曾经做项目没有考虑那么多,对于级联表操作都是正常的一步一步操作,没有考虑过失败情况,最近项目遇见了失败的情况,导致碰到了相应的情况,特此mark一下,免得后期继续踩坑. 需求如下:新建页面,页面中包含1.新建企业,2.新建联系人,3.新建机会.任何一步的逻辑或者DML操作失败都会导致整体的回滚.只有当三步都正常插入成功了以后才会跳转到新生成的机会的标准页面. 1.NewOpportunityController:这里做了一个逻辑判断,当联系人为空情况下,不允许新建联系人.当然,现实场景不会在这里

MySQL实例多库某张表数据文件损坏导致xxx库无法访问故障恢复

一.问题发现 命令行进入数据库实例手动给某张表进行alter操作,发现如下报错. mysql> use xx_xxx; No connection. Trying to reconnect... Connection id: 5 Current database: *** NONE *** Reading table information for completion of table and column names You can turn off this feature to get

禁止用户对自己表的DDL操作

刚翻阅资料,查到一个数据库管理的小技巧,可以禁止用户对自己schema下的表进行DDL操作,原理是禁用表上的锁. SQL> alter table t1 disable table lock; Table altered. SQL> drop table t1 purge; drop table t1 purge * ERROR at line 1: ORA-00069: cannot acquire lock -- table locks disabled for T1 同时不影响该表的DM

Oracle中开启一张表的审计

Oracle使用audit_trail参数控制审计是否启用 audit_trail的参数有下面几种: NONE:不开启审计 OS:说明审计信息放在系统汇总,如果是Linux那么由audit_file_dest决定,如果是Windows 那么由事件查看器决定 DB 或 TRUE :表示审计信息存放在数据库里,也就是sys 用户的aud$ 表. audit_sys_operations参数的含义: false:不审计sys用户,默认不审计 true:审计sys用户 审计范围分为session 和 a

inserted触发器,一张表插入数据时,同时向另外一张表插入数据

有时候,一个服务器上有多个数据库,需要向其中一个数据库的表中插入数据时, 同时向另外一个数据的表里插入数据. 可以利用触发器和同义词(建立同义词的方法省略), 在一个数据库的表里插入数据时,同时向另外一个数据库的表里插入数据. 触发器代码如下: create trigger userInsertTrigger on [user] for insert as begin begin insert into usertab(UserID,UserAccount,UserPassword,UserNa

一张表保存一个无限级树形目录

一张表保存一个无限级树形目录: /****** Object: Table [dbo].[TreeMenue] Script Date: 08/20/2014 18:03:00 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[TreeMenue]( [ID] [int] IDENTITY(1,1) NOT NULL, [MenueName] [v

quartz 持久化12张表

quartz 持久化数据库表格字段解释建表,SQL语句在dbTables文件夹中可以找到,介绍下主要的几张表:  QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息 QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括Cron表达式和时区信息 QRTZ_FIRED_TRIGGERS 存储与已触发的 Trigger 相关的状态信息,以及相联 Job的执行信息QRTZ_PAUSED_TRIGGER_GRPS 存储已暂停的 Trigge

SQL根据现有表新建一张表

SQL根据现有表新建表,新建的这张表结构要跟现有表结构相同,但不要现有表里面的数据! 执行DML语句依据数据库类型而定: SQLITE -----复制表结构及数据到新表 CREATE TABLE TABLE_NEW AS SELECT * FROM TABLE_OLD; -----只复制表结构到新表 CREATE TABLE TABLE_NEW AS SELECT * FROM TABLE_OLD WHERE 1=0; ORACLE: -----复制表结构及数据到新表 CREATE TABLE