निहित डेटाबेस का प्राथमिक उद्देश्य अपने डेटाबेस को नए सर्वर पर पोर्ट करना आसान बनाता है, इसके चारों ओर बहुत अधिक मचान के बिना। इसे ध्यान में रखते हुए, मैं कुछ संभावित मुद्दों का इलाज करूँगा, जो इस माइग्रेशन को और अधिक कठिन बना देंगे - और अधिकांश इस तथ्य के इर्द-गिर्द घूमते हैं कि निहित डेटाबेस केवल SQL सर्वर 2012 में समाहित हैं (वास्तव में लागू नहीं किया गया है)।
कनेक्शन तार
किसी समाहित डेटाबेस के लिए कनेक्शन स्ट्रिंग स्पष्ट रूप से कनेक्शन स्ट्रिंग में डेटाबेस निर्दिष्ट करना चाहिए । आप अब कनेक्शन स्थापित करने के लिए लॉगिन के डिफ़ॉल्ट डेटाबेस पर भरोसा नहीं कर सकते हैं; यदि आप एक डेटाबेस निर्दिष्ट नहीं करते हैं, तो SQL सर्वर सभी निहित डेटाबेस के माध्यम से कदम नहीं उठा रहा है और किसी भी डेटाबेस को खोजने की कोशिश करें जहां आपकी क्रेडेंशियल्स मेल खा सकती हैं।
क्रॉस-डीबी प्रश्न
यहां तक कि अगर आप एक ही उपयोगकर्ता को एक ही सर्वर पर दो अलग-अलग निहित डेटाबेस में एक ही पासवर्ड के साथ बनाते हैं, तो आपका एप्लिकेशन क्रॉस-डेटाबेस क्वेरी नहीं कर पाएगा। उपयोगकर्ता नाम और पासवर्ड एक ही हो सकता है, लेकिन वे कर रहे हैं नहीं एक ही उपयोगकर्ता। इसका कारण? यदि आपके पास किसी होस्ट किए गए सर्वर पर डेटाबेस सम्मिलित है, तो आपको उसी सम्मिलित उपयोगकर्ता के रूप में होने से नहीं रोका जाना चाहिए जो किसी और को हो सकता है जो उसी होस्ट किए गए सर्वर का उपयोग कर रहा हो। जब पूर्ण नियंत्रण आ जाता है ( SQL सर्वर 2012 के बाद संस्करण में कभी नहीं), क्रॉस-डेटाबेस क्वेरी वैसे भी बिल्कुल निषिद्ध होगी। मैं अत्यधिक, अत्यधिक, अत्यधिक अनुशंसा करता हूं कि आप सर्वर-स्तर लॉगिन को डेटाबेस उपयोगकर्ताओं के समान नाम के साथ न बनाएं और निहित डेटाबेस में समान उपयोगकर्ता नाम बनाने से बचने का प्रयास करें। यदि आपको कई सम्मिलित डेटाबेस को क्वेरी चलाने की आवश्यकता है, तो सर्वर-लेवल लॉगिन का उपयोग करके ऐसा करें जिसमें उचित विशेषाधिकार हैं (आप सोच सकते हैं कि यह है sysadmin
, लेकिन केवल-पढ़ने के लिए क्वेरी के लिए, यह है CONNECT ANY DATABASE
और SELECT ALL USER SECURABLES
)।
समानार्थक शब्द
अधिकांश 3- और 4-भाग नामों की पहचान करना आसान है, और एक DMV में दिखाई देते हैं। हालाँकि यदि आप एक ऐसा पर्यायवाची बनाते हैं जो 3- या 4-भाग के नाम की ओर इशारा करता है, तो ये DMV में दिखाई नहीं देते हैं। इसलिए यदि आप पर्यायवाची शब्दों का भारी उपयोग करते हैं, तो संभव है कि आप कुछ बाहरी निर्भरता से चूक जाएंगे, और यह उस बिंदु पर समस्या पैदा कर सकता है जहां आप डेटाबेस को किसी भिन्न सर्वर पर माइग्रेट करते हैं। मैंने इस मुद्दे के बारे में शिकायत की थी, लेकिन इसे "डिज़ाइन द्वारा" बंद कर दिया गया था और नई प्रतिक्रिया प्रणाली में प्रवास से बच नहीं पाया । ध्यान दें कि DMV 3- और 4-पार्ट के नामों को भी याद करेगा जो डायनेमिक SQL के माध्यम से बनाए गए हैं।
पासवर्ड नीति
यदि आपने पासवर्ड सिस्टम के बिना सिस्टम में एक निहित डेटाबेस उपयोगकर्ता को बनाया है, तो आपको एक अलग सिस्टम पर एक ही उपयोगकर्ता बनाने में मुश्किल हो सकती है जिसके पास एक पासवर्ड नीति है। ऐसा इसलिए है क्योंकि CREATE USER
सिंटैक्स पासवर्ड नीति को दरकिनार करने का समर्थन नहीं करता है। मैंने इस समस्या के बारे में एक बग दर्ज किया, और यह खुला रहता है (और कनेक्ट के सेवानिवृत्त होने पर यह भी नहीं बचता)। और मुझे यह अजीब लगता है कि एक पासवर्ड नीति के साथ एक सिस्टम पर, आप एक सर्वर-स्तरीय लॉगिन बना सकते हैं जो आसानी से नीति को दरकिनार कर देता है, लेकिन आप ऐसा डेटाबेस उपयोगकर्ता नहीं बना सकते जो ऐसा करता हो - भले ही यह उपयोगकर्ता स्वाभाविक रूप से हो एक सुरक्षा जोखिम के कम।
मिलान
चूंकि हम अब tempdb के टकराने पर भरोसा नहीं कर सकते हैं, इसलिए आपको किसी भी कोड को बदलने की आवश्यकता हो सकती है जो वर्तमान में स्पष्ट कॉलेशन का उपयोग करता है या इसके बजाय DATABASE_DEFAULT
उपयोग CATALOG_DEFAULT
करता है। कुछ संभावित मुद्दों के लिए इस BOL लेख को देखें ।
IntelliSense
यदि आप किसी निहित उपयोगकर्ता के रूप में किसी सम्मिलित डेटाबेस से जुड़ते हैं, तो SSMS पूरी तरह से IntelliSense का समर्थन नहीं करेगा। आपको सिंटैक्स त्रुटियों के लिए बुनियादी अंडरलाइनिंग मिलेगी, लेकिन कोई भी ऑटो-पूरी सूची या टूलटिप्स और सभी मज़ेदार सामान नहीं। मैंने इस मुद्दे के बारे में एक बग दर्ज किया, और यह खुला रहता है - और एक और जो इस कदम से बच नहीं पाया।
SQL सर्वर डेटा उपकरण
यदि आप डेटाबेस विकास के लिए SSDT का उपयोग करने की योजना बना रहे हैं, तो वर्तमान में निहित डेटाबेस के लिए पूर्ण समर्थन नहीं है। जो वास्तव में बस का अर्थ है कि परियोजना का निर्माण विफल हो जाएगा यदि आप कुछ सुविधा या वाक्यविन्यास का उपयोग करते हैं जो कि नियंत्रण को तोड़ता है, क्योंकि SSDT वर्तमान में यह नहीं जानता है कि क्या सामग्री है और क्या इसे तोड़ सकता है।
परिवर्तन करें
ALTER DATABASE
किसी समाहित डेटाबेस के संदर्भ में एक कमांड चलाने के दौरान, ALTER DATABASE foo
आप की तुलना में rRather का उपयोग करने की आवश्यकता होगी ALTER DATABASE CURRENT
- यह इतना है कि यदि डेटाबेस को स्थानांतरित, नाम बदला गया है, आदि, इन आदेशों को उनके बाहरी संदर्भ या संदर्भ के बारे में कुछ भी जानने की आवश्यकता नहीं है ।
कुछ अन्य
कुछ चीजें जो आप शायद अभी भी उपयोग नहीं कर रहे हैं, लेकिन फिर भी उन चीजों की सूची में उल्लेख किया जाना चाहिए जो समर्थित नहीं हैं या पदावनत नहीं की गई हैं और उन्हें निहित डेटाबेस में उपयोग नहीं किया जाना चाहिए:
- गिने जाने की प्रक्रिया
- अस्थायी प्रक्रिया
- बंधी हुई वस्तुओं में टकराव बदल जाता है
- डेटा कैप्चर बदलें
- ट्रैकिंग बदलें
- प्रतिकृति
उन सभी ने कहा, ये आवश्यक रूप से निहित डेटाबेस का उपयोग करने के लिए नुकसान नहीं हैं , वे सिर्फ वे मुद्दे हैं जिनके बारे में आपको पता होना चाहिए और आधिकारिक दस्तावेज में सभी स्पष्ट रूप से नहीं बताया गया है।
आपको यह भी सुनिश्चित करना होगा कि यदि कोई निहित डेटाबेस माइग्रेट होने जा रहा है, या उपलब्धता समूह का हिस्सा है या मिरर किया जा रहा है, तो सभी संभावित गंतव्य सर्वरों में sp_configure
विकल्प contained database authentication
1 पर सेट है।
आपको यह ब्लॉग पोस्ट उपयोगी लग सकता है, साथ ही साथ यह एक है , भले ही वे आरटीएम पूर्व-तिथि हो।