質問

実際、私はトリガーをほとんど使用しません。そこで初めて問題に遭遇しました。トリガーを備えたテーブルが多数あります (テーブルごとに 2 つ以上)。すべてのテーブルのトリガーの起動順序を知り、変更したいと考えています。この情報を入手することは可能でしょうか?

追加した:

これで十分です mssqltips に関する記事 見つけた。

役に立ちましたか?

解決

使用できます 続く 各テーブルのすべてのトリガーをリストするステートメント。

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

すべてのトリガーを見つけたら。使用して注文を手動で変更できます SP_SETTRIGGERORDER

alt text

他のヒント

IIRC では、テーブルに対する特定のアクション、および任意の数のトリガーに対して、トリガーが (いつ、何に反応するかの同じ定義で) 起動される順序を正確に保証することはできません。

ただし、3 つ以下の場合は、次のようにすることができます。 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