Oracle之触发器的创建与使用
从上面概念上来看,首先触发器是在表关联基础上的,所以得与表关联也就是下面语句的on emp,再有它是存储的plsql程序,也就是下面的begin end 程序,每当增删改操作时,这个操作分操作前后,也就是下面的after insert
所以就有了下面的这个触发器,执行完后,再执行一条插入语句就会发现这个触发器里的plsql程序被执行了.
语句级触发器针对的是表跟一次性插多少数据没关系,只要修改表就执行
行级触发器针对的是行,插入的每条数据进行验证,比如只针对10号部门,一次性插入100条数据,只检查10号部门的数据触发.
应用示例一,语句级触发器
/*
实施复杂的安全性检查
禁止在非工作时间 插入新员工
1、周末: to_char(sysdate,\'day\') in (\'星期六\',\'星期日\')
2、上班前 下班后:to_number(to_char(sysdate,\'hh24\')) not between 9 and 17 判断是否是上班期间早上9点前,下午6点后
*/
create or replace trigger securityemp
before insert
on emp --如果不声明变量declare可以省略
begin
if to_char(sysdate,\'day\') in (\'星期六\',\'星期日\',\'星期五\') or
to_number(to_char(sysdate,\'hh24\')) not between 9 and 17 then
--禁止insert
raise_application_error(-20001,\'禁止在非工作时间插入新员工\');--这儿不使用抛异常,使用调用方法抛异常,因为这不属于数据库的异常,而是为了不执行后面的插入语句抛的应用型异常,所以调用这个方法抛异常,异常编号必须在20000--20999之间,这是规定
end if;
end securityemp;
执行完上面的触发器后,再执行插入操作,如果在非工作期间执行就会报下面的错误信息.
应用示例二,行级触发器 判断涨的数据对不对, 涨后的钱肯定不可能比涨前的值小:new代表修改后:old代表修改前.
/*
数据的确认
涨后的薪水不能少于涨前的薪水
*/
create or replace trigger checksalary
before update
on emp
for each row
begin
--if 涨后的薪水 < 涨前的薪水 then
if :new.sal < :old.sal then
raise_application_error(-20002,\'涨后的薪水不能少于涨前的薪水。涨前:\'||:old.sal||\' 涨后:\'||:new.sal);
end if;
end checksalary;
/
执行完上面触发器后,演示测试
版权声明:本文为匿名原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。