zoukankan      html  css  js  c++  java
  • Oracle-DDL 3- 触发器

    DDL-数据定义语句:

    四、触发器

    -- 触发器(trigger),与某些特定的操作绑定,当达到触发条件后会自动触发
    --主要用来将某些操作的过程记录下来,或者阻止某些非法的操作,保护数据

    /*
    触发条件:
    触发时间 —— before/after
    触发操作 —— insert/update/delete
    触发对象 —— 表和列
    触发范围 —— 所有数据或者指定条件
    */

    /*
    create [or replace] trigger 触发器名称
    before / after
    insert or update or delete
    [ of 列 ] on 表
    [for each row
    when ( 限定条件 )]
    begin
    操作语句;
    end;

     

    for each row 表示每行符合条件的数据都触发

    有了for each row可以不写when,有了 when 必须写for each row

    when 后面的限定条件必须使用 old 或 new 来指明是以修改前的或者修改后的数据作为条件
    */

    1.如果对emp表中30号部门员工的职位进行修改,
    则将员工的姓名、原职位、新职位和修改时间记录下来。

    --先创建一张表用来记录相关的数据
    CREATE TABLE change_job
    (
    ename VARCHAR2(20),
    old_job VARCHAR2(20),
    new_job VARCHAR2(20),
    ch_time DATE);

    SELECT * FROM change_job;

    --分析触发条件
    --触发时间:before
    --触发操作:update
    --触发对象:emp表job列
    --触发范围:30号部门

    CREATE TRIGGER tri1
    BEFORE
    UPDATE
    OF job ON emp
    FOR EACH ROW
    WHEN (old.deptno = 30)
    BEGIN
    INSERT INTO change_job
    VALUES (:old.ename,:old.job,:new.job,SYSDATE);
                   --begin部分如果要调用表中的数据,使用:old 和 :new 限定
    END;

    UPDATE emp
    SET job = 'SALESMAN'
    WHERE deptno = 30;

    SELECT * FROM emp;

    2.不允许在周末对emp表中的数据进行更改
    --触发条件
    --触发时间:before
    --触发操作:update,delete,insert
    --触发对象:emp表
    --触发范围:所有数据

    --如果触发条件是表中的数据在when中去设置条件
    --如果触发条件是客观条件,与表中的数据无关,在begin部分使用条件判断语句 if 来实现

     

    --触发器中要阻止某些操作可以使用raise_application_error 方法来提交一个系统错误
    --raise_application_error( 错误id ,错误提示)
    --错误id范围是 -20001~ -29999 之间,以免跟系统错误的 id 重复,错误提示自定义字符串

    CREATE TRIGGER tri2
    BEFORE
    INSERT OR UPDATE OR DELETE
    ON emp
    BEGIN
    IF TO_CHAR(SYSDATE,'fmDAY') IN ('SATURDAY','SUNDAY') THEN
    RAISE_APPLICATION_ERROR(-20001,'can not change data at weekend');
    END IF;
    END;

    DELETE emp
    WHERE ename = 'ALLEN';

    【练习】

    创建一个触发器,要求对emp表中的删除操作进行判断,不能删除1981年6月1日之前入职的员工
    create trigger emp_date_protect
    before
    delete
    on emp
    for each row
    when (old.hiredate < to_date('19810601','YYYYMMDD'))
    begin
    RAISE_APPLICATION_ERROR(-20001,'Can NOT delete employees hired before June 1st 1981!');
    end;

  • 相关阅读:
    继承在WCF中的问题和解决办法
    bootstrap插件学习-bootstrap.dropdown.js
    C#山寨版本拨号客户端
    关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
    [源码]Literacy 快速反射读写对象属性,字段
    Hadoop Streaming框架学习(一)
    AOP详解
    SESSION会话技术
    mongodb 备份、还原、导入、导出
    Qt 技巧: 解决未解析的SSL问题
  • 原文地址:https://www.cnblogs.com/JodieRao/p/11358220.html
Copyright © 2011-2022 走看看