उपयोग करने के लिए अन्य डेटाबेस में आंतरिक संग्रहीत प्रोक के लिए एक केंद्रीय सीएलआर संग्रहीत कार्यविधि / फ़ंक्शन रिस्पॉन्सरी लाइब्रेरी स्थापित करना?


17

मैं कोड का उपयोग करना चाहूंगा जिसे मैंने C # CLR में विकसित किया है ताकि सिस्टम पर सभी डेटाबेस में उपयोग किया जा सके ताकि मुझे प्रत्येक को भरोसेमंद बनाने और CLR को चालू करने और प्रत्येक के अंदर एक ही कोड का एक गुच्छा रखने की आवश्यकता न हो ।

क्या प्रशासनिक और सुरक्षा दृष्टिकोण से ऐसा करने का सबसे अच्छा तरीका है? सीएलआर फ़ंक्शन स्ट्रिंग बेकर्स, ईमेल सत्यापन, यूआरएल एन / डीकोड, बेस 64, और आदि की तरह बहुत बुनियादी हैं। मैं प्रत्येक डेटाबेस में केवल डीबीओ स्कीमा को चाहूंगा कि वे फ़ंक्शन का उपयोग करने में सक्षम हों।

  1. क्या ऐसा करने का कोई सरल तरीका है?
  2. इसके अलावा, मैं स्पष्ट नहीं हूं कि क्या सीएलआर डीएल एम्बेडेड है और अगर मैं डेटाबेस को स्थानांतरित करता हूं, तो यह साथ टैग करता है, या क्या मुझे डीएल को भी स्थानांतरित करना होगा।

धन्यवाद


1
हां ठीक लगता है। जब तक मैं सवाल के बारे में मृत चुप्पी से विकेट नहीं सुनता। हमेशा स्टैकओवरफ्लो में किस्मत थी
एलेक्स एरविन

1
dba.se एसओ की तुलना में कम उन्मादी है, लेकिन मुझे विश्वास है कि आप एक-एक दिन में इस तरह के प्रश्न पर अच्छा ध्यान देंगे। क्या आप लंबे समय तक धैर्य रखने के लिए खुश हैं?
जैक डगलस

लोल, धैर्य एक गुण है। मेरे पास इसकी उचित मात्रा है, और प्रश्न ही, मुझे लगता है, एमएस पता होगा। क्या होगा यदि आप एक SQL सर्वर होस्ट हैं जो कुछ उपयोगी कार्यों को उजागर करना चाहता है, लेकिन आपके सर्वर को पूरी ताकत से सीएलआर के लिए खुला नहीं है?
एलेक्स एरविन

जवाबों:


8

हमारी कंपनी में हमारे पास सटीक सेटअप है। जब आप CLR असेंबली बनाते हैं तो असेंबली का बाइनरी प्रतिनिधित्व उस डेटाबेस के भीतर संग्रहीत होता है जिसे आप इसे बनाते हैं। यह आपको इसे अपने साथ ले जाने में सक्षम बनाता है (और इसे स्क्रिप्ट भी) आपको किसी भी समय डेटाबेस को स्थानांतरित करना चाहिए।

कुछ महीने पहले हमारे डेटा सेंटर में बाढ़ आ गई थी - पानी से भरे कई सर्वर भर गए। जब मैंने उन्हें फिर से बनाया तो मैंने केवल उस db के बैकअप का उपयोग किया जो रात पहले लिया गया था। अब तक हमारे पास कोई मुद्दा नहीं था .. (लकड़ी को छूएं!)

मुझे यकीन नहीं है कि यह सुरक्षा के दृष्टिकोण से करने के लिए सही बात है, लेकिन जिस तरह से हम सीएलआर प्रॉक्स आदि के लिए पहुंच प्रदान करते हैं वह साझा डेटाबेस के भीतर एक भूमिका बनाना है, और फिर अन्य डेटाबेस से उपयोगकर्ताओं को उस भूमिका में जोड़ना है। भूमिका को सीएलआर प्रोक्स पर निष्पादित किया जाता है।

यदि सीएलआर डेटाबेस के बाहर पहुँच संसाधनों जैसी चीज़ों को करने की कोशिश कर रहा है, तो यह अंदर मौजूद है, लेकिन आप इसे बनाते समय असेंबली पर अनुमति सेट कर सकते हैं। नीचे दिए गए लिंक में अनुमतियों के संबंध में बहुत अधिक जानकारी है, हालांकि मैं यहां बता सकता हूं:

http://msdn.microsoft.com/en-us/library/ms345101.aspx

मुझे उम्मीद है कि यह आपकी मदद करता है।


6

असेंबली बाइनरी को डेटाबेस में एक ब्लॉब के रूप में संग्रहीत किया जाता है, इसलिए इसे डेटाबेस में जहां भी ले जाया जाता है। CLR केवल उदाहरण पर सक्षम है - इसके लिए कोई डेटाबेस-विशिष्ट सेटिंग्स नहीं हैं।

किसी भी घटना में, आप ऐसा करने की कोशिश क्यों कर रहे हैं?

(मैं तर्कशील होने की कोशिश नहीं कर रहा हूं; मैं सिर्फ इसमें शामिल उद्देश्यों को सुनना चाहता हूं, क्योंकि शायद समस्या को एक अलग तरीके से हल किया जा सकता है जो आपकी आवश्यकताओं को पूरा करता है।)


साझा डेटाबेस में असेंबली लगाने के अलावा, इसे आसानी से करने का कोई तरीका नहीं है।

उस ने कहा, मुझे लगता है कि डेटाबेस-केंद्रित वास्तुकला को गले लगाना फायदेमंद होगा, जब तक कि कोई विशेष स्थिति न हो जिसे केंद्रीकृत करने के लिए बहुत ही आकर्षक कारण हैं। ऐसा क्यों है कि डेटाबेस के बाहर असेंबली (या उस मामले के लिए कुछ भी) डालना आपके वातावरण में एक निर्भरता पैदा करता है। यह ठीक विपरीत दृष्टिकोण है जो Microsoft SQL Server 2012 में शुरू होने वाले दूषित डेटाबेस के साथ बना रहा है।

  • जब आपको प्रतिकृति या क्लस्टरिंग जैसी सुविधाओं का उपयोग करने की आवश्यकता होती है, तो यह निर्भरता संभावित रूप से तैनाती के लिए जटिलता की एक जबरदस्त मात्रा जोड़ सकती है, लेकिन समस्या निवारण और विफलता प्रक्रियाओं के लिए भी।

  • यह आर्किटेक्चर सिस्टम से अपरिचित लोगों के लिए बहुत कम स्पष्ट है (यानी, यह कम आत्म-खोज योग्य है, और कम स्व-दस्तावेजीकरण)।

  • यदि आप अलग-अलग डेटाबेस में अलग-अलग सुरक्षा की आवश्यकता को समाप्त करते हैं, या कुछ भी जिसमें बदलाव शामिल है, तो आप चोट की दुनिया में हैं।

  • यदि ये डेटाबेस ग्राहकों को मिलते हैं (लगता है जैसे वे नहीं होंगे, लेकिन मैं इसे पूर्णता के लिए कहूंगा), यह तैनाती प्रक्रिया, रखरखाव और समस्या निवारण में जटिलता जोड़ता है।

  • चूंकि सभी डेटाबेस इस कोड को साझा करेंगे, यदि कोई बग (या निश्चित!) पेश किया जाता है, तो यह डेटाबेस पर निर्भर सभी अनुप्रयोगों को संभावित रूप से तोड़ सकता है। व्यापक इकाई परीक्षण एक निरपेक्ष होना चाहिए।

यदि आपके पास कई डेटाबेस हैं जिनकी समान कार्यक्षमता की आवश्यकता है, तो इसमें शामिल दोहराव की मात्रा को कम करने के अन्य तरीके हैं, जो मुझे लगता है कि व्यायाम का बिंदु है। यहां तक ​​कि एक काफी जटिल सीएलआर असेंबली डेटाबेस में डेटा (लगभग हमेशा) की तुलना में बहुत अधिक भौतिक भंडारण स्थान नहीं लेगा, इसलिए मैं इसे एक वैध तर्क के रूप में नहीं देखता जब तक कि आपके पास वास्तव में हजारों छोटे डेटाबेस न हों, जिन्हें इसकी आवश्यकता है सभा।

स्रोत डुप्लिकेट को कम करने के लिए आप इन डेटाबेस के लिए परिनियोजन प्रक्रिया के अन्य भागों को संशोधित कर सकते हैं। उदाहरण के लिए, स्रोत नियंत्रण में CLR कोड के सामान्य स्थान से असेंबली का निर्माण और तैनाती। या, एक स्क्रिप्ट बनाएं जो डेटाबेस में समान असेंबली को दर्शाती है। जितना संभव हो सके इस हिस्से को स्वचालित करें, और यह एक बड़ी बात नहीं होगी।

मैं सहमत हूं कि मैं जो सुझाव दे रहा हूं वह एक व्यापार है, क्योंकि अभी भी कुछ दोहराव होगा, लेकिन यह एक वास्तुकला को लागू करने के साथ शामिल नकारात्मक के साथ संतुलित होना है जो निर्धारित मानक का पालन नहीं करता है। केवल आप ही तय कर सकते हैं कि आपके पर्यावरण के लिए क्या सही है।


मैं आपकी बात को संभवतः चीजों को तोड़ने के साथ देखता हूं, हालांकि यह कोड के रोल आउट को आसान बनाना है। यहां डेवलपर्स की कोई सेना नहीं है। सिर्फ मैं। हालाँकि मेरे पास डेटाबेस का उपयोग करने वाले अन्य लोग हैं, इसलिए मुझे यह सुनिश्चित करने की ज़रूरत है कि जब तक संग्रहीत कार्यविधियाँ मेरे द्वारा परिभाषित नहीं की जाती हैं, तब तक कार्य अक्षम्य हैं।
एलेक्स इरविन

1

अन्य दो जवाब सही ढंग से राज्य के रूप में, विधानसभाओं एक विशेष डेटाबेस में लोड और नहीं पूरे सिस्टम पर कर रहे हैं (हालांकि मैं काफी हद तक निश्चित है कि कर रहा हूँ कर रहे हैं assembly_idमूल्य है अनूठी प्रणाली चौड़ा)। इसका मतलब यह है कि वे समर्थित हैं, और प्रत्येक डेटाबेस के साथ बहाल किए गए हैं, जिसमें वे लोड किए गए हैं।

इसके अलावा, enabled/ disabledकी स्थापना CLR Integration(के माध्यम से sp_configure) है पूरे सिस्टम पर। एक साइड नोट के रूप में, वह सेटिंग केवल उपयोगकर्ता द्वारा निर्मित सीएलआर कार्यक्षमता के लिए है; एक सामान्य अर्थ में सीएलआर हमेशा सक्षम होता है क्योंकि कुछ अंतर्निहित कार्यक्षमता इस पर निर्भर करती है।

यह कहा गया है, जबकि अन्य दो उत्तर यहां वैध बिंदु बनाते हैं, वे बिंदु SQLCLR- विशिष्ट नहीं हैं, और इस निर्णय को बनाने में कारकों का कोई उल्लेख नहीं है जो SQLCLR कोड के लिए विशिष्ट हैं। यदि आप प्रत्येक व्यक्तिगत डेटाबेस पर कोड तैनात करते हैं (आपके पास कई डेटाबेस हैं), संभावित संसाधन विवाद मुद्दे, संभावित सुरक्षा-संबंधित समस्याएँ आदि पर विचार करने के लिए स्मृति समस्याएँ हैं।

मैंने विशेष रूप से SQLCLR कोड के लिए, व्यक्तिगत केंद्रीकृत डेटाबेस बनाम व्यक्तिगत डेटाबेस परिनियोजन के बीच निर्णय लेने के लिए, चीजों की एक व्यापक सूची होनी चाहिए, जो प्रदान की है। यहां सूची को डुप्लिकेट करने के बजाय, कृपया निम्नलिखित उत्तर देखें (DBA.SE पर यहां भी):

प्रदर्शन के दृष्टिकोण से सीएलआर फ़ंक्शन का बेहतर उपयोग कैसे करें (प्रत्येक डीबी के अंदर दोहराएं या सामान्य कार्य करें)?

साथ ही, एक संबंधित नोट पर, मैं सवाल करूंगा कि किसी भी डेटाबेस को क्यों सेट किया जा रहा है TRUSTWORTHY ON। प्रश्न (यानी "स्ट्रिंग ब्रेकर, ईमेल सत्यापन, यूआरएल एन / डिकोड, बेस 64, आदि") में वर्णित कार्यक्षमता एक SAFEविधानसभा के भीतर संभव है । जब तक बिल्कुल आवश्यक न हो , आपको EXTERNAL_ACCESSया तो UNSAFEperission_set मान का उपयोग नहीं करना चाहिए । और अगर यह कुछ संख्या में कार्यों के लिए आवश्यक है, तो उन लोगों को एक अलग विधानसभा में होना चाहिए जिसमें केवल SAFEकोड हो जैसे कि कोई स्केलर फ़ंक्शन जो डेटा एक्सेस नहीं करते हैं और चिह्नित किए जाते हैं IsDeterministic = trueजो होने के प्रदर्शन लाभ का उपयोग करने में सक्षम होंगे समानांतर योजनाओं में भाग लेने में सक्षम।

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