oracle的行级触发器使用

前端之家收集整理的这篇文章主要介绍了oracle的行级触发器使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

行级触发器:

当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值.

:NEW 修饰符访问操作完成后列的值

:OLD 修饰符访问操作完成前列的值

例1: 建立一个触发器,当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1 = 2 ; OR REPLACE TRIGGER tr_del_emp BEFORE DELETE -- 指定触发时机为删除操作前触发 ON scott.emp FOR EACH ROW -- 说明创建的是行级触发器 BEGIN -- 将修改前数据插入到日志记录表 del_emp,以供监督使用。 INSERT INTO emp_his(deptno,empno,ename,job,mgr,sal,comm,hiredate ) VALUES ( :old.deptno,:old.empno,:old.ename,:old.job,:old.mgr,:old.sal,:old.comm,:old.hiredate ); END ; DELETE emp WHERE empno = 7788 ; DROP TABLE emp_his; TRIGGER del_emp;

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

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    TRIGGER tr_dept_time DELETE UPDATE ON departments BEGIN IF (TO_CHAR(sysdate,' DAY ' ) IN ( ' 星期六 ',0); Box-sizing: border-Box;">' 星期日 ' )) OR (TO_CHAR(sysdate,0); Box-sizing: border-Box;">' HH24:MI ' ) NOT BETWEEN ' 08:30 ' AND ' 18:00 ' ) THEN RAISE_APPLICATION_ERROR( - 20001,0); Box-sizing: border-Box;">' 不是上班时间,不能修改departments表 ' ); END IF ; END ;

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

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    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( - ' 部门80的人员的工资不能降 ' ); END IF ; WHEN UPDATING ( ' commission_pct ' ) THEN NEW.commission_pct < :old.commission_pct THEN RAISE_APPLICATION_ERROR( - 20002,0); Box-sizing: border-Box;">' 部门80的人员的奖金不能降 ' ); IF ; WHEN DELETING THEN RAISE_APPLICATION_ERROR( - 20003,0); Box-sizing: border-Box;">' 不能删除部门80的人员记录 ' ); CASE ; END ;

    /*
    实例:
    UPDATE employees SET salary = 8000 WHERE employee_id = 177;
    DELETE FROM employees WHERE employee_id in (177,170);
    */

    例4: 利用行触发器实现级联更新。在修改了主表 regions 中的 region_id 之后( AFTER ),级联的、自动的更新子表 countries 表中原来在该地区的国家的 region_id 。

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    TRIGGER tr_reg_cou AFTER update OF region_id ON regions ROW BEGIN DBMS_OUTPUT.PUT_LINE( ' 旧的region_id值是 ' || :old.region_id || ' 、新的region_id值是 ' || :new.region_id); UPDATE countries SET region_id = :new.region_id WHERE region_id = :old.region_id; END ;

    例5:在触发器中调用过程。

    OR   REPLACE   PROCEDURE add_job_history ( p_emp_id job_history.employee_id % type,p_start_date job_history.start_date % type ) IS BEGIN INSERT INTO job_history (employee_id,start_date,end_date,job_id,department_id) VALUES (p_emp_id,p_start_date,p_end_date,p_job_id,p_department_id);
    END  add_job_history;
    
    -- 创建触发器调用存储过程...
    OR   REPLACE   TRIGGER  update_job_history
     AFTER  UPDATE   OF  job_id,department_id  ON  employees
      EACH ROW
    BEGIN
     add_job_history(:old.employee_id,:old.hire_date,sysdate,136); Box-sizing: border-Box;">old.job_id,136); Box-sizing: border-Box;">old.department_id);
    END ;
    原文链接:https://www.f2er.com/oracle/208962.html

    猜你在找的Oracle相关文章