现在的位置: 首页 > 综合 > 正文

触发器(Triggers)

2012年10月28日 ⁄ 综合 ⁄ 共 1694字 ⁄ 字号 评论关闭

一个触发器有三个基本部件:触发事件或语句、触发器的限制、触发器动作。

触发事件或语句:为引起触发器激发的SQL语句,是对指定表INSERT、UPDATE或DELETE语句。

触发器限制:为一布尔表达式,当触发器激发时该条件必须为TRUE。触发器的限制是用WHEN子句来指定。

触发器的动作:为一个PL/SQL块(过程),由SQL语句和PL/SQL语句组成。当触发语句发出,触发器的限制计算得TRUE时,它被执行。在触发器动作的语句中,可使用触发器的处理的当前行的列值(新值、老值),使用形式为:

NEW.列名 引用新值

OLE.列名 引用老值

在定义触发器时可指定触发器动作执行次数:受触发语句影响每一行执行一次或是对触发语句执行一次。

对每一触发语句可有四种类型触发器:

行触发器:对受触发语句所影响的每一行,行触发器激发一次。

语句触发器:该类型触发器对触发语句执行一次,不管其受影响行数。

定义触发器可以指定触发时间,指定激发器动作的执行相对于触发语句执行之后或之前。

BEFORE触发器:该触发器执行触发器动作是在触发语句执行之前。

AFTER触发器:该触发器执行触发器动作是在触发语句执行之后。

一个触发器可处于两种不同的方式:使能触发器和使不能触发器。

使能触发器:只要当触发语句发出,触发器限制计算为TRUE,这种类型的触发器执行其触发动作。

使不能触发器:这种触发器即使其触发语句被发出,触发器限制计算为TRUE,也不执行触发器动作。

触发器的源代码存储在数据库中,在第一次执行时,触发器的源代码被编译,存储在共享池中。假如触发器从共享池中挤了,再使用时必须再重新编译。

 

触发器是一种自动执行响应数据库变化的程序。可以设置为在触发器事件之前或之后触发或执行。能够触发触发器事件的事件包括下面几种:

  DML事件
  DDL事件
  数据库事件

  DML事件触发器可以是语句或行级触发器。DML语句触发器在触发语句之前或之后触发DML行级触发器在语句影响的行变化之前或之后触发。用户可以给单一事件和类型定义多个触发器,但没有任何方法可以增强多触发器触发的命令。下表列出了用户可以利用的触发器事件:

事件 触发器描述
INSERT  当向表或视图插入一行时触发触发器
UPDATE  更新表或视图中的某一行时触发触发器
DELETE 从表或视图中删除某一行时触发触发器
CREATE 当使用CREATE语句为数据库或项目增加一个对象时触发触发器
ALTER 当使用ALTER语句为更改一个数据库或项目的对象时触发触发器
DROP 当使用DROP语句删除一个数据库或项目的对象时触发触发器
START 打开数据库时触发触发器,在事件后触发
SHUTDOWN  关闭数据库时触发,事件前触发
LOGON 当一个会话建立时触发,事件前触发
LOGOFF 当关闭会话时触发,事件前触发
SERVER 服务器错误发生时触发触发器,事件后触发

  创建触发器的语法如下:

CREATE [OR REPLACE] TRIGGER trigger_name
{before|after|instead of} event
ON {table_or_view_name|DATABASE}
[FOR EACH ROW[WHEN condition]]
trigger_body

  只有DML触发器(INSERT、UPDATE、DELETE)语句可以使用INSTEAD OF触发器并且只有表的DML触发器可以是BEFORE或AFTER触发器。

  象约束一样触发器可以被设置为禁用或启用来关闭或打开他们的执行体(EXECUTE),将触发器设置为禁用或启用使用ALTER TRIGGER语句:

ALTER TRIGGER trigger_name ENABLE;
ALTER TRIGGER trigger_name DISABLE;

  要禁用或启用表的所有触发器,使用ALTER TABLE语句

ALTER TRIGGER table_name DISABLE ALL TRIGGER;
ALTER TRIGGER table_name ENABLE ALL TRIGGER;

  删除触发器使用DROP TRIGGER

DROP TRIGGER trigger_name;

抱歉!评论已关闭.