Tetikleyicilerin ateşleme sırası nasıl değiştirilir?


12

Gerçekten nadiren tetikleyicileri kullanıyorum. Bu yüzden ilk kez bir sorunla karşılaştım. Tetikleyiciler ile tablolar bir sürü var (her tablo için 2 veya daha fazla). Her tablo için ateşleme tetikleyicilerinin sırasını bilmek ve değiştirmek istiyorum. Bu bilgiyi almak mümkün mü?

KATMA:

İşte bulduğum mssqltips hakkında iyi bir makale .

Yanıtlar:


12

Her bir tablodaki tüm tetikleyicileri listelemek için aşağıdaki ifadeyi kullanabilirsiniz .

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

Bir kez tüm tetikleyicileri bulmak. Siparişi sp_settriggerorder kullanarak elle değiştirebilirsiniz

alternatif metin


2
"Isafter", aynı tetikleyicinin iki veya daha fazla tetikleyicinin yürütme sırası hakkında herhangi bir şey dikte etmek yerine, tetikleyicinin <hareket> INSTEAD OF <action> olarak tanımlandığını göstermez mi?
David Spillett

@David - evet! haklısın
CoderHawk

12

IIRC, verilen herhangi bir sayıda tetikleyici için bir tabloya karşı belirli bir eylem için (aynı zamanda ne tepki vermesi gerektiği ile aynı tanımla) tetikleme sırasını tam olarak garanti edemezsiniz.

Eğer üç ya da daha az varsa, sp_settriggerorder ilk ilki, sonuncusu son ve ortadaki "undefined" düzeni olacak şekilde ayarlamak için kullanabilirsiniz.

Tetikleyicileriniz bu sırada yürütülen sıraya duyarlıysa, tasarımınızın olması gerektiğinden (genellikle organik büyümeden dolayı) daha karmaşık hale geldiğini ve bazı yeniden düzenleme işlemlerinden yararlanabileceğini gösterir.


+1 haklısın, ben bu kodu (karmaşık ve çapraz bağlantıları vardır ...) refactor zorunda, ama ben ilk adım - soruşturma.
garik

5
-- 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
  ;

1
Bu oldukça kaygan görünüyor. @garik, bu ortamınızda çalışıyor mu? (BTW, başlangıç ​​SQL yorumu da kod bloğunun bir parçası olmalıdır.)
Nick Chammas

1
@Hiç haklısın. Birkaç dakika etrafına bakıyorum.
garik

@ Varsayılan olarak bu özellikler boştur. yani yürütürseniz, örneğin exec sp_settriggerorder @triggername = 'tr_xxx' , @order = 'Last' , @stmttype= 'DELETE'Jackson'ın sorgu sonucundaki sonucu ('X') görebiliriz. Teşekkürler, Jackson.
garik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.