数据库的触发器

触发器定义:
触发器在数据库中独立于对象存储,与统计函数和存储过程需要用户主动调用不同,由事件驱动且自动隐式运行,触发器不接受参数。
分为语句及触发器(表级触发器)或行级触发器;

DML:SELECT、UPDATE、INSERT、DELETE(主要作用于对数据库中数据的增删查改的操作)
DDL:CREATE、ALTER、DROP等(主要作用于定义或改变数据表结构,数据类型与数据表之间的连接或约束等初始化工作,多用于建表和初始化)

语句级触发器对每个DML语句只执行一次

实例
CREATE OR REPLACE TRIGGER2019/4/13 13:16:55 emp_trigger
--设置触发条件
BEFORE INSERT OR DELETE
--设置具体某个字段上触发
--(BEFORE UPDATE OF sal,comm)
--设置触发器作用位置
ON emp
--声明变量
DECLARE
v_date VARCHAR2(50);
v_hour VARCHAR2(50);
BEGIN
SELECT TO_CHAR(SYSDATE,'day'),TO_CHAR(SYSDATE,'hh') INTO v_date,v_hour FROM dual;
IF v_date='星期六' OR v_date='星期日' THEN
--抛出错误
RAISE_APPLICATION_ERROR(-20001,'周末不能办理离职手续');
--(内部的编号可是-20000~-100000之间自行定义)
ELSIF v_hour<8 OR v_hour>18 THEN
RAISE_APPLICATION_ERROR(-20002,'非工作时段不能办理离职手续');

END IF;
END;
/

行级触发器对DML语句而言,只要有一条数据被影响就会被触发一次
:new 和 :old 使用方法和意义:
:new 只出现在 INSERT 和 UPDATE,而 :old 只出现在 UPDATE 和 DELETE 中。new代表新新增的数据而old代表原先的数据

实例:
CREATE OR REPLACE TRIGGER emp_trigger
BEFORE INSERT
ON emp
--表示该触发器是行级触发器
FOR EACH ROW
BEGIN
IF :new.sal > 5000 OR :new.sal < 1000 THEN
RAISE_APPLICATION_ERROR( -20001 , ' 薪资不在规定范围 ' );
END IF;
END;
/

可通过行级触发器是 UPDATE 的级联操作
CREATE OR REPLACE TRIGGER dept_trigger
BEFORE UPDATE OF deptno
ON dept
FOR EACH ROW
BEGIN
UPDATE emp SET deptno = :new.deptno WHERE deptno = :old.deptno ;
END;
/

原文地址:https://www.cnblogs.com/hasagi/p/10719191.html