当前位置:文档之家› 第16章 创建数据库触发器

第16章 创建数据库触发器


如果在一个表上定义了多个触发器,要意识到相同类型的多个触 发器的触发顺序是随机的。为了保证相同类型的多个触发器以特 定的顺序触发,统一多个触发器到一个触发器中,再以想要的顺 序分别调用过程。
3 Sept. 2008 Confidential
创建DML语句级别的触发器
CREATE [OR REPLACE] TRIGGER trigger_name [BEFORE | AFTER] [INSERT | UPDATE [of column] ON table_name Trigger_body
3 Sept. 2008 Confidential
触发顺序(续)
在一个表中操纵许多行时使用下面的触发顺序:
UPDATE emp SET sal = sal * 1.1 WHERE deptno = 30;
触发动作
BEFORE 语句触发器 BEFORE 行触发器
AFTER 行触发器

BEFORE 行触发器
3 Sept. 2008 Confidential
合并多个事件的事例
CREATE OR REPLACE TRIGGER sal_emp BEFORE INSERT OR UPDATE OR DELETE ON emp BEGIN IF(to_char(sysdate,'HH24:MI') not between '08:00' and '17:00') THEN IF deleting THEN raise_application_error(-20001,'只是在工作期间 可以删除数据'); ELSIF inserting THEN raise_application_error(-20002,'只是在工作期间 可以录入数据'); ELSIF updating('sal') THEN raise_application_error(-20003,'只是在工作期间 可以更新薪水数据'); ELSE raise_application_error(-20004,'只是在工作期间 可以更新数据'); END IF; END IF; END;
3 Sept. 2008 Confidential
创建DML行触发器
CREATE [OR REPLACE] TRIGGER trigger_name [BEFORE | AFTER] [INSERT | UPDATE [of column] | DELETE] ON table_name [REFERENCING OLD as old | NEW as new] FOR EACH ROW [WHEN (condition)] Trigger_body
应用程序触发器 在应用程序内发生特定 DML 事件时,将隐式触发它 数据库触发器 在表、视图、方案或数据库上发生特定事件时,将隐式 触发它
3 Sept. 2008 Confidential
设计触发器的原则
设计触发器为了: –保证当一个指定的操作被执行时,执行相关的动作 –集中全局操作 • 下面的情况不用触发器: –已经内建于Oracle 服务器中的功能 –重复其它的触发器 • 如果触发器的算法很长,将算法创建于存储过程中,再 在触发器中调用它们,触发器的大小不能超过 32 K。 • 过分地使用触发器可能导致复杂的依赖,这在大的应用 程序中可能会产生维护困难。

3 Sept. 2008 Confidential
创建DML行触发器(续)
在一个行触发器中,在数据改变之前或之后,可以用 OLD and NEW 限定词作为前缀引用一个列的值。
数据操纵 INSERT UPDATE DELETE
OLD 值 NULL 更新以前相应记录的原始值 删除以前相应记录的原始值 插入的值

3 Sept. 2008 Confidential
DML 触发器的触发类型
触发器类型:触发器体将对语句影响的每行都执行,还是 只执行一次? • 语句:触发器体对于触发事件执行一次,这是默认。一个 语句触发器触发一次,即使根本没有行受影响。 • 行:触发体对受触发事件影响的每行执行一次。如果触发 事件没有受影响的行,行触发器不执行。
NEW 值 触发语句完成时,要更新的值 NULL
3 Sept. 2008 Confidential
创建DML行触发器(续)
CREATE OR REPLACE TRIGGER audit_emp_values AFTER DELETE OR INSERT OR UPDATE ON emp FOR EACH ROW BEGIN INSERT INTO audit_emp_table (user_name, timestamp, old_empno,new_empno,old_ename, new_ename, old_job, new_job, old_sal, new_sal) VALUES (USER, SYSDATE, :OLD.empno,:NEW.empno, :OLD.ename, :NEW.ename, :OLD.job, :NEW.job, :OLD.sal, :NEW.sal ); END; /
OLD和NEW限定词只在行触发器中可用 在每一个 SQL 和 PL/SQL 语句中这些限定词用冒号 (:) 前缀
3 Sept. 2008 Confidential
创建DML行触发器(续)
INSERT INTO emp (empno, ename,job, sal) VALUES (999, 'Temp', 'CLERK', 1000); UPDATE emp SET sal = 2000, ename = 'Smith' WHERE empno = 999;
3 Sept. 2008 Confidential
DML 触发器的触发事件
触发事件可以是表上的 INSERT、UPDATE 或 DELETE 语句 • 当触发事件是一个 UPDATE 语句时,可以用一个字段列 表来确定那些必需触发触发器自来改变的列。不能为 INSERT 或 DELETE 语句指定字段列表,因为它们总是 影响整个行。 . . . UPDATE OF sal . . . • 触发事件可以是一个、两个或全部 DML 语句的三个。 . . . INSERT 或 UPDATE 或 DELETE . . . INSERT 或 UPDATE OF job . . .
3 Sept. 2008 Confidential
DML 触发器的触发时间
触发时间:什么时候触发器应该触发? • BEFORE:在表上触发DML 事件之前执行触发器体。 • AFTER: 在表上触发DML 事件之后执行触发器体。 • INSTEAD OF:修改视图时执行触发器体代替触发 语句
3 Sept. 2008 Confidential
3 Sept. 2008 Confidential
DML 触发器(续)

在写触发器代码之前,确定触发器各部分的值: 触发时机、触发事件和触发类型。
说明 可能值
部分
触发器时机 触发事件 触发器类型 触发器体
当触发器涉及触发事件时的触 BEFORE、AFTER 、 INSTEAD OF 发时机 在表或视图上的哪一个数据操 INSERT、UPDATE、 DELETE 纵操作引发了触发器触发 Statement、Row 触发器体被执行多少次 触发器执行的那些动作 PL/SQL 块

3 Sept. 2008 Confidential
触发顺序
在一个表中操纵一个单个的行时使用下面的触发顺序:
INSERT INTO dept (deptno,dname, loc) VALUES (400, ’CONSULTING’, ‘shenyang’);
触发动作
BEFORE 语句触发器

BEFORE 行触发器 AFTER 行触发器 AFTER 语句触发器
第九章 创建数据库触发器
东软IT人才实训中心
7 Mar. 2008 2008 By Neusoft Group. All rights reserved Copyright © Neusoft Confidential
目标:
本章旨在向学员介绍Oracle触发器的 应用,通过本课的学习,学员应该掌 握如下知识: 1)描述不同触发器类型的区别 2)描述数据库触发器和它们的用途 3)创建数据库触发器 4)描述数据库触发器的触发(firing ) 规则 5)删除触发器
AFTER 行触发器 AFTER 语句触发器
3 Sept. 2008 Confidential

练习
在emp表上创建语句级别的触发器,当用户在8:00点至17:00点以外 插入、修改、删除数据之后,系统提示‘只是在工作期间可以录入 数据’.
CREATE OR REPLACE TRIGGER sal_emp BEFORE INSERT OR UPDATE OR DELETE ON emp BEGIN IF(to_char(sysdate,'HH24:MI') NOT BETWEEN '08:00' AND '17:00') THEN raise_application_error(-20001,'只是在工作期间可以录入数 据'); END IF; END; INSERT INTO emp(empno,ename,job,mgr,hiredate,sal) VALUES(1002,'ljs','clerk',7902,sysdate,2000);
学时:4学时 教学方法:讲授ppt +上机练习+点评
3 Sept. 2008 Confidential
相关主题