触发器是一种特殊的存储过程,和存储过程和存储函数一样是一个pl/sql程序块,触发器是不能接受参数,不能显示调用,只是随着事件触发隐式运行的存储过程程序块。

  1. 复杂的安全性检查
  2. 数据确认
  3. 实现审计功能
  4. 完成数据的备份和同步

  数据库触发器是一个与表相关联的,存储的PL/SQL程序,每当一个特定的数据库操作语句(insert ,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义得语句序列。

  1. -- 第一个触发器:每当成功插入新员工后,自动打印“成功插入新员工”
  2. -- 触发器单词:trigger
  3. create trigger saynewem -- 创建触发器名称
  4. after insert -- 在插入操作以后
  5. on emp -- 针对emp的表
  6. declare -- 操作体
  7. begin
  8. dbms_output.put_line('成功插入新员工'); -- 触发器操作的内容
  9. end;
  1. 复杂的安全性的场景(涉及到权限的问题);
  2. 数据的确认(涉及数据是否合理问题);
  3. 数据的审计(涉及到数据的增、删、改的操作记录);
  4. 数据的备份和同步(备份和同步重要);
  1. create[or replace] trigger 触发器名
  2. {before|after}
  3. {delete|insert|update[of 列名]}
  4. on 表名
  5. [for each row [when(条件)]] (有这条语句的话就是行级触发器,否则就是语句级触发器)
  6. PLSQL

  在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。(针对的是表,触发最多一次)

  触发语句作用的每一条记录都被触发。在行级触发器中使用 :old 和 :new 伪记录变量,识别值的状态。(针对的是行,触发器触发次数不一样,有多少行满足条件就触发多少次)

  1. -- 例如禁止在非工作时间插入数据
  2. /**
  3. 1.周末: to_char(sysdate,'day') in ('星期六',‘星期日’)
  4. 2.上班前,下班后: to_number(to_char(sysdate,'hh24')) not between 9 and 18
  5. /
  6. create or replace trigger securityemp
  7. before insert
  8. on emp
  9. begin
  10. if to_char(sysdate,'day') in ('星期六', '星期日') or
  11. to_number(to_char(sysdate,'hh24')) not between 9 and 18 then
  12. raise_application_error(-20001,'禁止在非工作时间插入新员工');
  13. end if;
  14. end;
  15. /
  1. -- 涨工资不能越涨越少
  2. /**
  3. * :old 和 :new 代表同一条记录
  4. * :old 表示操作该行之前,这一行的值
  5. * :new 表示操作该行值后,这一行的值
  6. */
  7. create or replace trigger check_salary
  8. before update
  9. on emp
  10. for each row
  11. begin
  12. if :new.sal<:odl.sal then
  13. raise_application_error(-20002,'涨后薪水不能少于涨前薪水。 涨后薪水为:'||:new.sal ||'涨前的薪水:'||:old.sal);
  14. end if;
  15. end;
  1. -- 给员工涨工资,当涨后的薪水超过6000块时候,审计该员工的信息
  2. -- 创建表,用于保存审计信息
  3. create table audit_info(
  4. information varchar2(200)
  5. );
  6. create or replace trigger do_audit_emp_salary
  7. after update
  8. on emp
  9. for each row
  10. begin
  11. if :new.sal>6000 then
  12. insert into audit_info values(:new.empno||' '||:new.ename||' '||:new.sal);
  13. end if;
  14. end;
  1. -- 创建备份表
  2. create table emp_back as select * from emp;
  3. -- 利用触发器实现数据的同步部分
  4. -- 当给员工涨完工资后,自动备份新的工资到备份表中
  5. create or replace trigger sync_salary
  6. after update
  7. on emp
  8. for each row
  9. begin
  10. -- 当主表更新后,自动更新备份表
  11. update emp_back set sal=:new.sal where empno=:new.empno;
  12. end;
  13. /

Reference:

版权声明:本文为wave-gbt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/wave-gbt/p/oracle-trigger.html