Come modificare l'ordine di accensione di trigger?
-
16-10-2019 - |
Domanda
Davvero Io uso raramente trigger. Così ho incontrato un problema a prima volta. Ho un sacco di tavoli con i trigger (2 o più per ogni tavolo). Vorrei conoscere e modificare l'ordine di sparare trigger per ogni tabella. E 'possibile ottenere queste informazioni?
AGGIUNTO:
Ecco un buon enoght articolo su mssqltips ho trovato.
Soluzione
È possibile utilizzare la seguente dichiarazione per elencare tutti i trigger in ogni tabella.
EXEC sp_MSForEachTable 'PRINT ''?''
EXEC sp_helptrigger ''?'''
Una volta a scoprire tutti i trigger. È possibile modificare manualmente l'ordine utilizzando sp_settriggerorder
Altri suggerimenti
IIRC non si può garantire esattamente nell'ordine in cui trigger (con la stessa definizione di ciò che per reagire e quando) il fuoco per una determinata azione contro un tavolo, per un dato numero di trigger.
È possibile anche se ci sono tre o meno, come è possibile utilizzare sp_settriggerorder al set il primo essere il primo, l'ultimo a essere l'ultimo, e quello in mezzo per avere "indefinito" ordine.
Se i trigger sono sensibili all'ordine che vengono eseguite in questo spesso indica che il disegno è sempre più complessa di quello che deve essere (di solito a causa di una crescita organica) e può beneficiare di alcuni refactoring.
-- 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
;