Firebird数据库
Firebird语言参考--触发器程序
2020-03-20 08:22:31

      触发器是另一种可执行代码形式,存储在数据库的元数据中被服务器执行。触发器不能被直接调用。当数据更改事件发生涉及一个特定的表或视图时,它被自动调用(“激发”)。

 

       一个触发器仅应用于一个表或视图,且仅应用于事件中的一个阶段(事件之前或之后)。一个单一触发器被书写以供触发只有在发生一个特定的数据更改事件(插入/更新/删除)时,或者它可能被书写以应用于其中的多个事件。

 

        一个DML触发器在事务上下文中被执行,而数据更改的DML语句是在正在运行的。对于响应数据库事件的触发器,规则是不同的:对于其中一些触发器,是默认事务已启动。

 

 

        可以为每个阶段-事件组合定义多个触发器,它们被执行的顺序可以使用触发器定义中的可选位置参数显式地指定“触发顺序”。有32,767个数字可以选择。位置数最低的触发器首先触发。

 

        如果一个POSITION子句被省略,或多个匹配事件段触发器拥有相同的位置序号,那么触发器将以名称的字母顺序来触发。


 

        DML触发器是当DML操作更改数据状态时触发的触发器:修改表中的行、插入新行或删除行。可以为表和视图定义它们。

 

触发器选项

 

对于表和视图的事件-阶段组合,有6个基本选项:

 

       在插入新行之前(BEFORE INSERT)
       在插入新行之后(AFTER INSERT)
       在更新新行之前(BEFORE UPDATE)
       在更新新行之后(AFTER UPDATE)
       在删除新行之前(BEFORE DELETE)
       在删除新行之后(AFTER DELETE)

 

       这些基本形式用于创建单阶段/单事件触发器。Firebird还支持创建形式为一个阶段和多个事件的触发器,BEFORE INSERT OR UPDATE OR DELETE,例如,或 AFTER UPDATE OR DELETE: 这种组合是可以选择的。

 

注意
"多阶段"触发器中,如BEFORE OR AFTER...,是不可能的

 

OLD 和 NEW上下文变量

 

       对于DML触发器,Firebird引擎提供访问OLD和NEW集合上下文变量。每一个都是整行值的数组:一个用于在数据更改事件之前的值(在BEFORE阶段)

 

       一个用于事件后的值(在AFTER阶段)。它们在语句中被引用分别使用NEW.column_name和OLD.column_name格式。列名可以是表中定义的任意列,而不仅仅是那些正在更新的列。


OLD 和 NEW变量是遵循一规则的:

 

        • 在所有触发器中OLD是只读的
        • 在BEFORE UPDATE 和 BEFORE INSERT中NEW值是可读/写的,除它是一个计算(COMPUTED BY)列
        • 在INSERT触发器中,引有OLD变量是无效的,将抛出异常
        • 在DELETE触发器中,引有NEW变量是无效的,将抛出异常
         • 在所有AFTER触发器中,NEW变量是只读的

 

(这个可以算是Firebird的一个特殊功能。译者注。)

 

一个触发器能被定义的如下事件同一个数据库或事务事件关联起来

 

连接到数据库(ON CONNECT)
在执行触发器之前,将自动启动默认事务

断开与数据库的连接(ON DISCONNECT)
在执行触发器之前,将自动启动默认事务

当事务启动时(ON TRANSACTION START)
触发器被执行在当前事务下文中

当事务被提交时(ON TRANSACTION COMMIT)
触发器被执行在当前事务下文中

当事务被取消时(ON TRANSACTION ROLLBACK)
触发器被执行在当前事务下文中



语法:
CREATE TRIGGER trigname {

|
| }
AS
[]
BEGIN
[]
END
::= FOR {tablename | viewname}
[ACTIVE | INACTIVE]
{BEFORE | AFTER}
[POSITION number]
::= [ACTIVE | INACTIVE]
{BEFORE | AFTER}
[POSITION number]
ON {tablename | viewname}
::= [ACTIVE | INACTIVE]
ON db_event
[POSITION number]
::= [OR
[OR ]]
::= { INSERT | UPDATE | DELETE }
::=
CONNECT
| DISCONNECT
| TRANSACTION START
| TRANSACTION COMMIT
| TRANSACTION ROLLBACK

 

       头部必须包含一个唯一的名称,不能同已有的触发器同名.它必须包括一个或多个将触发这个触发器的事件。此外,对于 DML 触发器,必须指定事件阶段和"拥有"触发器的表或视图的名称。
       触发器的正文开始部分可以由局部变量和游标(如果有)的声明来组成。在一个封闭主BEGIN...END包装中将是 PSQL 语句的一个或多个块,这些块可能为空。

 

更多关于创建触发器的内容参阅:CREATE TRIGGER在第5章中数据定义(DDL)语句

 

 

      修改状态,阶段,表或视图事件,触发位置和代码在DML触发器的正文中都是可能的。然而不能将一个DML触发器修改转换为一个数据库触发器,反之亦不可。任何未指定的元素由ALTER TRIGGER保持不变。可选语句CREATE OR ALTER TRIGGER和RECREATE TRIGGER将完全取代原来的触发器定义。

语法:
ALTER TRIGGER trigname
[ACTIVE | INACTIVE]
[{BEFORE | AFTER} ]
[POSITION number]
[
AS
[]
BEGIN
[]
END
]
::=
[OR [OR ]]
::= { INSERT | UPDATE | DELETE }
::=
CONNECT
| DISCONNECT
| TRANSACTION START
| TRANSACTION COMMIT
| TRANSACTION ROLLBACK

 

      更多关于修改触发器的内容参阅:ALTER TRIGGER, CREATE OR ALTER TRIGGER, RECREATE TRIGGER在第5章中数据定义(DDL)语句

 

 

DROP TRIGGER语句通常用于删除存储的程序
语法(完整的):
DROP TRIGGER trigname;
更多关于删除触发器的内容参阅:DROP TRIGGER在第5章中数据定义(DDL)语句

本文档属于<Firebird数据库语言参考中文版2.5>一部分,由海钛瑞OA办公系统研发团队翻译制作,转载请在开始处标明来自于http://www.hitai.com.欢迎交流。