トリガーの発動順序を変更するにはどうすればよいですか?
-
16-10-2019 - |
質問
実際、私はトリガーをほとんど使用しません。そこで初めて問題に遭遇しました。トリガーを備えたテーブルが多数あります (テーブルごとに 2 つ以上)。すべてのテーブルのトリガーの起動順序を知り、変更したいと考えています。この情報を入手することは可能でしょうか?
追加した:
これで十分です mssqltips に関する記事 見つけた。
解決
使用できます 続く 各テーブルのすべてのトリガーをリストするステートメント。
EXEC sp_MSForEachTable 'PRINT ''?''
EXEC sp_helptrigger ''?'''
すべてのトリガーを見つけたら。使用して注文を手動で変更できます SP_SETTRIGGERORDER
他のヒント
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
;
所属していません dba.stackexchange