PLSQL 触发器概念

  • 什么是触发器?

                  触发器是一个特殊的存储过程。

                  数据库触发器是一个与表想关联的,存储的PL/SQL程序

                  每当一个特定的数据操作语句(insert,Update,delete)在指定的表发出时,Oracle自动执行触发器中定义的语句序列

  • 触发器的应用场景。
  1. 复杂的安全性检查(代码请看式例一)
    1. 在特定的时间段不让操作数据,比如在周末or非工作时间,不让操作数据
  2. 数据的确认(代表请看式例二)
    1. 比如涨工资的时候,涨的工资肯定要比原工资要高,才叫涨工资。这时候就需要数据的确认。
  3. 数据库的审计
    1. 跟踪表上所在的数据操作。什么时间,什么人,操作了什么数据,操作的数据是什么,这就是数据库的审计。
    2. 数据库审计在oracle数据库中已经单独实现了,并且非常的强大。
    3. 数据库审计在Oracle中有五种,触发器只是其中一种。
  4. 完成数据的备份和同步
    1. 把主表里的数据备份到从表里,如果主表数据库崩溃就可以用从表数据库。
  • 触发器的类型
    • 语句级触发器
      • 在指定的操作语句操作之前或操作之后执行一次,不管这条语句影响了多少行。
    • 行级触发器
      • 触发语句作用的每一条语句都被触发。在行级触发器中使用:old和:new伪记录变量,识别值的状态。
      • :old 和 :new 代表的是同一行里的数据
      • :old 代表是操作之前的数据
      • :new 代表的是操作之后的数据
  • 触发器的语法(demo)

                 插入一条新员工之后打印一条语句

                         create trigger/*触发器关键字*/ saynewemp /*触发器名称*/
          after /*插入成功之后执行*/ insert /*添加数据的时候执行*/ on emp /*表名*/
       declare
       begin
               dbms_output.put_line('成功插入新员工');  /*要执行的语句序列*/
          end;

  • --实施复杂的安全性检查(式例一)
    --禁止在非工作时间插入数据(这个触发器代表的是“语句型触发器”。影响的是整个表,不关心受影响的行数)
    /*
    1.周末  to_char(sysdate,'day')  in ('星期六','星期日')
    2.上班前  下班后  to_number(to_char(sysdate,'hh24')) not between 9 and 18
  1. before  操作之前执行   after  操作之后执行
  2. raise_application_error(-20001 ~ -29999,'提示字符串');  该函数代表自定义异常信息
    */
    create or replace trigger securityemp
      before insert on aaaaaa
    declare
    begin
      if to_char(sysdate, 'day') in ('星期六', '星期日') or
         to_number(to_char(sysdate, 'hh24')) not between 9 and 18 then
        raise_application_error(-20001, '禁止在非工作时间插入数据');
      end if;
    end;
  • /* (式例二)
    数据的确认(这是一个行级触发器)
    涨后的薪水不能少于涨前的薪水
    :old 和 :new 代表的是同一行里的数据
    :old 代表是操作之前的数据
    :new 代表的是操作之后的数据
    for each row 加上这条语句就代表是行级触发器
    */
    create or replace trigger namename
      before update on aaaaaa
      for each row
    declare
    begin
      if :old.role_name > :new.role_name then
        raise_application_error(-20003, '涨后的薪水不能少于涨前的薪水');
      end if;
    end;
posted @ 2018-06-13 15:07  俊龍  阅读(211)  评论(0编辑  收藏  举报