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

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - SQL 的用法 » 存储过程、触发器、批处理和用户定义的函数 » 触发器 » 有关触发器的高级信息

 

INSTEAD OF 触发器

INSTEAD OF 触发器不同于 BEFORE 和 AFTER 触发器,因为当 INSTEAD OF 触发器触发时,会跳过触发操作而执行指定的操作。

INSTEAD OF 触发器独有的功能和限制列表如下:

  • 对于给定表中的每个触发事件,只能有一个 INSTEAD OF 触发器。

  • 可为表或视图定义 INSTEAD OF 触发器。但不能对实例化视图定义 INSTEAD OF 触发器,因为在实例化视图上不能执行 DML 操作(例如 INSERT、DELETE 和 UPDATE 语句)。

  • 当定义 INSTEAD OF 触发器时不能指定 ORDER 或 WHEN 子句。

  • 不能为 UPDATE OF column-list 触发事件定义 INSTEAD OF 触发器。

  • INSTEAD OF 触发器是否执行递归取决于该触发器的目标是基表还是视图。对于视图,发生递归;对于基表,则不发生。就是说,如果 INSTEAD OF 触发器在定义触发器的基表上执行 DML 操作,这些操作不会使触发器触发(包括 BEFORE 或 AFTER 触发器)。如果目标为视图,则在该视图上执行的操作会触发所有触发器。

  • 如果表中定义了 INSTEAD OF 触发器,则不能对该表执行带有 ON EXISTING 子句的 INSERT 语句。尝试此操作将返回 SQLE_INSTEAD_TRIGGER 错误。

  • 不能对使用 WITH CHECK OPTION 定义(或嵌套在以此方式定义的其它视图中)的视图,以及包含对其定义的 INSTEAD OF INSERT 触发器的视图执行 INSERT 语句。对于 UPDATE 和 DELETE 语句,这点也同样适用。尝试此操作将返回 SQLE_CHECK_TRIGGER_CONFLICT 错误。

  • 如果由于执行了定位更新、定位删除、PUT 语句或宽插入操作导致 INSTEAD OF 触发器被触发,则返回 SQLE_INSTEAD_TRIGGER_POSITIONED 错误。

 使用 INSTEAD OF 触发器更新不可更新的视图
 另请参见