如何更改触发器的触发顺序?


Answers:


12

您可以使用以下语句列出每个表中的所有触发器。

EXEC sp_MSForEachTable 'PRINT ''?'' 
EXEC sp_helptrigger ''?'''

一旦找到所有触发器。您可以使用sp_settriggerorder手动更改顺序

替代文字


2
难道不是“ isafter”仅表示将触发器定义为AFTER <action>而不是INSTEAD OF <action>,而不是针对两个或多个相同类型的触发器的执行顺序进行规定吗?
David Spillett

@David-是的!您说得对
CoderHawk 2011年

12

对于任何给定数量的触发器,IIRC您都不能完全保证针对表的给定操作触发的触发顺序(具有相同的定义以及对什么时候做出反应)。

但是,如果有三个或更少,则可以使用sp_settriggerorder将第一个设置为第一个,最后一个设置为最后一个,而中间的一个设置为“未定义”。

如果触发器对执行的顺序敏感,这通常表明您的设计变得比实际需要的复杂(通常是由于自然增长),并且可能会受益于某些重构。


+1您是对的,我必须重构此代码(它很复杂并且具有交叉链接...),但是我处于第一步-调查。
加里克2011年

5
-- List tables with triggers and their firing order.  By Jackson Jarvis.
SELECT [tbl].[name] AS 'Table'
      ,[trg].[name] AS 'Trigger'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstInsertTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Insert First'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastInsertTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Insert Last'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstUpdateTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Update First'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastUpdateTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Update Last'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstDeleteTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Delete First'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastDeleteTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Delete Last'
  FROM            [sysobjects] AS [trg] WITH (NOLOCK)
       INNER JOIN [sysobjects] AS [tbl] WITH (NOLOCK)
            ON  [trg].[parent_obj] = [tbl].[id]
  WHERE [trg].[TYPE] IN (N'TR')
  ORDER BY
       [tbl].[name] ASC
      ,[trg].[name] ASC
  ;

1
这看起来很漂亮。@garik,这对您的环境有效吗?(顺便说一句,开始的SQL注释也应该是代码块的一部分。)
Nick Chammas

1
@尼克,你是对的。我环顾了几分钟。
加里克2011年

@Nick默认情况下,这些属性为空。因此,如果执行,例如, exec sp_settriggerorder @triggername = 'tr_xxx' , @order = 'Last' , @stmttype= 'DELETE'我们可以在Jackson的查询结果中看到结果('X')。谢谢,杰克逊。
加里克2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.