第13章 触发器-Oracle数据库教程(第2版)-赵明渊-清华大学出版社
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*触发器定义*/
{ BEFORE∣AFTER∣INSTEAD OF }
/*指定触发时间*/
{ DELETE | INSERT | UPDATE [ OF <列名>[,…n] ]} /*指定触发事件*/
[OR { DELETE | INSERT | UPDATE [ OF <列名>[,…n] ]}]
【例13.1】 在stsys 数据库的score表上创建一个INSERT触发器 trigInsertCourseName,向score表插入数据时,如果课程为英语,则显示 “该课程已经考试结束,不能添加成绩”。
(1)创建触发器
CREATE OR REPLACE TRIGGER trigInsertCourseName BEFORE INSERT ON score FOR EACH ROW DECLARE CourseName ame%TYPE; BEGIN SELECT cname INTO CourseName
Oracle数据发器概述
Oracle的触发器有三类:DML 触发器、INSTEAD OF触发器和系统触 发器。
1.DML 触发器 当数据库中发生数据操纵语言(DML)事件时将调用 DML 触发器。 DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE语句 和DELETE 语句,DML 触发器可分为INSERT触发器、UPDATE 触发器和 DELETE触发器三类。
第13章 触发器
13.1 触发器概述 13.2 创建触发器 13.3 触发器的管理
Oracle数据库教程(第2版)
1
•
13.1 触发器概述
触发器是一种特殊的存储过程,与表的关系密切,其特殊性主要体现 在不需要用户调用,而是在对特定表(或列)进行特定类型的数据修改时 激发。
触发器与存储过程的差别如下: ● 触发器是自动执行,而存储过程需要显式调用才能执行。 ● 触发器是建立在表或视图之上的,而存储过程是建立在数据库之 上的。 触发器用于实现数据库的完整性,触发器具有以下优点: ● 可以提供比CHECK 约束、FOREIGN KEY约束更灵活、更复杂、 更强大的约束。 ● 可对数据库中的相关表实现级联更改。 ● 可以评估数据修改前后表的状态,并根据该差异采取措施。 ● 强制表的修改要合乎业务规则。 触发器的缺点是增加决策和维护的复杂程度。
ON {<表名>∣<视图名>}
/*指定表触发对象*/
[ FOR EACH ROW [ WHEN(<条件表达式>) ] ]
/*指定触发级别*/
<PL/SQL语句块>
/*触发体 */
Oracle数据库教程(第2版)
4
•
13.2 创建触发器
说明:
● 触发器名:指定触发器名称。
● BEFORE:执行DML操作之前触发。 ● AFTER:执行DML操作之后触发。 ● INSTEAD OF:替代触发器,触发时触发器指定的事件不执行,而 执行触发器本身的操作。
Oracle数据库教程(第2版)
5
•
13.2 创建触发器
在行级触发器执行过程中,PL/SQL语句可以访问受触发器语句影响 的每行的列值。”:OLD.列名”表示变化前的值,“:NEW.列名”表示变化 后的值。
有关DML触发器的语法说明,补充以下两点: (1)创建触发器的限制 ● 代码大小:触发器代码大小必须小于32 kB。 ● 触发器中有效语句可以包括DML语句,但不能包括DDL语句。 ROLLBACK、COMMIT、SAVEPOINT也不能使用。
(2)触发器触发次序 ● 执行BEFORE语句级触发器。 ● 对于受语句影响的每一行,执行顺序为:执行BEFORE行级触发器 −执行DML语句−执行AFTER行级触发器。 ● 执行AFTER语句级触发器。
Oracle数据库教程(第2版)
6
•
13.2 创建触发器
综上所述,可得创建DML 触发器的语法结构包括触发器定义和触发 体两部分。触发器定义包含指定触发器名称、指定触发时间、指定触发事 件、指定触发对象、指定触发级别等。触发体由PL/SQL语句块组成,它是 触发器的执行部分。
2.INSTEAD OF触发器 ORACLE专门为进行视图操作的一种处理方法。
3.系统触发器 系统触发器由数据定义语言(DDL)事件(如CREATE语句、ALTER语句、 DROP语句)、数据库系统事件(如系统启动或退出、异常操作)、用户事件 (如用户登录或退出数据库)触发。
Oracle数据库教程(第2版)
● DELETE、INSERT、UPDATE:指定一个或多个触发事件,多个 触发事件之间用OR连接。
● FOR EACH ROW:由于DML语句可能作用于多行,因此触发器的 PL/SQL语句可能为作用的每一行运行一次,这样的触发器称为行级触发器 (row-level trigger);也可能为所有行只运行一次,这样的触发器称为语句级 触发器(statement-level trigger)。如果未使用FOR EACH ROW子句,指定为 语句级触发器,触发器激活后只执行一次。如果使用FOR EACH ROW子句, 指定为行级触发器,触发器将针对每一行执行一次。WHEN子句用于指定 触发条件。
Oracle数据库教程(第2版)
7
•
13.2 创建触发器
FROM course
WHERE cno=:o; IF CourseName='英语' THEN
RAISE_APPLICATION_ERROR(-20001, '该课程已经考试结束,不能添加 成绩');
END IF;
END;
在创建触发器trigInsertCourseName的定义部分,指定触发时间为 BEFORE,触发事件为INSERT语句,触发对象为 score表,由于使用了FOR EACH ROW子句,触发级别为行级触发器。
3
•
13.2 创建触发器
13.2.1创建DML触发器
DML 触发器是当发生数据操纵语言 (DML) 事件时要执行的操作。 DML 触发器用于在数据被修改时强制执行业务规则,以及扩展 CHECK 约 束、FOREIGN KEY约束的完整性检查逻辑。
语法格式:
CREATE [OR REPLACE] TRIGGER [<用户方案名>.] <触发器名>