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.

È stato utile?

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

alt text

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
  ;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top