Bagaimana cara mengubah urutan pemicu?

12

Sebenarnya saya jarang menggunakan pemicu. Jadi saya bertemu masalah pada saat pertama. Saya memiliki banyak tabel dengan pemicu (2 atau lebih untuk setiap tabel). Saya ingin tahu dan mengubah urutan pemicu untuk setiap meja. Apakah mungkin mendapatkan informasi ini?

TAMBAH:

Ini adalah artikel enoght yang bagus tentang mssqltips yang saya temukan.

garik
sumber

Jawaban:

12

Anda dapat menggunakan pernyataan berikut untuk mencantumkan semua pemicu di setiap tabel.

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

Setelah Anda mengetahui semua pemicunya. Anda dapat mengubah urutan secara manual menggunakan sp_settriggerorder

teks alternatif

CoderHawk
sumber
2
Bukankah "isafter" hanya mengindikasikan bahwa pemicu didefinisikan sebagai SETELAH <action> daripada BUKAN <action>, daripada mendikte apa pun tentang urutan eksekusi dua atau lebih pemicu dari jenis yang sama?
David Spillett
@ David - ya! Anda benar
CoderHawk
12

IIRC Anda tidak bisa benar-benar menjamin urutan yang memicu (dengan definisi yang sama tentang apa yang harus bereaksi dan kapan) menembak untuk tindakan yang diberikan terhadap tabel, untuk sejumlah pemicu yang diberikan.

Anda dapat melakukannya jika ada tiga atau kurang, karena Anda dapat menggunakan sp_settriggerorder untuk mengatur yang pertama menjadi yang pertama, yang terakhir menjadi yang terakhir, dan yang di tengah memiliki urutan "tidak terdefinisi".

Jika pemicu Anda peka terhadap urutan yang dieksekusi dalam hal ini sering menunjukkan bahwa desain Anda menjadi lebih kompleks daripada yang seharusnya (biasanya karena pertumbuhan organik) dan mungkin mendapat manfaat dari beberapa refactoring.

David Spillett
sumber
+1 Anda benar, saya harus memperbaiki kode ini (rumit dan memiliki tautan silang ...), tetapi saya pada langkah pertama - penyelidikan.
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
  ;
Jackson Jarvis
sumber
1
Ini terlihat sangat apik. @ garik, apakah ini bekerja di lingkungan Anda? (BTW, komentar SQL awal juga harus menjadi bagian dari blok kode.)
Nick Chammas
1
@Nick kamu benar. Saya melihat-lihat selama beberapa menit.
garik
@Nick secara default, properti ini kosong. jadi jika dijalankan, misalnya exec sp_settriggerorder @triggername = 'tr_xxx' , @order = 'Last' , @stmttype= 'DELETE'kita dapat melihat hasil ('X') dalam hasil kueri Jackson. Terima kasih, Jackson.
garik