关于触发器难以理解的一个方面是当多个触发器被同一触发操作所影响时,这些触发器的触发顺序。是否触发了触发器竞争以及它们被触发的顺序取决于两件事情:触发器类型(BEFORE、INSTEAD OF 或 AFTER)和触发器范围(行级或语句级)。
UPDATE 语句可以修改多个表中的列值。触发器的触发顺序对于所有表都相同,但不能保证表的更新顺序。
对于行级触发器,BEFORE 触发器早于 INSTEAD OF 触发器触发,而 INSTEAD OF 触发器早于 AFTER 触发器触发。给定行的所有行级触发器在任何触发器为后继行触发之前触发。
对于语句级触发器,INSTEAD OF 触发器早于 AFTER 触发器触发。不支持语句级 BEFORE 触发器。
如果有竞争的语句级 AFTER 触发器和行级 AFTER 触发器,则语句级 AFTER 触发器在所有行级触发器完成后触发。
如果有竞争的语句级 INSTEAD OF 触发器和行级 INSTEAD OF 触发器,则行级触发器不触发。
为 AFTER STATEMENT 触发器创建的 OLD 和 NEW 临时表与基础性基表具有相同的模式、列名和数据类型。但是,这些表没有主键、外键或索引。OLD 和 NEW 临时表中的行顺序无法保证,可能与基表行的最初更新顺序不一致。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |