2009-01-30 23 views
15

इस सवाल के लिए चलाता है बस के लिए एक ही सम्मिलित बहुत SQL Server 2005: T-SQL to temporarily disable a triggerMSSQL: अक्षम एक सम्मिलित

के समान हालांकि मैं भी आदेशों का एक बैच के लिए सभी ट्रिगर और नहीं निष्क्रिय करने के लिए नहीं करना चाहते हैं, लेकिन है।

मैं एक दुकान प्रणाली है जहाँ मूल लेखक एक ट्रिगर में कुछ आवेदन तर्क डाल से निपटने के लिए (बुरा विचार!)। जब तक आप मूल "प्रशासन फ्रंटेंड" की तुलना में किसी अन्य तरीके से डेटा डालने का प्रयास नहीं करते हैं, तब तक वह एप्लिकेशन तर्क ठीक काम करता है। मेरा काम "स्टेजिंग सिस्टम से आयात" उपकरण लिखना है, इसलिए मेरे पास सभी डेटा तैयार हैं। जब मैं इसे सम्मिलित करने का प्रयास करता हूं, तो ट्रिगर किसी उत्पादित उत्पाद के साथ मौजूदा उत्पाद कोड (पहचान संख्या आईडी आईडी नहीं) को ओवरराइट करता है। कोड उत्पन्न करने के लिए यह किसी अन्य तालिका में किसी प्रविष्टि की स्वत: जेनरेटेड आईडी का उपयोग करता है, ताकि मैं अपने बस डाले गए कॉलम को ढूंढने के लिए @@ पहचान के साथ भी काम न कर सकूं और वास्तविक उत्पाद कोड के साथ डाली गई पंक्ति को अपडेट कर सकूं।

किसी भी तरह से है कि मैं extremly अजीब कोड से बचने के लिए जाना (उत्पाद का नाम में कुछ यादृच्छिक वर्ण सम्मिलित करें और फिर इसे अद्यतन करने के लिए यादृच्छिक पात्रों के साथ पंक्ति खोजने की कोशिश) कर सकते हैं।

तो: के लिए केवल एक INSERT के लिए ट्रिगर (यहां तक ​​कि केवल एक) को अक्षम करने का कोई तरीका है?

+1

क्रिस्टोफ पद है कि जैसे वे वास्तव में आपकी समस्या का समाधान हो सकता है देखने के लिए समाधान की एक जोड़ी है - केवल आपके मामले में पता है कि तुम है कि एक करने के लिए अपने को स्वीकार कर लिया जवाब परिवर्तन के लिए तैयार कर रहे हैं बताना चाहता था। – SqlRyan

उत्तर

12

आप का उपयोग कर एक मेज पर चलाता निष्क्रिय कर सकते हैं:

ALTER TABLE MyTable DISABLE TRIGGER ALL 

लेकिन वह जो स्पष्ट रूप से एक बहुत ही बुरी बात है :-)

करना है सभी सत्रों के लिए यह करना होगा, न सिर्फ अपने वर्तमान कनेक्शन ..

सबसे अच्छा तरीका ट्रिगर को स्वयं बदलना होगा, इसलिए यदि इसे चलाने की आवश्यकता है, तो यह निर्णय लेता है, चाहे वह तालिका में "सम्मिलित प्रकार" ध्वज या किसी अन्य माध्यम से हो, यदि आप पहले से ही किसी प्रकार का संग्रह कर रहे हैं ।

+3

" जो स्पष्ट रूप से करने के लिए एक बहुत ही बुरी चीज है "-> यही कारण है कि मैं इसे नहीं करना चाहता;) – BlaM

+1

अच्छा .. फिर यह मत करो;) –

+2

खुशी है कि हम सभी उस पर सहमत हैं;) – andynormancx

1

आप SUSER_SNAME() के लिए जांच कर सकता है और वह भी तब प्रशासन दृश्यपटल के संदर्भ में चलते हैं?

+0

डेटाबेस का उपयोग करने के लिए केवल एक उपयोगकर्ता का उपयोग किया जाता है। तो दुर्भाग्य से: सं। – BlaM

5

ट्रिगर्स को अक्षम करने की बजाय आप ट्रिगर के व्यवहार को बदल नहीं सकते हैं। "InsertedFromImport" नामक प्रश्न में तालिका में एक नया नलिका कॉलम जोड़ें।

ट्रिगर में इतना है कि ट्रिगर की अपमानजनक बिट केवल पंक्तियों जहां "insertedFromImport" शून्य है पर चलता कोड बदल जाते हैं। जब आप अपने रिकॉर्ड्स को "insertedFromImport" को गैर-शून्य पर सेट करते हैं।

+0

मुझे वास्तव में यह पसंद आया क्योंकि यह बहुत साफ था। हालांकि, मैंने यह कॉलम अपडेट किया था या नहीं, यह जांचने के लिए कि यह कॉलम अपडेट किया गया था, जो कि अन्य कॉलम अपडेट के लिए ट्रिगर चला गया था, अगर नहीं (अद्यतन (डाला गया आयात करें) और EXISTS (शामिल डालें जहां से सम्मिलित किया गया है, जिसमें से आयात किया गया है, आयात न करें)) BEGIN' –

15

आप इस उपयोगी लग सकता है:

Disabling a Trigger for a Specific SQL Statement or Session

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

यदि आपको वास्तव में ऐसा करना है तो आपको यह सुनिश्चित करना होगा कि भविष्य में आपके द्वारा बनाए गए कोड भविष्य में लाइव एप्लिकेशन आपके द्वारा मैन्युअल रूप से डाले गए कोड के साथ संघर्ष नहीं करेंगे - मुझे लगता है कि वे अद्वितीय होना चाहिए।

अन्य दृष्टिकोण प्रणाली नया कोड जेनरेट करें और यदि आवश्यक किसी भी संबंधित डेटा अधिलेखित करने के लिए अनुमति देने के लिए है।

+0

दरअसल अंतिम लक्ष्य पूरी तरह से उत्पादन प्रणाली पर संपादन सुविधाओं को अक्षम करना है। अन्यथा कोड टकराव के बारे में नोट बहुत अच्छा है! – BlaM

0

यदि आप बल्क इन्टरेट का उपयोग करके सम्मिलित करते हैं, तो आप केवल सम्मिलित करने के लिए ट्रिगर्स को अक्षम कर सकते हैं।

मुझे यकीन है कि थोक डालने के लिए फ़ाइल सिस्टम पर डेटा फ़ाइल की आवश्यकता होगी ताकि आप टी-एसक्यूएल का उपयोग न कर सकें।

बल्क इन्टरर्ट का उपयोग करने के लिए आपको INSERT और व्यवस्थापक बल्क ऑपरेशन अनुमतियों की आवश्यकता है। यदि आप ट्रिगर्स या बाधाओं को अक्षम करते हैं, तो आपको वैकल्पिक तालिका अनुमति की भी आवश्यकता होगी।

यदि आप विंडोज प्रमाणीकरण का उपयोग कर रहे हैं, तो आपके विंडोज उपयोगकर्ता को फ़ाइल से पढ़ने की आवश्यकता होगी। यदि मिश्रित मोड प्रमाणीकरण का उपयोग करते हैं, तो SQL सर्वर सेवा खाते को फ़ाइल से पढ़ने की आवश्यकता होती है।

बल्क आयात का उपयोग करते समय आयात करते समय, ट्रिगर्स डिफ़ॉल्ट रूप से अक्षम होते हैं।

अधिक जानकारी: http://msdn.microsoft.com/en-us/library/ms188365.aspx

1

मैं कई चीजें हैं जो एक समस्या बना सकते हैं देखते हैं। पहले कई रिकॉर्ड आयात पर विचार करने के लिए ट्रिगर को बदलें। यह शायद आपकी समस्या को ठीक कर सकता है। ट्रिगर को बंद न करें क्योंकि यह सिर्फ आपके लिए नहीं है। यदि आपको ऐसा करने से पहले डेटाबेस को एकल उपयोगकर्ता उपयोगकर्ता मोड में रखना होगा और ऑफ़लाइन घंटों के दौरान अपना कार्य करना होगा।

अगला, किसी भी परिस्थिति में कभी भी मूल्य प्राप्त करने के लिए @@ पहचान का उपयोग न करें! इसके बजाय scope_identity का उपयोग करें। यदि @ टेबल पर ट्रिगर्स हैं जो पहचान फ़ील्ड के साथ अन्य तालिकाओं में आवेषण करते हैं तो @@ पहचान गलत मान वापस कर देगी। यदि आप अभी अपने सिस्टम के माध्यम से @@ पहचान का उपयोग कर रहे हैं (चूंकि हम जानते हैं कि आपके सिस्टम में ट्रिगर्स हैं), तो आपकी अपरोल्यूट पहली प्राथमिकता तुरंत आपके कोड में @@ पहचान के सभी उदाहरणों को ढूंढना और बदलना होगा। यदि आप नहीं करते हैं तो आपके पास गंभीर डेटा अखंडता समस्याएं हो सकती हैं। यह समस्या है जब तक यह तय नहीं हो जाता है "सभी काम बंद करो"।

जहां तक ​​जानकारी आप बस वापस डाला हो रही के रूप में, आप के हिस्से के रूप में एक batchid बनाने डालने और फिर एक स्तंभ batchid कहा जाता है (जो व्यर्थ है, इसलिए यह अन्य आवेषण को प्रभावित नहीं करेगा) तालिका में जोड़ने पर विचार करें। फिर आप बैचिड द्वारा जो भी डाला गया उसे वापस कॉल कर सकते हैं।

+0

SCOPE_IDENTITY के साथ संकेत के लिए धन्यवाद। मैं "पुरानेस्कूल" एसक्यूएल सर्वर 2000 (और पुराने) से आया हूं, जिसमें यह नहीं था। :) – BlaM

4

ट्रिगर को अक्षम करें, सम्मिलित करें, प्रतिबद्ध करें।

SET IDENTITY_INSERT Test ON 
GO 

BEGIN TRAN 

DISABLE TRIGGER trg_Test ON Test 

INSERT INTO Test (MyId, MyField) 
    VALUES (999, 'foo') 

ENABLE TRIGGER trg_Test ON Test 

COMMIT TRAN 

SET IDENTITY_INSERT Test OFF 
GO 
संबंधित मुद्दे