web-dev-qa-db-fra.com

Comment changer l'ordre de tir des déclencheurs?

Vraiment j'utilise rarement des déclencheurs. J'ai donc rencontré un problème à la première fois. J'ai beaucoup de tables avec des déclencheurs (2 ou plus pour chaque table). J'aimerais savoir et changer l'ordre des déclencheurs de tir à chaque table. Est-il possible d'obtenir cette information?

Ajouté:

Voici un bon énoght article sur MSSQLTIPS J'ai trouvé.

12
garik

Vous pouvez utiliser l'instruction suivante pour répertorier tous les déclencheurs de chaque table.

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

Une fois que vous avez découvert tous les déclencheurs. Vous pouvez modifier manuellement la commande en utilisant SP_Settriggerorder

alt text

12
CoderHawk

IIRC Vous ne pouvez pas garantir exactement l'ordre qui déclenche (avec la même définition de quoi réagir à et quand) pour une action donnée contre une table, pour tout nombre donné de déclencheurs.

Vous pouvez cependant s'il y en a trois ou moins, comme vous pouvez utiliser sp_settriggerorder pour définir le premier à être premier, le dernier à être en dernier, et celui du milieu pour avoir une commande "indéfinie".

Si vos déclencheurs sont sensibles à l'ordre exécuté à cet égard indique souvent que votre conception devient plus complexe qu'il ne doit être (généralement en raison de la croissance organique) et peut bénéficier d'un refactoring.

12
David Spillett
-- 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
  ;
5
Jackson Jarvis