技术开发 频道

ORACLE PL/SQL编程之八:把触发器说透

  8.2 创建触发器

  创建触发器的一般语法是:

CREATE [OR REPLACE] TRIGGER trigger_name

  {BEFORE | AFTER }

  {INSERT | DELETE | UPDATE [OF column [, column …]]}

  [
OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]

  
ON [schema.]table_name | [schema.]view_name

  [REFERENCING {OLD [
AS] old | NEW [AS] new| PARENT as parent}]

  [
FOR EACH ROW ]

  [WHEN condition]

  PL
/SQL_BLOCK | CALL procedure_name;

  其中:

  BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。

  FOR EACH ROW选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操走影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器。

  REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。

  WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。

  当一个基表被修改( INSERT, UPDATE, DELETE)时要执行的存储过程,执行时根据其所依附的基表改动而自动触发,因此与应用程序无关,用数据库触发器可以保证数据的一致性和完整性。

  每张表最多可建立12 种类型的触发器,它们是:

 BEFORE INSERT

  BEFORE INSERT
FOR EACH ROW

  AFTER INSERT

  AFTER INSERT
FOR EACH ROW

  BEFORE UPDATE

  BEFORE UPDATE
FOR EACH ROW

  AFTER UPDATE

  AFTER UPDATE
FOR EACH ROW

  BEFORE DELETE

  BEFORE DELETE
FOR EACH ROW

  AFTER DELETE

  AFTER DELETE
FOR EACH ROW

  8.2.1 触发器触发次序

  1. 执行 BEFORE语句级触发器;

  2. 对与受语句影响的每一行:

  执行 BEFORE行级触发器

     执行 DML语句

  执行 AFTER行级触发器

  3. 执行 AFTER语句级触发器

0
相关文章