समारोह / संग्रहित प्रक्रिया निर्माण पर स्कीमा की जाँच अक्षम करना


17

मैं SQL Server 2008 R2 डेटाबेस में परिवर्तन को निष्पादित करने वाली प्रक्रिया को स्वचालित करने का प्रयास कर रहा हूं। प्रक्रिया मैं जगह में डाल दिया और मेरी संग्रहीत प्रक्रियाओं और कार्यों, साथ ही टेबल / कॉलम / डेटा को बदलने के लिए स्क्रिप्ट चलाने के लिए। दुर्भाग्य से, स्क्रिप्ट में से एक को पहले स्थान पर रखे जाने वाले कार्यों में से एक की आवश्यकता होती है। लेकिन मैं सभी संग्रहित खरीद / फ़ंक्शन परिवर्तनों को पहले नहीं चला सकता क्योंकि यह पहले टेबल / कॉलम / डेटा परिवर्तन स्क्रिप्ट से जोड़े जा रहे स्तंभों पर निर्भर करता है।

मैं सोच रहा था कि क्या फ़ंक्शन / एसपी की परिभाषा में उपयोग किए गए स्तंभों को मान्य किए बिना SQL सर्वर के बिना संग्रहीत प्रक्रियाओं और कार्यों को चलाना संभव था? मैंने देखने की कोशिश की, लेकिन इसे सक्षम करने के लिए कोई शर्त या आदेश नहीं मिला।


ऐसा लगता है कि आपको अपनी स्क्रिप्ट में ऑब्जेक्ट निर्माण को पुनर्व्यवस्थित करने की आवश्यकता हो सकती है।
थॉमस स्ट्रिंगर

@ अक्षर यह है कि एक परिवर्तन स्क्रिप्ट को वहां होने वाले एक फ़ंक्शन पर निर्भरता की आवश्यकता होती है, जो उस समय नहीं थी ... ऐसा करने के लिए मैन्युअल हस्तक्षेप की आवश्यकता होगी; मुझे कुछ और ऑटोमैटिक चाहिए था।
ब्रायन मेन्स

जवाबों:


20

आप संग्रहीत कार्यविधियाँ बना सकते हैं जो संदर्भ ऑब्जेक्ट्स अभी तक मौजूद नहीं हैं (जैसे टेबल और फ़ंक्शन)। आप संग्रहीत कार्यविधियाँ नहीं बना सकते हैं जो संदर्भ कॉलम जो अभी तक मौजूद वस्तुओं में मौजूद नहीं हैं। यह आस्थगित नाम संकल्प की दोधारी तलवार है - एसक्यूएल सर्वर आपको कुछ मामलों में संदेह का लाभ देता है, लेकिन सभी को नहीं। SET STRICT_CHECKS ON;जिन स्थानों पर यह काम करता है और इसके टूटने के स्थानों के बारे में कुछ विचार प्राप्त करने के लिए एरलैंड के विचारों को देखें :

http://www.sommarskog.se/strict_checks.html

(और आप उसके बाद के ध्रुवीय को कैसे पसंद करेंगे - आप अस्तित्व की परवाह किए बिना कुछ भी संकलित करने की अनुमति देना चाहते हैं, और वह चाहता है कि हर एक कॉलम या टेबल की जाँच की जाए।)

इसकी कोई सेटिंग नहीं है, SET DEFERRED_NAME_RESOLUTION OFF;हालांकि इसके लिए कहा गया है:

http://connect.microsoft.com/sql/127152

और जैसे कोई सेटिंग नहीं है IGNORE ALL_RESOLUTION;


आप इसे कुछ तरीकों से प्राप्त कर सकते हैं, जिनमें शामिल हैं:

(ए) प्रभावित संग्रहीत प्रक्रिया (नों) में गतिशील एसक्यूएल का उपयोग करें।

(b) CREATE PROCEDUREइसमें कुछ नहीं के साथ एक स्टब का निर्माण करें , फिर अपनी स्क्रिप्ट के बाकी हिस्सों को चलाएं, फिर एक ALTER PROCEDUREवास्तविक शरीर को चलाएं (संक्षेप में, दो चरणों में प्रक्रिया को तैनात करें)।

(c) अपने परिनियोजन टूल को संचालन के क्रम के बारे में और अधिक स्मार्ट बनाते हैं। यदि तालिका परिवर्तनों को किसी फ़ंक्शन की उपस्थिति की आवश्यकता होती है, तो स्क्रिप्ट उन परिवर्तनों को अंतिम बनाती है। RedGate की SQL तुलना जैसे स्कीमा तुलना उपकरण उचित निर्भरता क्रम में आपके लिए स्क्रिप्ट बनाने के बारे में बहुत अच्छे हैं। आप उल्लेख नहीं करते हैं कि आप किस उपकरण का उपयोग कर रहे हैं, लेकिन यदि यह ऐसा नहीं कर रहा है ...

(d) मार्टिन स्मिथ के यहाँ एक दिलचस्प काम है , लेकिन मैंने इसके साथ नहीं खेला है।


वाह, मार्टिन स्मिथ हैक शानदार ढंग से चतुर है। मैं इसे अभी उपयोग कर गंदा महसूस करूंगा, लेकिन मेरे 20 के दशक की शुरुआत में।
जॉन ज़ब्रोस्की

1

आप एक संग्रहीत कार्यविधि बना सकते हैं जो पहले प्रश्न में ऑब्जेक्ट को हटाता है या उसका नाम बदल देता है और फिर गतिशील SQL के रूप में आपकी मूल संग्रहीत प्रक्रिया चलाता है। इस तरह आपको डायनेमिक SQL का उपयोग करने के लिए वास्तविक संग्रहीत कार्यविधि को फिर से लिखना नहीं पड़ता है।

नीचे दिया गया कोड एक संग्रहीत प्रक्रिया चलाता है जो उन स्तंभों को संदर्भित करता है जो अभी तक मौजूद नहीं हैं (Expense_Super_Compare)

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

exec('exec dbo.Expense_Super_Compare');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.