zoukankan      html  css  js  c++  java
  • oracle_触发器

    创建触发器

    CREATE [or REPLACE] TRIGGER 触发器名

    {BEFORE | AFTER}

    {DELETE | INSERT | UPDATE [OF 列明]}

    ON 表名

    [FOR EACH ROW [WHEN(条件)]]    --指明触发器类型,有这个语句就指明是行级触发器,否则就是语句级触发器

    PLSQL块

    ==================================================================

    语句级触发器

      在指定的操作语句之前或者之后执行一次,不管这条语句影响了多少行。

    行级触发器

      触发语句作用 的每一条记录都被触发。在行级触发器中使用:old和:new 伪记录变量,识别值的状态。

    =================================================================

    select * from emp where deptno = 10; --查询出3条记录

    eg: insert into emp10 seleect * from emp where depton=10;

    语句级触发器:针对是表,针对的是emp10表,尽管插入了3条数据,但是语句级触发器只操作了一次。

    行级触发器:   针对是行,行级触发器会被调用三次。

    =================================================================

    --应用场景一、实施复杂的安全性检查

    --禁止在非工作时间插入新员工

    /*

    周末:to_char(sysdate,'day') in ('星期六','星期日')

    上班前,下班后:to_number(to_char(sysdate,'hh24')) not between 9 and 18 

    raise:抛出数据库错误

    */

    create or replace trigger securityemp

    befor insert  --在插入操作之前出发

    on emp    --针对emp这张表

    --declare      由于程序中不需要使用变量所以可以不用写declare

    begin

      if to_char(sysdate,'day') in ('星期六','星期日') or

      to_number(to_char(sysdate,'hh24')) not between 9 and 18 

      --禁止insert员工,可以通过抛出例外

      raise_application_error(-20001,'禁止在非工作时间插入新员工');  --抛出一个应用程序错误,这个函数接收两个参数,第一参数是错误代码(在oracle程序中自己定义的错误代码必须在

                                       --区间(-20000,-20999)),第二个是错误信息

      end if;

    end;

    /

    =================================================================

    --应用场景二,数据的确认

    --涨后的薪水不能少于涨前的薪水

    /*

    1、:old和:new 代表的是同一条记录

    2、:old 表示操作该行之前,这一行的值

       :new 表示操作该行之后,这一行的值

      ||链接符

    */

    create or replace triggger checksalary

    before update 

    on emp

    for each row

    begin

      --if 涨后的薪水 < 涨前的薪水 then

      if:new.sal < :old.sal then

      raise_application_error(-20002,'涨后的薪水不能少于涨前的薪水.涨后的薪水:'||:new.sal||'涨前的薪水:'||:old.sal||);

      end if;

    end;

    /

    ================================================================

    /*

    应用场景三: 数据库审计-->基于值的审计功能

    给员工涨工资,当涨后的薪水超过6000块钱的时候,审计该员工的信息

    */

    --创建表,用于保存审计信息

    create table audit_info

    (

    information varchar2(200)

    );

    create or replace trigger do_audit_emp_salary

    after update 

    on emp

    for each row

    begin

      --当涨后的薪水>6000,插入审计信息

      if :new.sal>6000 then 

      insert into audit_info values(:new.empno||'     '||:new.ename||'     '||:new.sal);

      end if;

    end;

    /

    ================================================================

    /*

    应用场景四、数据的备份和同步

    当给员工涨完工资后 ,自动备份新的员工工资到备份表中

    */

    --创建员工表的备份

    create table emp_back as select * from emp;

    create or replace trigger sync_salary

    after update 

    on emp 

    for each row

    begin

      --当主表更新后,自动更新备份表

      update emp_back set sal=:new.sal where empno=:new.empno;

    end;

    /

  • 相关阅读:
    从Delegate.CreateDelegate看值类型的实例方法
    c#编译器如何处理匿名委托
    线程静态的几个特点
    Framework 3.5学习笔记
    看看给我用的基类,还有多少人愿意做下去
    .net里面数组的复制
    装饰模式与大接口的装饰模式的思考
    SingleTon的实现与性能
    特性与方法注入
    CLR与浮点数
  • 原文地址:https://www.cnblogs.com/0914lx/p/6869268.html
Copyright © 2011-2022 走看看