Oracle之触发器的创建与使用

Oracle之触发器的创建与使用 

Oracle之触发器的创建与使用

从上面概念上来看,首先触发器是在表关联基础上的,所以得与表关联也就是下面语句的on emp,再有它是存储的plsql程序,也就是下面的begin end 程序,每当增删改操作时,这个操作分操作前后,也就是下面的after insert 

所以就有了下面的这个触发器,执行完后,再执行一条插入语句就会发现这个触发器里的plsql程序被执行了.

Oracle之触发器的创建与使用

Oracle之触发器的创建与使用

Oracle之触发器的创建与使用

语句级触发器针对的是表跟一次性插多少数据没关系,只要修改表就执行

行级触发器针对的是行,插入的每条数据进行验证,比如只针对10号部门,一次性插入100条数据,只检查10号部门的数据触发.

Oracle之触发器的创建与使用

应用示例一,语句级触发器

/*
实施复杂的安全性检查
禁止在非工作时间 插入新员工
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;

执行完上面的触发器后,再执行插入操作,如果在非工作期间执行就会报下面的错误信息.

Oracle之触发器的创建与使用

应用示例二,行级触发器    判断涨的数据对不对, 涨后的钱肯定不可能比涨前的值小: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;
/

执行完上面触发器后,演示测试

Oracle之触发器的创建与使用