前言:
一般PL/SQL块,当执行完成后,就消失了;下次执行时,还需要再次编写。因此人们希望能够将PL/SQL块存储在数据
库中,并且可以多次执行,在这种需求的驱动下出现了有名PL/SQL块(也叫做非匿名块)。非匿名PL/SQL块分为:存储过程、
函数、触发器。本文详细介绍触发器的使用。
一、触发器结构
1、触发器(trigger):
1>是一个有名PL/SQL块。
2>存储在数据库中
3>无需手动执行,只要触发事件发生,就自动会执行。一般用于数据完整性和审核等操作
2、触发器的组成:
create or replace trigger triger_name
trigger_time //触发时机
trigger_event //触发事件
on trigger_object //触发对象
[WHEN 触发条件] //可选
[for each row] //可选,定义是否为行级触发器
PL/SQL块 | call procdure_name;
二、触发时机 ----触发器何时执行
1、前触发(before) : 触发动作发生在触发事件执行之前。
2、后触发(after): 触发动作发生在触发事件执行之后。
3、替代触发(instead of):用触发提替代触发事件
三、触发事件 -----触发器必须由事件才能触发
1、DML事件 (INSERT,UPDATE,DELETE)
2、DDL事件 (CREATE,ALTER,DROP,RENAME,TRUNCATE)
3、DB事件 (STARTUP,SHUTDOWN,LOGON,LOGOFF,SERVERERROR)
四、触发对象
1、表 :触发器定义在表上
2、模式(schema) :触发器定义在模式上
3、视图 :触发器定义在视图上
4、数据库:触发器定义在数据库上
五、触发器种类
1、DML触发器:定义在表上,由DML事件引发的触发器
2、替代触发器(INSTEAD OF):定义在视图上,用来替换对视图进行的插入、删除和修改操作。
3、系统事件触发器:定义在整个数据库或模式上,由系统事件引发的触发器。系统事件包括DDL事件,DB事件。
说明:为了编写方便,这里将系统事件触发器又分为如下两小类:
1)DDL触发器:定义在整个数据库或模式上,由DDL事件引发的触发器(这里的事件包括了garnt,revoke事件,这里算是ORACLE 一个小BUG)
2)DB触发器:定义在整个数据库上,由DB事件引发的触发器
六、触发级别
1、行级触发(for each row): 每一行都触发一次。比如,update更新了100行数据,行级触发器触发100次。
2、语句级触发: 整个语句级别只触发一次。比如,update更新了100行数据,语句级触发器只触发一次。
七、触发器限制
1、如果有多个触发器被定义成为相同时间、相同事件触发,且最后定义的触发器是有效的,则最后定义的触发器被触发,其他触发器不执行。
2、一个触发器可由多个不同的DML事件触发。
3、在触发器中,可用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。这些谓词可以在IF分支条件语句中作为判断条件来使用。
4、在行级触发器中,用:new 和:old(称为伪记录)来访问数据变更前后的值。
1)INSERT语句插入一条新记录,所以没有:old记录
2)DELETE语句删除掉一条已经存在的记录,所以没有:new记录。
3)UPDATE语句既有:old记录,也有:new记录,分别代表修改前后的记录。
4)引用具体的某一列的值的方法是: :new.字段名
5、触发器体内禁止使用COMMIT、ROLLBACK、SAVEPOINT语句,也禁止直接或间接地调用含有上述语句的存储过程和函数。因为
触发器是和触发事件在一个事务中,它随着触发事件的提交而提交,回滚而回滚。
6、CREATE TRIGGER语句文本的字符长度不能超过32KB;
7、触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句。
8、触发器中不能使用LONG, LONG RAW 类型;
9、触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据;
八、DML触发器的要点
1、确定触发的表;即在其上定义触发器的表。
2、确定触发的事件;INSERT、UPDATE和DELETE
3、确定触发时间;BEFORE和AFTER两种,分别表示触发动作发生在DML语句执行之前和语句执行之后。
4、确定触发级别;是语句级触发器和行级触发器两种。
语句级触发器表示SQL语句只触发一次触发器,行级触发器表示SQL语句影响的每一行都要触发一次
九、触发器操作
1、创建触发器:
create or replace trigger triger_name
trigger_time //触发时机
trigger_event //触发事件
on trigger_object //触发对象
WHEN 触发条件 //可选
[for each row] //可选,定义是否为行级触发器
declare
...
begin
...
exception
...
end; |call procedure_name;
2、删除触发器:
--触发器的创建者或具有DROP ANY TIRGGER系统权限的人才能删除触发器
DROP TIRGGER trigger_name;
3、改变触发器状态:
ALTER TRIGGER trigger_name {DISABLE|ENABLE}
其中,DISABLE表示使触发器失效,ENABLE表示使触发器生效。
4、触发器错误查看:
show errors
5、重新编译触发器:
alter trigger trigger_name compile;
6、查看触发器信息:
select * from dba_triggers;
select * from user_triggers;
阅读(222) | 评论(0) | 转发(0) |