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 错误。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |