触发器的概念
触发器是一个与表相关联的,存储的pl/sql程序, 相当于特定的数据操作语句(insert ,update,delete)在指定的表上出发时,oracle 自动的触发触发器中定义的语句序列
eg.当向表中插入数据的时候自动打印一“成功插入新员工”
create trigger firsttrigger after insert on emp declare begin dbms_output.put_line('hello world'); end ; // 然后我们插入语句 insert into emp (ename,sal,empno) values('张三',100,1111) ;
触发器用于
1. 数据确认
2. 实施复杂的安全性检查
3. 做审计(日志 ),跟踪表上所做的数据操作等 (审计功能是很重要的) 银行
如果想做什么事情 , 先把数据库中的审计关掉就没有记录了
1.基于值的审计
2. 强制审计
3.标准审计(配置)
4.细粒度审计
5.管理员审计
4. 数据同步和备份
创建触发器
create or replace trigger 触发器名字
before / after
delete insert update (of列名 ) of 只有更新这个列的时候才能触发函数
on 表名
for each row where 条件 行级触发器
plsql 代码块
触发器的类型
语句级的触发器(针对的是表)
在指定的语句操作之前后之后执行一次,不管这条语句印象了多少行,
行级触发(for each row ) (针对的是行)
触发语句作用的每一条都被触发, 在行级触发器中使用 : old 和 : new伪记录,变量,识别值的状态,
:old 是之前
:new 是之后
案例
1. 禁止在非工作时间插入数据
/** 触发器应用一, 实施复杂的安全性, 禁止非工作时间插入新员工 1. 周末是非工作时间 to_char(syadate,'day') in ('sunday','saturday'); 2.上班前, 和下班后, 9.00 和 18.00 后 to_numbber(to_char(sysdate,'hh24')) not between 9 and 17 */ create or replace trigger securityemp before insert on emp begin if to_char(sysdate,'day') in ('sunday','saturday') or to_number(to_char(sysdate,'hh24')) not between 9 and 17 then -- 禁止insert raise_application_error(-20001,'禁止再非工作时间内插入新员工'); end if ; end securityemp; // 调用 sql> insert into emp (ename) values ('李四') ; insert into emp (ename) values ('李四') * error at line 1: ora-20001: 禁止再非工作时间内插入新员工 ora-06512: at "scott.securityemp", line 6 ora-04088: error during execution of trigger 'scott.securityemp'
这个触发器是针对表的语句触发器,
2. 数据的确认 (使用oracle 中提供的 :old 和 :new )
/** 数据的确认, 涨后的薪水不能少于涨前的薪水 */ create or replace trigger checksalary before update on emp for each row begin -- 判断涨前后工资 if :new.sal < :old.sal then raise_application_error(-20002,'涨后的工资不能低于涨后的工资。涨前:' || :old.sal || '涨后:' || :new.sal); end if ; end checksalary; // 触发触发器 sql> update emp set sal=2000 where empno=1001 ; update emp set sal=2000 where empno=1001 * error at line 1: ora-20002: 涨后的工资不能低于涨后的工资。涨前:28300涨后:2000 ora-06512: at "scott.checksalary", line 4 ora-04088: error during execution of trigger 'scott.checksalary'