Oracle之DML触发器基本使用

作者: Acamy丶 | 来源:发表于2017-06-07 12:33 被阅读63次

    触发器是当某个事件发生时自动地隐式运行。DML触发器指的是在对表进行增删改操作引发的自动执行事件。

    创建触发器的一般语法:

    CREATE [OR REPLACE] TRIGGER trigger_name
    {BEFORE | AFTER }
    {INSERT | DELETE | UPDATE [OF column [, column …]]}
    [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
    ON [schema.]table_name | [schema.]view_name
    [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
    [FOR EACH ROW ]
    [WHEN condition]
    PL/SQL_BLOCK | CALL procedure_name;
    

    其中:
    BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式。
    FOR EACH ROW选项说明触发器为行触发器。
    REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。

    WHEN 子句说明触发约束条件。

    Demo1: 记录每条记录的插入时间(10g后可以在建表时用rowdependencies实现等级追踪实现效果同样)

    --先创建日志记录表
    CREATE TABLE SZ_RECORD_TEST ("SZID" VARCHAR2(1024) NOT NULL, 
      "SZVERSION" VARCHAR2(1024), 
      "EVENT_TIME" DATE DEFAULT sysdate NOT NULL);  
    
    CREATE OR REPLACE TRIGGER TRG_SZD
      AFTER INSERT ON TT_SZD FOR EACH ROW
    BEGIN
        INSERT INTO SZ_RECORD_TEST(SZID,SZVERSION)
        VALUES
          (:NEW.SZD_ID,
        :NEW.VERSION);
    END;
    

    ** Demo2:** 限制对Departments表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表。

    CREATE OR REPLACE TRIGGER tr_dept_time
    BEFORE INSERT OR DELETE OR UPDATE
    ON departments
    BEGIN
     IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN
         RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改departments表');
     END IF;
    END;
    

    ** Demo3:** 限定只对部门号为80的记录进行行触发器操作。

    CREATE OR REPLACE TRIGGER tr_emp_sal_comm
    BEFORE UPDATE OF salary, commission_pct
           OR DELETE
    ON HR.employees
    FOR EACH ROW
    WHEN (old.department_id = 80)
    BEGIN
     CASE
         WHEN UPDATING ('salary') THEN
            IF :NEW.salary < :old.salary THEN
     
               RAISE_APPLICATION_ERROR(-20001, '部门80的人员的工资不能降');
            END IF;
         WHEN UPDATING ('commission_pct') THEN
     
            IF :NEW.commission_pct < :old.commission_pct THEN
               RAISE_APPLICATION_ERROR(-20002, '部门80的人员的奖金不能降');
            END IF;
         WHEN DELETING THEN
              RAISE_APPLICATION_ERROR(-20003, '不能删除部门80的人员记录');
         END CASE;
    END;
    

    相关文章

      网友评论

        本文标题:Oracle之DML触发器基本使用

        本文链接:https://www.haomeiwen.com/subject/xnbofxtx.html