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;
/