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触发器基本使用

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

  • Oracle课堂笔记

    oracle课堂笔记包含ddl,dml,tcl,游标,过程,函数,触发器等详细demo。志在帮助小白变大神

  • SQL Server触发器

    SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。 1.DML(数据操作语言,D...

  • 24、触发器

    触发器 存放在数据库中,并被隐含执行的存储过程。在 Oracle8i 之前,只允许给予表或者视图的的 DML 的操...

  • Oracle基础

    Oracle基础总结 1.基本查询 DML(数据库操作语言):包括insert、update和delete,用于对...

  • Oracle与Mysql中的触发器(Trigger)对比

    Oracle触发器 Demo(通过触发器结合创建序列(sequence)的方式实现字段递增) Mysql 触发器(...

  • Oracle之触发器

    触发器是一个特殊的存储过程;存储过程和存储函数是一个完成特定功能的PL/SQL程序;触发器的应用场景:1,复杂的安...

  • 7. SQLite-DML数据操作语句代码实现

    一. DML语句的基本使用 在Xcode中, 执行DML语句, 与之前的DDL语句的方法相同 为SQLiteToo...

  • 查询数据库触发器

    查询数据库触发器 Oracle: sqlserver: mysql:

  • oracle基本操作

    oracle基础部分:基本使用;用户管理;表管理 oracle高级部分:oracle表的查询;oracle的权限、...

网友评论

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

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