SQL सर्वर को पुनरारंभ करने के अलावा, SQLCLR AppDomain को रीसेट करने के लिए बाध्य करने का कोई तरीका है?


11

मैं SQLCLR द्वारा उपयोग किए जा रहे AppDomain को रीसेट करने के लिए बाध्य करना चाहता हूं। SQL सर्वर आवृत्ति को पुनरारंभ करने के अलावा मैं यह कैसे कर सकता हूं?


यकीन नहीं है कि आपको उत्तर अपडेट पर सूचनाएं मिलती हैं, लेकिन मैंने अपना जवाब और भी आसान विधि से अपडेट किया :)।
सोलोमन रटज़की 20

जवाबों:


6

मुझे पता है कि यह थोड़ा क्रूर है, लेकिन सीएलआर को अक्षम करने और इसे फिर से सक्षम करने के बारे में क्या?

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 0;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

2
इस पद्धति के बारे में एक महत्वपूर्ण विवरण यह है कि यह एक STANDBY (केवल पढ़ने के लिए) डेटाबेस के खिलाफ निष्पादित होने पर काम करता है; अन्य सभी तरीके जो मैंने आजमाए हैं, नहीं। मुझे इसकी आवश्यकता थी क्योंकि एक CLR असेंबली के अपडेट को STANDBY कैटलॉग में लॉग शिपिंग के माध्यम से सामान्य रूप से प्रचारित किया गया था, लेकिन AppDomain ने फिर से लोड नहीं किया --- इसलिए इसने लगभग एक दिन के लिए .dll के पुराने संस्करण से कोड चलाना जारी रखा।
ग्रेंजर

@Granger बहुत दिलचस्प और अच्छा पता करने के लिए :)। हालांकि, मैं इस पर विचार करूंगा कि SQL सर्वर के भीतर एक बग। आप कनेक्ट साइट के माध्यम से रिपोर्ट करना चाह सकते हैं कि: connect.microsoft.com/SQLServer/Feedback
सोलोमन रटज़की

1
@ श्रुतस्की - सुझाव के लिए धन्यवाद; मुझे उम्मीद है कि वे रिपोर्ट को "ठीक नहीं करेंगे" के रूप में बंद कर देंगे। सेटिंग सर्वर-वाइड है, न कि प्रति-कैटलॉग (जैसे 'नेस्टेड ट्रिगर्स', 'फाइलस्ट्रीम एक्सेस लेवल', आदि)। कीड़े की कैन को मैं खोलने की कोशिश कर रहा था।
ग्रेंजर

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

8

एक और अधिक सुरुचिपूर्ण समाधान है जो अन्य सभी विधानसभाओं को प्रभावित नहीं करेगा: बस ऐप डोमेन में एक असेंबली के PERMISSION_SET को बदल दें (ऐप डोमेन प्रति उपयोगकर्ता हैं)।

ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that 
                                                      this assembly is not current at}

बस याद रखें कि आपको PERMISSION_SET को वापस सेट करना होगा जो वह था। इसके अलावा, आपको PERMISSION_SET को बदलने से पहले विधानसभा में एक विधि का उपयोग करने की आवश्यकता होगी, इसे अनलोड करना होगा; एक असेंबली को बदलना जो वर्तमान में एक ऐप डोमेन में लोड नहीं है जो सक्रिय है, लेकिन किसी अन्य असेंबली के साथ, ऐप डोमेन पर कोई प्रभाव नहीं है (ऐप डोमेन प्रति-डीबी, प्रति-उपयोगकर्ता, प्रति-असेंबली नहीं है)।


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

  • डेटाबेस के लिए सेट है TRUSTWORTHY ON, या
  • विधानसभा हस्ताक्षरित किया गया है और एक लॉग इन, एक असममित कुंजी ही विधानसभा के समान हस्ताक्षर के आधार पर है कि पर आधारित है, मौजूद है और या तो प्रदान की गई है EXTERNAL ACCESS ASSEMBLYया UNSAFE ASSEMBLYअनुमति

इस स्थिति में आप बस TRUSTWORTHYसेटिंग को चालू कर सकते हैं ONऔर फिर तुरंत फिर OFFसे वापस आ सकते हैं और उस विशेष डेटाबेस में सभी ऐप डोमेन को अनलोड करेंगे :

ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;

यदि आपके पास डेटाबेस में वैसे भी केवल एक ऐप डोमेन है (और मुझे संदेह है कि यह मामला 95%, या अधिक, समय का है), तो यहां वर्णित दोनों विधियों का समान प्रभाव है। और उस स्थिति में, ALTER DATABASEविधि सरल लगती है क्योंकि इसमें किसी विशेष वस्तु के नाम को निर्दिष्ट करने की आवश्यकता नहीं होती है और न ही यह जानने की आवश्यकता होती है कि मूल क्या PERMISSION_SETथा।

ALSO, यदि आपके पास केवल एक एकल ऐप डोमेन है, तो ALTER DATABASEविधि उस स्थिति में भी सरल है जहां डेटाबेस या तो पहले से ही सेट है TRUSTWORTHY ONया आपने उचित अनुमति के साथ कुंजी-आधार लॉगिन सेट किया है। आप एक कुंजी-आधारित प्रवेश का उपयोग कर रहे हैं तो आप सेट कर सकते हैं TRUSTWORTHYकरने के लिए ONऔर उसके बाद OFFफिर से जैसा कि ऊपर उल्लेख। लेकिन अगर आपने पहले ही TRUSTWORTHYसेट कर लिया है ON, तो बस इसे उल्टा करें और इसे सेट करें OFFऔर फिर तुरंत वापस ON:

ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;

1
अद्यतन दृष्टिकोण STANDBY (READ_ONLY) डेटाबेस कैटलॉग पर काम करता है । Sql सर्वर ने मुझे "TRUSTWORTHY" सेटिंग को बदलने की अनुमति दी, फिर इसे पहले जो था, उसे पुनर्स्थापित करें। मैंने सत्यापित किया कि परिवर्तन वास्तव में परिणाम को देखकर डोमेन को उतार दिया SELECT * FROM sys.dm_clr_appdomains;। मिठाई।
ग्रेंजर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.