Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 存储过程和触发器 » 使用过程、触发器和批处理

 

触发器简介

触发器是一种特殊形式的存储过程,它在修改数据的语句执行时自动执行。只要参照完整性和其它声明性约束不足够,就可以使用触发器。请参见确保数据完整性CREATE TABLE 语句

您可能要实施涉及更详细检查、形式更为复杂的参照完整性,或者对新数据实施检查,但允许旧数据违反约束。触发器的另一个用途是记录与数据库表有关的活动,而与使用数据库的应用程序无关。

注意

有三个特殊语句,触发器不在其后触发:LOAD TABLE、TRUNCATE 和 WRITETEXT。请参见LOAD TABLE 语句TRUNCATE 语句WRITETEXT 语句 [T-SQL]

触发器执行权限

要执行触发器必须要有关联表或视图所有者的权限,发出使触发器触发的操作的用户 ID 不能执行触发器。触发器可以修改用户无法直接修改的表中各行。

可以通过指定 -gf 服务器选项或设置 fire_triggers 选项防止触发触发器。请参见:

触发器类型

SQL Anywhere 支持以下触发器类型:

  • BEFORE 触发器   BEFORE 触发器在执行触发操作之前触发。可为表定义 BEFORE 触发器,但不能为视图定义。

  • AFTER 触发器   AFTER 触发器在完成触发操作后触发。可为表定义 AFTER 触发器,但不能为视图定义。

  • INSTEAD OF 触发器   INSTEAD OF 触发器是替代触发操作触发的条件触发器。可为表和视图(实例化视图除外)定义 INSTEAD OF 触发器。请参见INSTEAD OF 触发器

有关定义触发器的语法的完整说明,请参见CREATE TRIGGER 语句

触发事件

可以对以下一种或多种触发事件定义触发器:

操作 说明
INSERT 只要有新行插入到与触发器关联的表中,就调用触发器。
DELETE 只要删除了关联表中的行,就调用触发器。
UPDATE 只要更新了关联表中的行,就调用触发器。
UPDATE OF column-list 只要更新了关联表中的行,因而修改了 column-list 中的列,就调用触发器。

您可以为需要处理的每个事件分别编写触发器,如果您有一些共享操作和一些取决于事件的操作,也可以为所有事件创建一个触发器并使用 IF 语句辨别所发生的操作。请参见触发器操作条件

触发时间

触发器可以是行级别语句级别

  • 行级别触发器为所更改的每一行执行一次。行级别触发器在更改行之前或之后执行。

    触发器通过变量获得受影响行新旧映像的列值。

  • 语句级别触发器在整个触发语句完成后执行。触发器通过表示受触发语句影响行的新旧映像的临时表来获得这些行。SQL Anywhere 不支持语句级 BEFORE 触发器。

触发器执行时间灵活这一特点对于依赖于在执行时执行(或不执行)参照完整性操作(例如级联更新或删除)的触发器而言十分有用。

如果在触发器执行时发生错误,则触发该触发器的操作将失败。INSERT、UPDATE 和 DELETE 是原子操作。在这些操作失败时,该语句的所有结果(包括触发器的结果以及这些触发器调用的任何过程的结果)都恢复为其操作前状态。请参见原子复合语句


创建触发器
执行触发器
变更触发器
删除触发器
触发器执行权限
有关触发器的高级信息