第八章理论课触发器和内置程序包.pdf
文本预览下载声明
《Oracle 数据库应用 》理论课
触发器和内置程序包
本章技能目标
理解和应用触发器
了解内置程序包
1. 触发器
触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区
别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
触发器可以用于加载Oracle 的默认功能,提供高度可定制的数据库,触发器能够执行的功
能有:
1、 允许/ 限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
触发器与特定的表或视图相关联,用于检查对表或视图所做的数据修改。无论正在执行操作的
用户身份如何,触发器都能够在它们执行操作时生效。当INSERT,DELETE ,UPADTE 等事件
发生在表或视图中时,就会激活触发器的代码。
用于创建触发器的语法为:
CREATE [OR REPLACE] TRIGGER trigger_name
AFTER | BEFORE | INSTEAD OF
[INSERT] [[OR] UPDATE [OF column_list]]
[[OR] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old / NEW [AS] new}]
[FOR EACH ROW]
[WHEN (condition)]
pl/sql_block;
其中:
第8 章 触发器和内置程序包
before 和after :指在事件发生之前或之后激活触发器。
instead of :如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。
insert、delete 和update :指定构成触发器事件的数据操纵类型,update 还可以制定列的列表。
referencing :指定新行(即将更新)和旧行(更新前)的其他名称,默认为new 和old 。
table_or_view_name :指要创建触发器的表或视图的名称。
for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则
为语句级触发器。
when :限制执行触发器的条件,该条件可以包括新旧数据值得检查。
declareend :是一个标准的PL/SQL 块。
例1 演示如何在SCOTT 模式的EMP 表上创建触发器。
例1:
CREATE OR REPLACE TRIGGER biu_emp_deptno
BEFORE INSERT OR UPDATE OF deptno
ON emp
FOR EACH ROW
WHEN (New.deptno 40)
BEGIN
:Nm := 0;
END;
/
提示:如果创建触发器时出现错误,请使用SHOW ERRORS 命令查看详细的错误信息。
1.1 触发器的组成部分
触发器由三部分组成:
触发器语句(事件)
定义激活触发器的 DML 事件和 DDL 事件
触发器限制
执行触发器的条件,该条件必须为真才能激活触发器
触发器操作(主体)
包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运
行
触发器语句
触发器语句是那些可以导致触发器的事件,即在表或视图上执行的INSERT ,DELETE ,UPADTE
之类的DML 语句,在模式对象上执行的DDL 语句或数据库事件。
在例1 触发器中,第2 行至第四行,如下代码所示,构成了触发器语句。
BEFORE INSERT OR UPDATE OF deptno
ON emp
FOR EACH ROW
这就是说,触发器会在这些事件之前隐式执行:当对EMP 表执行INSERT 语句时或对EMP 表
的deptno 列进行UPADTE 时。
显示全部