触发器类似于过程和函数,都具有程序主体部分(声明段、可执行段、异常处理段),但是与手工调用过程或函数不同的是,所有触发器都是依靠事件执行的。
DML触发器主要由DML语句进行出发,当用户执行了增加(INSERT)、修改(UPDATE)、DELETE(删除)操作的时候,就会触发操作。
CREATE [OR REPLACE] TRIGGER 触发器名称[BEFORE | AFTER][INSERT | UPDATE | UPDATE OF 列名称 [,列名称,…] | DELETE] ON 表名称[FOR EACH ROW][DISABLE][WHEN 触发条件][DECLARE][程序声明部分 ;]BEGIN程序代码部分 ;END [触发器名称] ;
触发器的执行顺序:
BEFORE表级触发器执行;
BEFORE行级触发器执行;
执行更新操作;
AFTER行级触发器执行;
AFTER表级触发器执行。
建立触发器是在之后进行DML操作时候才能看到作用。
表级触发器
例1
CREATE OR REPLACE TRIGGER forbid_emp_trigger
BEFORE INSERT OR DELETE
ON emp
DECLARE
v_currentdate VARCHAR(20) ;
BEGIN
SELECT TO_CHAR(SYSDATE,‘dd’) INTO v_currentdate FROM dual ;
IF TRIM(v_currentdate)!=‘10’ THEN
RAISE_APPLICATION_ERROR(-20008,‘在每月的10号才允许办理入职手续!’) ;
END IF ;
END ;
/
insert into emp (empno,ename)values(1111,‘zz’);
行级触发器
CREATE OR REPLACE TRIGGER emp_update_trigger
BEFORE UPDATE OF sal
ON emp
FOR EACH ROW
BEGIN
IF ABS((:new.sal-:old.sal)/:old.sal) > 0.1 THEN
RAISE_APPLICATION_ERROR(-20008,‘雇员工资修改幅度太大!’) ;
END IF ;
END;
/
update emp set sal=6000;