触发器的简介
触发器类似过程和函数,都具有程序主题部分 (声明段\可执行段\异常处理段),但是与手工调用过程或函数不同的是,所有触发器都是依靠事件执行的, 例如:当对于某一张表执行更新操作 (INSERT, UPDATE, DELETE) 时,都可能引起触发器的执行。同时过程或函数都是显示调用的,所以其是可以接收参数的,但触发器由于采用的是隐式调用 (一触即发某类操作时调用),所以是不能够接收参数的。
在 Oracle 之中触发器主要分为: DML 触发器, INSTEAD-OF (替代) 触发器, DDL 触发器,系统或数据库时间触发器。所有的触发器都可以使用如下的基本语法进行创建。
触发器创建语法
CREATE [OR REPLACE] TRIGGER 触发器名称
[BEFORE | AFTER] -> 触发时间
[INSETEAD OF]
[INSERT | UPDATE | UPDATE OF 列名称 [,列名称,...] |DELETE] ->触发事件
ON [表名称 | 视图 | DATABASE | SCHEMA] ->触发对象
[REFERENCING [OLD AS 标记] [NEW AS 标记] [parent AS 标记]]
[FOR EACH ROW] ->触发频率
[FLLOWS 触发器名称]
[DISABLE]
[WHEN 触发条件] ->触发条件
[DECLARE] ->触发操作(程序主体)
[程序声明部分;]
[PRAGMA AUTONOMOUS_TRANSACTION;]
BEGIN
程序代码部分;
END [触发器名称];
/
触发器说明
在编写触发器过程之中应该注意以下几点:
1、触发器不接受任何的参数,并且只能是在产生了某一触发时间之后才会自动调用;
2、针对于一张数据表的触发器,最多只能有12个;
BEFORE INSERT , BEFORE INSERT FOR EACH ROW , AFTER INSERT , AFTER INSERT FOR EACH ROW ,
BEFORE UPDATE , BEFORE UPDATE FOR EACH ROW , AFTER UPDATE , AFTER UPDATE FOR EACH ROW ,
BEFORE DELETE , BEFORE DELETE FOR EACH ROW , AFTER DELETE, AFTER DELETE FRO EACH ROW
3、同一种类型触发器,只能够定义一次;
4、一个触发器最大为32K,所以如果要编写的代码较多,可以通过过程或函数调用完成;
5、默认情况下,触发器之中是不能使用事务处理操作,或者采用自治事务进行处理;
6、在一张数据表之中,如果定义过多的触发器,则会造成DML性能的下降;
触发器的管理
查看触发器
所有的数据库对象一定会在数据字典之中进行查询,对于触发器,用户同样可以使用三个数据字典查看信息:
USER_TRIGGERS 、 ALL_TRIGGERS 、 DBA_TRIGGERS
禁用/启用触发器
当触发器创建之后的默认状态为启用,如果要修改触发器的操作状态,可以使用如下的语法操作。
ALTER TRIGGER 触发器名称 [DISABLE | ENABLE];
在修改触发器时提供了两种触发器的操作状态:
ENABLE(有效状态):当触发事件发生时,处于有效状态的数据库触发器将被触发;
DISABLE(无效状态):当触发事件发生时,处于无效状态的数据库触发器TRIGGER将不被触发,相当于触发器不存在。
禁用/启用一张表的全部触发器
ALTER TABLE [SCHEMA.] 表名 [ENABLE |DISABLE] ALL TRIGGERS;
删除触发器
DROP TRIGGER 触发器名称;