11.2.7 DDL类型触发器

所谓DDL类型触发器,就是因DDL操作而激发的触发器,主要包括CREATE、ALTER、DROP等事件,更多的操作可以查看11.1.4小节语法部分。

利用DDL类型的触发器可以限制和记录特定的DDL操作。例如,通过DDL触发器可以限制对数据库结构的修改,记录数据库中的更改事件,也可以在修改对象的时候根据实际情况做出其他相应动作。下面通过一个示例演示如何创建和使用该类型的触发器。

【示例12】使用DDL类型触发器

该触发器将提示CREATE创建操作,如果有人执行TEST表的删除操作,将提示错误,也不允许对表使用ALTER操作和RENAME操作。具体脚本如下:


01 CREATE TRIGGER DDL_TGR

02 BEFORE CREATE OR ALTER OR DROP OR RENAME ON SCHEMA

03 BEGIN

04 IF SYSEVENT='CREATE'THEN

05 DBMS_OUTPUT.PUT_LINE(DICTIONARY_OBJ_NAME||'创建中…');

06 ELSIF SYSEVENT='DROP'THEN

07 IF DICTIONARY_OBJ_NAME='TEST'THEN

08 RAISE_APPLICATION_ERROR(-20000,'不允许删除TEST表!');

09 END IF;

10 ELSIF SYSEVENT='ALTER'THEN

11 RAISE_APPLICATION_ERROR(-20000,'不允许修改表!');

12 ELSIF SYSEVENT='RENAME'THEN

13 RAISE_APPLICATION_ERROR(-20000,'不允许修改表名称!');

14 END IF;

15 END;

16 /


【代码解析】

❑第1~2行表示在模式上创建名为DDL_TGR的触发器,触发器事件为CREATE、ALTER、DROP、RENAME。

❑第4~5行表示利用SYSEVENT事件属性得到当前的DDL操作并进行判断。如果为CREATE事件,则输出信息。

❑第7行表示利用DICTIONARY_OBJ_NAME事件属性得到并判断删除的表名是否是TEST,如果条件为TRUE,则提示出错。

❑第10~14行利用同样的方式进行判断。

【执行效果】

在SQL*Plus下执行脚本,如果成功,则提示如下:


触发器已创建


【验证触发器】

以上步骤操作完成,对表TEST执行重命名操作。SQL脚本如下:


RENAME TEST TO TEST;


执行效果如图11.15所示。

11.2.7 DDL类型触发器 - 图1

图 11.15 DDL触发器验证

示例中只用了一种验证方式,感兴趣的读者可以试着使用其他3种方式验证。这里面使用了事件属性,它们是SYS拥有的独立函数。利用事件属性可以获取触发事件的信息。下面列出常用的几种事件属性,如表11.4所示。

11.2.7 DDL类型触发器 - 图2