真的,我很少使用触发器。所以我第一次遇到了一个问题。我有很多带有触发器的桌子(每张桌子2个或更多)。我想知道并更改每个桌子发射触发器的顺序。有可能获取此信息吗?

添加:

这是一个很好的enoght 有关MSSQLTIP的文章 我已经找到。

有帮助吗?

解决方案

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

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

一旦发现了所有触发因素。您可以使用 SP_SETTRIGGERORDER

alt text

其他提示

IIRC您无法准确保证触发器(对何时反应和何时反应的定义)向给定的动作发射针对任何给定数量的触发器的顺序。

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

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

-- 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
  ;
许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top