DML触发器
触发器的基本概念
- 触发器类似于函数和过程,它们都是具有声明部分、执行部分和异常处理部分的程序实体单元。
- 触发器必须在数据库中以独立对象的身份存储。
- 触发器是在事件发生时隐式地运行的,不能接收参数,不能被调用。
- 运行触发器的方式叫做激发(firing)触发器,触发事件可以是对数据库表的DML(INSERT、UPDATE或DELETE)操作或某种视图的操作
触发事件包括INSERT、UPDATE或DELETE,触发时机有两BEFORE和AFTER,可以在触发事件之前也可以在触发事件之后发生。
触发器用途
- 通过记录修改内容和修改者来审计表中的信息。
- 在表内容发生变更时,自动通知其他程序采取相应的处理。
- 在订阅发布环境下,发布有关各种事件的信息。
- 维护在表创建阶段通过声明限制无法实现的复杂完整性限制。
- 触发器主要用于促进引用的完整性
- 只能在无法使用下列表级别限制时使用它们
-NOT NULL
-UNIQUE KEY
-PRIMARY KEY
-PRIMARY KEY
-CHECK
DML触发器触发事件:
- INSERT:当往表或 视图中插入一行时触发
- UPDATE:当在表或 视图中更新一行时触发
- DELETE:当在表或 视图中删除一行时触发
关联触发器
把一个数据库触发器的动作与另一个触发器联系起来,使之触发另一个触发器。
触发器语法
CREATE [OR REPLACE] TRIGGER trigger_name
{
BEFORE | AFTER | INSTEAD OF} triggering_event
referencing_clause
[WHEN trigger_condition]
[FOR EACH ROW]
trigger_body;
其中:
- trigger_name是触发器的名称,
- triggering_event说明了激发触发器的事件(也可能包括特殊的表或视图)
- trigger_body是触发器的代码。
- referencing_clause用来引用正在处于修改状态下的行中的数据,
- 如果在WHEN子句中指定trigger_condition的话,则首先对该条件求值。触发器主体只有在该条件为真值时才运行。
使用触发器约束
- SELECT语句不能触发触发器;
- 触发器不能象存储过程或函数那样被显式地调用,只能由事件来触发;
- 触发器可以调用数据库存储过程、函数和包。
- 必须将适当的权限授予用户,用户才能CREATE,DROP, ENABLE或DISABLE触发器。触发器可被失效或使之有效。
查看触发器脚本:
select text
from user_source
where TYPE='TRIGGER';
DML触发器的组成与类型
大体结构
DML触发器组成:
触发时间:
触发顺序:
行级触发器和语句级触发器区别:
主要在于影响次数不同:
- 如果该语句只影响一行,则语句级与行级触发效果相同。
- 如果该语句影响多行,则行级触发的次数比语句级触发的次数多。
具体应根据进行一个操作时触发器的触发次数,来决定是创建一个语句级还是行级触发器。
BEFORE 型语句级触发器:
CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT