ट्रिगर्स के फायरिंग ऑर्डर को कैसे बदलें?


12

वास्तव में मैं शायद ही कभी ट्रिगर्स का उपयोग करता हूं। इसलिए मैं पहली बार एक समस्या से मिला। मेरे पास ट्रिगर्स के साथ बहुत सी टेबल हैं (हर टेबल के लिए 2 या अधिक)। मैं जानना चाहूंगा कि हर टेबल के लिए फायरिंग ट्रिगर्स का क्रम बदल दिया जाए। क्या यह जानकारी प्राप्त करना संभव है?

जोड़े गए:

यहाँ mssqltips पर एक अच्छा enoght लेख मिला है।

जवाबों:


12

आप प्रत्येक तालिका में सभी ट्रिगर को सूचीबद्ध करने के लिए निम्न कथन का उपयोग कर सकते हैं ।

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

एक बार जब आप सभी ट्रिगर का पता लगा लेते हैं। आप sp_settriggerorder का उपयोग करके मैन्युअल रूप से ऑर्डर बदल सकते हैं

वैकल्पिक शब्द


2
क्या "isafter" केवल संकेत नहीं देता है कि ट्रिगर को AFTER <एक्शन> के रूप में परिभाषित किया गया है, बल्कि एक ही प्रकार के दो या अधिक ट्रिगर्स के निष्पादन आदेश के बारे में कुछ भी निर्धारित करने के बजाय, <कार्रवाई का INSTEAD "है?
डेविड स्पिललेट 12

@ डेविड - हाँ! आप सही हैं
CoderHawk

12

IIRC आप उस आदेश की गारंटी नहीं दे सकते हैं जो ट्रिगर के किसी भी दिए गए नंबर के लिए, किसी तालिका के विरुद्ध दी गई कार्रवाई के लिए आग लगने पर (जिस पर क्या और कब प्रतिक्रिया देनी है, उसी परिभाषा के साथ)।

हालाँकि, यदि आप तीन या उससे कम हैं, तो आप sp_settriggerorder का उपयोग कर सकते हैं कि पहले सेट करने के लिए पहले हो, आखिरी आखिरी हो, और बीच में "अपरिभाषित" क्रम हो।

यदि आपके ट्रिगर्स उस आदेश के प्रति संवेदनशील हैं जो अक्सर निष्पादित होते हैं, तो यह इंगित करता है कि आपका डिज़ाइन अधिक जटिल हो रहा है, क्योंकि इसे होना चाहिए (आमतौर पर कार्बनिक विकास के कारण) और कुछ रिफैक्टिंग से लाभ हो सकता है।


+1 आप सही हैं, मुझे इस कोड को रिफ्लेक्टर करना है (यह जटिल है और इसमें क्रॉस लिंक हैं ...), लेकिन मैं पहले चरण में हूं - जांच।
गणक

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
यह बहुत चालाक लग रहा है। @garik, क्या यह आपके पर्यावरण पर काम करता है? (बीटीडब्लू, शुरुआती एसक्यूएल टिप्पणी भी कोड ब्लॉक का हिस्सा होना चाहिए।)
निक चामास

1
@ आप सही हैं। मैं इसके आसपास कुछ मिनटों के लिए देख रहा हूं।
गरिक

@ डिफ़ॉल्ट रूप से क्लिक करें, ये गुण खाली हैं। इसलिए यदि निष्पादित होता है, उदाहरण के लिए exec sp_settriggerorder @triggername = 'tr_xxx' , @order = 'Last' , @stmttype= 'DELETE'हम जैक्सन के प्रश्न परिणाम में परिणाम ('X') देख सकते हैं। धन्यवाद, जैक्सन।
गरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.