Wie ändere ich die Feuerreihenfolge der Trigger?
-
16-10-2019 - |
Frage
Ich benutze wirklich selten Auslöser. Also habe ich zum ersten Mal ein Problem getroffen. Ich habe viele Tische mit Triggern (2 oder mehr für jeden Tisch). Ich würde gerne die Reihenfolge der Abfeuerauslöser für jeden Tisch kennen und ändern. Ist es möglich, diese Informationen zu erhalten?
HINZUGEFÜGT:
Hier ist ein guter Enoght Artikel über MSSQLTIPS Ich habe gefunden.
Lösung
Du kannst den ... benutzen folgen Anweisung zur Auflistung aller Auslöser in jeder Tabelle.
EXEC sp_MSForEachTable 'PRINT ''?''
EXEC sp_helptrigger ''?'''
Sobald Sie alle Trigger herausgefunden haben. Sie können die Reihenfolge manuell verwenden SP_SettriggerOrder
Andere Tipps
IIRC Sie können nicht genau die Reihenfolge garantieren, die (mit der gleichen Definition des Reagierens von und wann) für eine bestimmte Aktion gegen eine Tabelle für eine bestimmte Anzahl von Triggern ausgelöst wird.
Sie können jedoch, wenn es drei oder weniger gibt, wie Sie es verwenden können SP_SettriggerOrder Um den ersten zu setzen, um den ersten zu sein, der letzte war der letzte und der in der Mitte, um "undefinierte" Ordnung zu haben.
Wenn Ihre Auslöser empfindlich auf die Reihenfolge reagieren, die in diesem Fall häufig ausgeführt werden, zeigt dies häufig an, dass Ihr Design komplexer wird, als es sein muss (normalerweise aufgrund des organischen Wachstums) und möglicherweise von einigen Refactoring profitieren.
-- 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
;