सभी विदेशी कुंजी को अक्षम और सक्षम करना
CREATE PROCEDURE pr_Disable_Triggers_v2
@disable BIT = 1
AS
DECLARE @sql VARCHAR(500)
, @tableName VARCHAR(128)
, @tableSchema VARCHAR(128)
-- List of all tables
DECLARE triggerCursor CURSOR FOR
SELECT t.TABLE_NAME AS TableName
, t.TABLE_SCHEMA AS TableSchema
FROM INFORMATION_SCHEMA.TABLES t
ORDER BY t.TABLE_NAME, t.TABLE_SCHEMA
OPEN triggerCursor
FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
SET @sql = 'ALTER TABLE ' + @tableSchema + '.[' + @tableName + '] '
IF @disable = 1
SET @sql = @sql + ' DISABLE TRIGGER ALL'
ELSE
SET @sql = @sql + ' ENABLE TRIGGER ALL'
PRINT 'Executing Statement - ' + @sql
EXECUTE ( @sql )
FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
END
CLOSE triggerCursor
DEALLOCATE triggerCursor
सबसे पहले, विदेशीकेयर्स कर्सर को सेलेक्ट स्टेटमेंट के रूप में घोषित किया जाता है जो विदेशी कुंजी और उनके टेबल नामों की सूची को इकट्ठा करता है। इसके बाद, कर्सर खोला जाता है और प्रारंभिक FETCH स्टेटमेंट निष्पादित किया जाता है। यह FETCH स्टेटमेंट पहली पंक्ति के डेटा को स्थानीय चर @foreignKeyName और @tableName में पढ़ेगा। जब एक कर्सर के माध्यम से लूपिंग करते हैं, तो आप 0 के मूल्य के लिए @@ FETCH_STATUS की जांच कर सकते हैं, जो इंगित करता है कि भ्रूण सफल था। इसका मतलब यह है कि लूप आगे बढ़ना जारी रखेगा इसलिए यह प्रत्येक क्रमिक विदेशी कुंजी को पंक्तियों से प्राप्त कर सकता है। @@ FETCH_STATUS कनेक्शन पर सभी कर्सर के लिए उपलब्ध है। इसलिए यदि आप कई कर्सर के माध्यम से लूप कर रहे हैं, तो FETCH स्टेटमेंट के तुरंत बाद स्टेटमेंट में @@ FETCH_STATUS का मान चेक करना महत्वपूर्ण है। @@ FETCH_STATUS कनेक्शन पर सबसे हाल के FETCH ऑपरेशन के लिए स्थिति को प्रतिबिंबित करेगा। @@ FETCH_STATUS के लिए मान्य मूल्य हैं:
0 = FETCH सफल रहा था
-1 = FETCH असफल रहा था
-2 - जिस पंक्ति को लाया गया था वह गायब है
लूप के अंदर, कोड अलग-अलग तरीके से ALTER TABLE कमांड बनाता है, जो इस बात पर निर्भर करता है कि इरादा विदेशी कुंजी बाधा को अक्षम करने या सक्षम करने के लिए है (CHECK या NOCHECK कीवर्ड का उपयोग करके)। फिर बयान को एक संदेश के रूप में मुद्रित किया जाता है ताकि इसकी प्रगति देखी जा सके और फिर कथन को निष्पादित किया जाए। अंत में, जब सभी पंक्तियों के माध्यम से पुनरावृत्त किया गया है, तो संग्रहीत कार्यविधि बंद हो जाती है और कर्सर को हटा देती है।
MSDN पत्रिका से अवरोध और ट्रिगर अक्षम करना देखें