1.概述
-定义:它是存储于数据库的命名PL/SQL语句块,当触发事件发生时它会会隐含执行。“触发事件”可以是如下的任何一种:处理数据库表的DML语句(如:INSERT、UPDATE、DELETE);特定用户模式下或者任何用户执行的DDL语句(CREATE或ALTER);系统事件(启动或关闭数据库);用户事件(登录和注销)。
-特点:可被数据库自动反复调用;无法显示调用它,但可显式禁用或启用它。
-用途:自动生成虚拟的列值;记录事件;收集统计数据;当DML发生在视图上时,能修改表中的数据;保证引用一致性;发布关于数据库事件、用户事件和SQL语句给订阅的应用程序;阻止工作时间之外的DML操作;阻止非法事务;解决约束中无法完成的复杂的商业或引用一致性规则。
-限制:
1)触发器除自治事务的触发器外通常不会执行事务控制语句。
2)不允许在触发器体中声明LONG或LONG RAW变量。
3)触发器调用的任何函数或者过程也不会执行事务控制语句,除非包括自治事务。
-创建触发器通用语法:
create [or replace] trigger trigger_name
{before|AFTER}trigger_eventontable_name --before|After 指明何时触发器执行。
[for each row] --指定触发器为行触发器,没有指定为‘语句触发器’。
[followsanother_trigger] --指定触发器被触发的顺序。适用于相同表上所定义的,并且在相同时间点会执行的触发器。
[ENABLE/DISABLE] --指定触发器在何种状态(启用|禁用)下创建,不指定时,默认启用。
[When condition]--指定执行触发器必须满足的条件。WHNE子句‘:NEW’|‘:OLD’不使用冒号作为前缀,直接使用NEW|OLD。
Declare
statements;
begin
statements;
EXCEPTION
statements;
end;
create [or replace] trigger trigger_name
{before|AFTER}trigger_eventontable_name --before|After 指明何时触发器执行。
[for each row] --指定触发器为行触发器,没有指定为‘语句触发器’。
[followsanother_trigger] --指定触发器被触发的顺序。适用于相同表上所定义的,并且在相同时间点会执行的触发器。
[ENABLE/DISABLE] --指定触发器在何种状态(启用|禁用)下创建,不指定时,默认启用。
[When condition]--指定执行触发器必须满足的条件。WHNE子句‘:NEW’|‘:OLD’不使用冒号作为前缀,直接使用NEW|OLD。
Declare
statements;
begin
statements;
EXCEPTION
statements;
end;
2.分类
按基于的对象:表触发器、视图触发器(instead of)、模式触发器、数据库触发器。
按时间点:before触发器、after触发器。
是否按行触发(仅针于DML触发器):行级触发器、语句级触发器。
3.DML触发器
-概览:
要么创建在表上,要么创建在视图上
简单或者复合
--简单触发器:before行级触发器、after行级触发器、before语句级触发器、after语句级触发器、在同一个对象上任意一类触发器可以有多个、但视图上只允许存在行级触发器。
--复合触发器:合并若干个简单触发器,但上述四种类型每种最多出现一个。
-条件断言,用于判断具体是哪种DML行为:inserting、updating、updating('fieldname')、deleting。
-相关名
-默认为NEW和OLD,可视为table%rowtype类型的变量