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

gar*_*rik 12 trigger sql-server-2005 sql-server-2008

我真的很少使用触发器。所以我第一次遇到了一个问题。我有很多带有触发器的表(每个表有 2 个或更多)。我想知道并更改每个表的触发顺序。是否有可能获得这些信息?

添加:

这是我发现的关于 mssqltips 的一篇很好的文章

Cod*_*awk 12

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

EXEC sp_MSForEachTable 'PRINT ''?'' 
EXEC sp_helptrigger ''?'''
Run Code Online (Sandbox Code Playgroud)

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

替代文字

  • “isafter”不只是表示触发器被定义为 AFTER <action> 而不是 INSTEAD OF <action>,而不是规定有关两个或多个相同类型触发器的执行顺序的任何内容? (2认同)

Dav*_*ett 12

IIRC 您不能完全保证触发器的顺序(具有相同定义的响应内容和时间),对于任何给定数量的触发器,针对表的给定操作触发。

如果有三个或更少,您可以,因为您可以使用sp_settriggerorder将第一个设置为第一个,将最后一个设置为最后一个,将中间的一个设置为“未定义”顺序。

如果您的触发器对在此执行的顺序敏感,通常表明您的设计变得比它需要的更复杂(通常是由于有机增长),并且可能会从一些重构中受益。


小智 6

-- 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
  ;
Run Code Online (Sandbox Code Playgroud)