PLSQL入门与精通(第70章:复合触发器的例子:操作其他表)

上次解说了DDL触发器。

DDL触发器是通过DDL文(CREATE、ALTER、DROP)启动的触发器,
在触发器中,可以使用事件属性函数(ora_xxxx)获取DDL的事件和DDL操作的对象的信息的详细内容。

上次介绍的例子是:为了防止误删除SCOTT.EMP表DDL触发器的例子。
如果存在该触发器,SCOTT.EMP表就不会被删除。

这次介绍一下DDL触发器的另外一个例子。

这次在DDL触发器中可以操作其他的一张表。

具体来说,就是在日志表中插入 DDL操作的历史记录。

例如,谁、什么时候、哪个用户、操作的什么类型的对象、对象名字、执行的是什么操作(CREATE的、或者是ALTER的、还是DROP),
这些记录都会留在日志表中。

这样,即使不小心误操作删除了某个对象,也可以追查记录,确认是谁做了什么样的操作。

我们先创建一个日志表。

SQL> SHOW USER
用户是“SYSTEM”。

当前会话是数据库管理员SYSTEM用户的会话。

创建以下日志表:

CREATE TABLE LOG_DDL
(COL_SYSDATE DATE,–操作日期
COL_EVENT VARCHAR2(20),–操作(CREATE,ALTER,DROP)
COL_USER VARCHAR2(30),–操作者
COL_OWNER VARCHAR2(30),–对象所有者
COL_OBJ_TYPE VARCHAR2(20),–对象类型
COL_OBJ_NAME VARCHAR2(30)–对象名称
)

/

表创建成功。

下面创建以下DDL触发器。
1 CREATE OR REPLACE TRIGGER TEST_DDL_TRIG2
2 BEFORE CREATE OR ALTER OR DROP
3 ON DATABASE
4 DECLARE
5 V_SYSEVENT VARCHAR2(200);
6 V_DICT_OBJ_OWNER VARCHAR2(30);
7 V_DICT_OBJ_NAME VARCHAR2(30);
8 V_DICT_OBJ_TYPE VARCHAR2(20);
9 V_MESSAGE VARCHAR2(200);
10 BEGIN
11 /** 获取活动 ***/
12 V_SYSEVENT := ora_sysevent;

13 /** 获得对象所有者 **/
14 V_DICT_OBJ_OWNER := ora_dict_obj_owner;

15 /** 获取对象名称 **/
16 V_DICT_OBJ_NAME := ora_dict_obj_name;

17 /** 获取对象类型 **/
18 V_DICT_OBJ_TYPE := ora_dict_obj_type;

19 /** 插入LOG表历史操作记录 **/
20 INSERT INTO LOG_DDL
21 (
22 COL_SYSDATE,
23 COL_EVENT,
24 COL_USER,
25 COL_OWNER,
26 COL_OBJ_TYPE,
27 COL_OBJ_NAME)
28 VALUES
29 (
30 SYSDATE,
31 V_SYSEVENT,
32 USER ,
33 V_DICT_OBJ_OWNER,
34 V_DICT_OBJ_TYPE,
35 V_DICT_OBJ_NAME);
36 END ;
/

触发器已创建。

●第2行(BEFORE CREATE OR ALTEROR DROP)表示该触发BEFORE触发器,时间是CREATE、ALTER、DROP中任意一个。
●第3行(ON DATABASE)不是“ON SCHEMA”,而是“ON DATABASE”,表示该触发对任何用户下的对象都会被启动。
●在第5行到第9行:定义变量
●在第11行至第18行:将事件的属性的值赋给这些变量
●从第20行到第35:INSERT语句,把这些操作相关的变量值插入到日志表中。

我们验证一下吧。

首先,当前会话是SYSTEM用户,创建SCOTT用户下的表。

CREATE TABLE SCOTT.TEST99 ( DUMMY NUMBER);

表创建成功。

我们再删除这张表。

DROP TABLE SCOTT.TEST99 PURGE;

表已删除。

这样,上述的CREATE和DROP的操作记录应该被插入到日志表中了。
我们查询一下日志表吧。

首先我们修改一下DATE类型的格式,改成我们能理解的时间格式。

ALTER SESSION SET NLS_DATE_FORMAT = ‘YY/MM/DD HH24:MI:SS’ ;

会话已更改。

然后查询日志表。

SELECT
COL_SYSDATE,
COL_EVENT AS EVENT,
COL_USER AS OPER,
COL_OWNER AS OWNER,
COL_OBJ_TYPE AS TYPE,
COL_OBJ_NAME AS NAME
FROM
LOG_DDL
/

COL_SYSDATE EVENT OPER OWNER TYPE NAME


21/03/26 22:46:41 CREATE SYSTEM SCOTT TABLE TEST99
21/03/26 22:48:16 DROP SYSTEM SCOTT TABLE TEST99

根据日志表的记录内容,我们就会知道:
在21/03/26 22:46:41,SYSTEM用户创建了SCOTT.TEST99表
之后在21/03/26 22:46:48的时候又把这个表删除了。

这个例子在做审计的时候,很有现实意义,可以保留任何操作历史记录。

这就是本次的例子,下次继续介绍其他类型的触发器。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值