SQL सर्वर से असेंबली ड्रॉप किए बिना CLR असेंबली को अद्यतन करने के लिए कैसे करें


18

SQL सर्वर (2008 R2) में असेंबली को ड्रॉप और री-क्रिएट करने के बिना मैं CLR फ़ंक्शन (या प्रक्रिया) असेंबली dll को कैसे अपडेट कर सकता हूं?

जैसा कि यह अब खड़ा है अगर मैं एक विधानसभा को अपडेट करता हूं (उदाहरण के लिए एक नया फ़ंक्शन जोड़ने के लिए), SQL सर्वर तब तक अद्यतन dll का सम्मान नहीं करेगा जब तक मैं असेंबली को नहीं छोड़ता:

DROP ASSEMBLY CLRFunctions

Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.

लेकिन इससे पहले कि मैं विधानसभा को गिरा सकता हूं, मुझे पहले उन सभी कार्यों को छोड़ देना चाहिए जो इसे संदर्भित करते हैं:

DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic

और फिर मैं विधानसभा को छोड़ सकता हूं:

DROP ASSEMBLY CLRFunctions

अब मुझे विधानसभा बनाना है :

CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';

और अब मुझे उन सभी यूडीएफ की घोषणा का शिकार करना है जो मुझे हटाने से पहले पंजीकृत किए गए थे।

मैं इसके बजाय एक असेंबली को अपडेट करूंगा , और SQL सर्वर का उपयोग करना शुरू कर देगा।


अद्यतन : मैं बेतरतीब ढंग DBCC FREEPROCCACHEसे एक "recompile" की कोशिश की , लेकिन SQL सर्वर अभी भी पुराने कोड का उपयोग करता है।

अद्यतन : मैंने असेंबली dll को हटा दिया CLRFunctions.dll, और SQL सर्वर अभी भी कोड को चलाने में सक्षम है (बिना कोड जो असंभव होना चाहिए)।

जवाबों:


16

मुझे लगता है कि आप ढूंढ रहे हैं alter assembly। BOL से:

यदि FROM क्लॉज निर्दिष्ट है, तो ALS ASSEMBLY प्रदान किए गए मॉड्यूल की नवीनतम प्रतियों के संबंध में विधानसभा को अपडेट करता है। चूँकि CLR फ़ंक्शंस हो सकते हैं, संग्रहीत कार्यविधियाँ, ट्रिगर्स, डेटा प्रकार और उपयोगकर्ता-परिभाषित कुल कार्य SQL सर्वर के उदाहरण में जो पहले से ही असेंबली के विरुद्ध परिभाषित हैं, ALTER ASSEMBLY स्टेटमेंट उन्हें असेंबली के नवीनतम कार्यान्वयन के लिए पुन: बनाता है। इस रीबाइंडिंग को पूरा करने के लिए, CLR फ़ंक्शंस, संग्रहीत कार्यविधियाँ, और ट्रिगर्स के लिए मैप करने वाली विधियाँ अभी भी उसी हस्ताक्षर के साथ संशोधित असेंबली में मौजूद होनी चाहिए। सीएलआर उपयोगकर्ता-परिभाषित प्रकार और उपयोगकर्ता-परिभाषित कुल कार्यों को लागू करने वाली कक्षाएं अभी भी उपयोगकर्ता-परिभाषित प्रकार या कुल होने के लिए आवश्यकताओं को पूरा करना चाहिए।

एक ही पृष्ठ पर एक उदाहरण से ऐसा लगता है कि यह चाल चलेगा:

ALTER ASSEMBLY ComplexNumber 
FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 

1
क्या यह तब किया जा सकता है जब अद्यतन असेंबली SQL सर्वर होस्ट मशीन के बजाय SSMS क्लाइंट मशीन पर स्थित हो? सर्वर पर सीधे फ़ाइल सिस्टम तक पहुँचने के लिए मेरे पास पर्याप्त विशेषाधिकार नहीं हैं, लेकिन मेरे पास सीएलआर असेंबलियों को जोड़ने और हटाने के लिए पर्याप्त अधिकार नहीं हैं।
ज़ारेफेथ

खैर, ज्यादातर नहीं। आप एक UNC पथ (जैसे कि \\ server \ path \ to to file) निर्दिष्ट कर सकते हैं और जब तक SQL इंजन के तहत चल रहे सेवा खाते में फ़ाइल पर पठन अनुमतियाँ हैं, यह काम करना चाहिए। अन्य विकल्प विधानसभा के लिए द्विआधारी मूल्य निर्दिष्ट करना है। यदि आप पहले से ही इसे किसी अन्य सर्वर पर तैनात कर चुके हैं, तो वहां से परिवर्तन की स्क्रिप्टिंग करने पर आपको बूँद मूल्य मिलेगा।
बेन थुल

हां मैंने भी यही सोचा था। :( शायद SSMS का एक नया संस्करण एक दूरस्थ मशीन से असेंबलियों को अपडेट करने की अनुमति देगा। इस बीच, मुझे लगता है कि मैं SSMS GUI के माध्यम से असेंबलियों को
गिराता

मैं उस एक पर अपनी सांस नहीं रोकूंगा। जहाँ तक छोड़ने और फिर से बनाने की बात है, तो आप ऊपर उल्लिखित विधियों में से किसी भी तरीके का अभ्यास क्यों नहीं कर सकते?
बेन थुल

1
"असेंबलियों को जोड़ना और बदलना एक फ़ाइल-सिस्टम संदर्भ की आवश्यकता है।" - यह सच नहीं है। दोनों CREATE ASSEMBLYऔर ALTER ASSEMBLYएक ब्लॉब कि विधानसभा का प्रतिनिधित्व करता है ले जाएगा। 2008+ पर बनाए गए किसी भी डेटाबेस पर जाकर और प्रोग्रामबिलिटी -> असेंबलियों और स्क्रिप्ट को Microsoft.SqlServer.Types असेंबली के निर्माण पर जाकर अपने आप को साबित करें। वह विशाल वल्नरी असेंबली है । जैसा कि यह आपकी स्थिति पर लागू होता है, अपनी विधानसभा को अपने स्थानीय उदाहरण पर लागू करें, इसे स्क्रिप्ट करें, और इसे ALTER ASSEMBLYस्क्रिप्ट बनाएं ।
बेन थुल

7

बेन थुल के जवाब में जोड़ने के लिए, यह SQL सर्वर प्रबंधन स्टूडियो के GUI के माध्यम से दूरस्थ रूप से आसानी से पूरा किया जा सकता है ।

  1. अपने डेटाबेस के लिए ऑब्जेक्ट एक्सप्लोरर के तहत -> प्रोग्रामेबिलिटी, असेंबली पर राइट क्लिक करें और 'नई असेंबली ...' चुनें।

  2. अपने अपडेट किए गए DLL में ब्राउज़ करें।

  3. 'ठीक' पर क्लिक करने के बजाय (जो विफल हो जाएगा, उसी नाम की एक विधानसभा पहले से मौजूद है) नई विधानसभा विंडो के शीर्ष पर 'स्क्रिप्ट' पर क्लिक करें।
     
    आपको एक SQL क्वेरी में छोड़ दिया जाएगा जिसमें एक 'CREATE ASSEMBLY' लाइन शामिल है, जिसके बाद एक बहुत बड़ा ब्लॉब है जो आपके द्वारा चयनित DLL है।

  4. TER ALTER ’में to CREATE’ बदलें और फिर निष्पादित करें!

स्क्रिप्ट ने मेरे लिए एक H AUTHORIZATION ’लाइन भी बनाई थी जिसे निष्पादित करने से पहले मुझे हटाना था; आपका माइलेज अलग-अलग हो सकता है।

मुझे उम्मीद है कि यह बिना किसी और फाइल सिस्टम के उनके सर्वर तक पहुंचने में मदद करेगा।

उम्मीद है कि Microsoft किसी दिन SSMS में इसे प्रथम श्रेणी का ऑपरेशन बना देगा, लेकिन जब तक वे ऐसा नहीं करते हैं, यह काफी आसान है।


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