मैं SQLCLR द्वारा उपयोग किए जा रहे AppDomain को रीसेट करने के लिए बाध्य करना चाहता हूं। SQL सर्वर आवृत्ति को पुनरारंभ करने के अलावा मैं यह कैसे कर सकता हूं?
मैं SQLCLR द्वारा उपयोग किए जा रहे AppDomain को रीसेट करने के लिए बाध्य करना चाहता हूं। SQL सर्वर आवृत्ति को पुनरारंभ करने के अलावा मैं यह कैसे कर सकता हूं?
जवाबों:
मुझे पता है कि यह थोड़ा क्रूर है, लेकिन सीएलआर को अक्षम करने और इसे फिर से सक्षम करने के बारे में क्या?
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
ALTER ASSEMBLY
लॉग शिपिंग के माध्यम से प्रचारित किया गया था जो ऐप डोमेन को बग को फिर से लोड (या कम से कम अनलोड) नहीं करता था। किसी भी तरह से, मुझे एक और भी आसान तरीका मिला जिसे मैंने यहाँ अपने उत्तर में जोड़ा। यदि आपके पास इस नई पद्धति का परीक्षण करने की क्षमता है, तो यह बहुत अच्छा होगा क्योंकि मैं यह देखने के लिए बहुत उत्सुक हूं कि यह आपके द्वारा वर्णित लॉग शिपिंग परिदृश्य में काम करता है या नहीं।
एक और अधिक सुरुचिपूर्ण समाधान है जो अन्य सभी विधानसभाओं को प्रभावित नहीं करेगा: बस ऐप डोमेन में एक असेंबली के 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;
SELECT * FROM sys.dm_clr_appdomains;
। मिठाई।