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