मैं 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;। मिठाई।