DML 触发器执行

更新日期: 2005 年 12 月 5 日

如果违反了约束,则永远不会执行 AFTER 触发器;因此,这些触发器不能用于任何可能防止违反约束的处理。

执行 INSTEAD OF 触发器,而不执行触发操作。在创建插入的删除的表(反映对基表所做的更改)之后,而在执行任何其他操作之前执行这些触发器。这些触发器在执行任何约束前执行,因此可执行预处理来补充约束操作。

为表定义的 INSTEAD OF 触发器对此表执行一条通常会再次激发该触发器的语句时,不会递归调用该触发器,而是如同表中没有 INSTEAD OF 触发器那样处理该语句,该语句将启动一系列约束操作和 AFTER 触发器执行。例如,如果 DML 触发器定义为表的 INSTEAD OF INSERT 触发器且该触发器对同一个表执行 INSERT 语句,则 INSTEAD OF 触发器执行的 INSERT 语句不会再次调用该触发器。该触发器执行的 INSERT 将启动用于执行约束操作的进程和触发为该表定义的所有 AFTER INSERT 触发器的进程。

为视图定义的 INSTEAD OF 触发器对该视图执行一条通常会再次激发 INSTEAD OF 触发器的语句时,不会递归调用该触发器,而是将语句解析为对该视图所依存的基表进行修改。在这种情况下,视图定义必须满足可更新视图的所有约束。有关可更新视图的定义,请参阅通过视图修改数据。例如,如果 DML 触发器定义为视图的 INSTEAD OF UPDATE 触发器且该触发器执行引用同一视图的 UPDATE 语句,则 INSTEAD OF 触发器执行的 UPDATE 语句不会再次调用该触发器,而是如同该视图没有 INSTEAD OF 触发器那样在视图中处理该触发器执行的 UPDATE 语句。必须将 UPDATE 更改的列解析为一个基表。对基表的每次修改都将应用约束并触发为该表定义的 AFTER 触发器。

DML 触发器的性能开销通常很低。运行 DML 触发器所花的时间大部分都用于引用其他表,这些表可能位于内存中,也可能位于数据库设备上。删除的插入的表始终位于内存中。触发器所引用的其他表的位置将确定操作所需的时间。

ms179304.note(zh-cn,SQL.90).gif注意:
建议不要在 DML 触发器中使用游标,因为这可能对性能产生负面影响。使用基于行集的逻辑(而非游标)可以设计影响多行的 DML 触发器。

DML 触发器执行和分区视图

在 SQL Server 2005 中,在分区视图下的表上触发 UPDATE 和 DELETE 触发器的方式与在 SQL Server 2000 中的触发方式有所不同。在 SQL Server 2000 中,当针对分区视图(无论是本地视图还是分布式视图)发出 UPDATE 或 DELETE 语句时,便会触发任何为该视图的基表定义的 UPDATE 或 DELETE 触发器。其中包括为不受更新或删除操作影响的表定义的触发器。在 SQL Server 2005 中,仅当为其定义触发器的基表受更新或删除操作影响时,才会触发 UPDATE 或 DELETE 触发器。此行为也适用于 AFTER 和 INSTEAD 触发器。

例如,假设分区视图 PV 是由表 T1 和表 T2 中的字段组成。另外,T1T2 都具有为它们定义的 UPDATE 触发器。在 SQL Server 2000 中,针对仅影响 T1 中行的 PV 发出的 UPDATE 语句将导致触发为 T1T2 定义的 UPDATE 触发器。在 SQL Server 2005 中,只会触发为 T1 定义的 UPDATE 触发器。

下表总结了此行为的更改。

针对本地分区视图的插入、更新或删除操作
  SQL Server 2000 SQL Server 2005

INSERT TRIGGER

仅针对受影响的表触发。

仅针对受影响的表触发。

UPDATE TRIGGER

针对为其定义此类触发器的分区视图下的所有表触发。

仅针对受影响的表触发。

DELETE TRIGGER

针对为其定义此类触发器的分区视图下的所有表触发。

仅针对受影响的表触发。

针对分布式分区视图的插入、更新或删除操作
  SQL Server 2000 SQL Server 2005

INSERT TRIGGER

仅针对分布式分区视图中受影响的表触发。如果表受到影响,则触发为本地实例和远程实例上的表定义的触发器。

仅针对分布式分区视图中受影响的表触发。如果表受到影响,则触发为本地实例和远程实例上的表定义的触发器。

UPDATE TRIGGER

针对为其定义此类触发器的分区视图下的所有表触发。

针对为其定义此类触发器的远程实例上的所有表触发。仅针对本地实例上受影响的表触发。

DELETE TRIGGER

针对为其定义此类触发器的分区视图下的所有表触发。

针对为其定义此类触发器的远程实例上的所有表触发。仅针对本地实例上受影响的表触发。

请参阅

概念

使用插入的和删除的表
级联引用完整性约束
使用嵌套触发器

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2005 年 12 月 5 日

新增内容:
  • 添加了“DML 触发器执行和分区视图”部分。