Oracle数据库管理之道oracle的基本sql介绍Java学习笔记

Oracle之DML触发器基本使用

2017-06-07  本文已影响63人  Acamy丶

触发器是当某个事件发生时自动地隐式运行。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;
上一篇下一篇

猜你喜欢

热点阅读