TRIGGER触发器
1、TRIGGER与过程/函数类似
都是带有名字的执行块
都有声明,执行体和异常处理部分
2、TRIGGER与过程/函数的差别
TRIGGER必须存储在数据库中
对于过程和函数必须显示地由另一个运行块调用。对于TRIGGER,是由触发事件自动激发。触发事件是在数据库表上执行的DML(INSERT ,UPDATE , DELETE) 数据操作。
创建TRIGGER
1、语法
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE|AFTER}triggering_event ON table_reference
[FOR EACH ROW [WHEN trigger_condition]]
trigger_body;
2必须的部分
触发器名:trigger_name;
触发事件:triggering_event;
触发器主体:trigger_body
3、可选部分
WHEN 子句
例子:
--AFTER
CREATE OR REPLACE TRIGGER trg_emp
AFTER INSERT OR UPDATE OR DELETE ON s_emp
DECLARE
v_cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO v_cnt
FROM s_emp
DBMS_OUTPUT.PUT_LINE(v_cnt||' rows in s_emp');
END
--BEFORE
CREATE OR REPLACE TRIGGER trg_emp
BEFORE INSERT OR UPDATE OR DELETE ON s_emp
BEGIN
DBMS_OUTPUT.PUT_LINE('this trigger is before ...');
END
触发器激发的顺序
1、如果存在,执行语句级别之前的触发器
2、对于受语句影响的每一行:
语句存在,执行级别之前的触发器
执行语句本身,
如果存在,执行行级别之后的触发器
3、如果存在,执行语句级别之后的触发器。
触发器的限制
1、触发器的主体是PL/SQL语句块
2、所有能出现在PL/SQL块中的语句在触发器主体中都是合法的限制
不应该使用事务控制语句COMMIT,ROOLBACK ,SAVEPOINT
由触发器调用的任何过程于函数都不能使用事务控制语句
不能声明任何LONG或LONG RAW变量
可以访问的表有限