मेरा मानना है कि मुझे लेखकीय उत्तर मिला है, इस लेख में दी गई तालिका से बहुत मदद मिली है: http://msdn.microsoft.com/en-us/library/ms178569.aspx । ऐसा लगता है कि क्रिएट डबस्टे वास्तव में एएनएसआई एसक्यूएल आज्ञाकारी अनुमति है, जबकि किसी भी डटबाइट को एक एमएसक्यूएल मालिकाना सर्वर अनुमति है। हालांकि, दो समान नहीं हैं। वास्तव में, दोनों के बीच एक महत्वपूर्ण अंतर है, और मुझे यह कोशिश करके पता चला।
वे दोनों अनुमतियाँ हैं, लेकिन बनाएँ डेटाबेस केवल वर्तमान में उपयोग किए गए डेटाबेस के सुरक्षा संदर्भ को सुरक्षित करता है, जबकि किसी भी डेटाबेस बनाएँ SQL सर्वर पर लॉगिन की सूची देख सकते हैं। इसे लागू किया गया प्रतीत होता है क्योंकि ANSI SQL सर्वर के लिए सामान्य अपेक्षा यह है कि कुछ मुख्य सिस्टम डेटाबेस में अनुमतियाँ प्रदान की जाती हैं, उस डेटाबेस में उपयोगकर्ताओं को अनुमतियाँ दी जाती हैं। फिर नए डेटाबेस का डिफ़ॉल्ट व्यवहार यह देखने के लिए मास्टर से परामर्श करना है कि उसे क्या अनुमति चाहिए। (एसक्यूएल 101, मुझे पता है, लेकिन यह वास्तव में यहाँ अनुकरणीय है।)
इसलिए, जब आप क्रिएट डटैब प्रदान करते हैं, तो आपको यह अनुमति देने के लिए वास्तव में मास्टर में एक उपयोगकर्ता होना चाहिए। यदि आप यह कोशिश करते हैं, तो यह काम करता है (मास्टर में एक उपयोगकर्ता बनाएं, इसे डेटाबेस बनाने के लिए अनुदान दें, फिर आप डेटाबेस बना सकते हैं)। हालांकि, किसी भी डेटाबेस को बनाने (या भूमिका dbcreator को अनुदान) देने से, आपको मास्टर में शाब्दिक उपयोगकर्ता होने की आवश्यकता नहीं है।
आगे दो अनुमतियों के बीच के अंतर को स्पष्ट करने के लिए, किसी अन्य डेटाबेस बनाम मास्टर डेटाबेस पर उपयोगकर्ता क्रेट डेटाबेस द्वारा लौटाए गए भिन्न संदेशों को देखें, फिर कुल्ला करें और अनुमति के लिए दोहराएं किसी भी डेटा बनाएँ।
use master; GRANT CREATE DATABASE to TestUser
Msg 15151, Level 16, State 1, Line 1 उपयोगकर्ता 'TestUser' नहीं ढूँढ सकता, क्योंकि यह मौजूद नहीं है या आपके पास अनुमति नहीं है।
यह त्रुटि तब होती है क्योंकि उपयोगकर्ता TestUser अभी तक मास्टर डेटाबेस में नहीं है। यह एक डेटाबेस-स्तर की अनुमति है - इसमें चयनित डेटाबेस के बाहर जाने और लॉगिन या उपयोगकर्ताओं की तलाश करने का कोई संदर्भ नहीं है। ध्यान दें कि यदि आप उपयोगकर्ता को पहले मास्टर बनाते हैं, तो यह कमांड सफल होता है, और आप डेटाबेस बना सकते हैं जैसे कि कोई भी DATEABASE आपको प्रदान किया गया था।
use master; GRANT CREATE ANY DATABASE to TestUser
कमांड (ओं) को सफलतापूर्वक पूरा किया।
यह सफल होता है, क्योंकि एक मालिकाना Microsoft SQL सर्वर अनुमति के रूप में, किसी भी डेटाबेस बनाएँ SQL उदाहरण के लिए लॉगिन की सूची से परामर्श कर सकते हैं, न केवल वर्तमान में उपयोग किए गए डेटाबेस में उपयोगकर्ता।
use test; GRANT CREATE DATABASE to TestUser
Msg 15151, Level 16, State 1, Line 1 उपयोगकर्ता 'TestUser' नहीं ढूँढ सकता, क्योंकि यह मौजूद नहीं है या आपके पास अनुमति नहीं है।
यह पहले उदाहरण के लिए मेरे स्पष्टीकरण की स्थिरता को दर्शाता है। नीचे दिए गए क्वेरी और उसके परिणामी त्रुटि संदेश पर ध्यान दें। यदि आप पहली बार इस डेटाबेस में उपयोगकर्ता बनाते हैं (अंतिम क्वेरी देखें) तो आपको यह त्रुटि संदेश नहीं मिलेगा।
use test; GRANT CREATE ANY DATABASE to TestUser
Msg 4621, लेवल 16, स्टेट 10, लाइन 1 सर्वर स्कोप पर अनुमतियाँ केवल तभी दी जा सकती हैं जब वर्तमान डेटाबेस मास्टर हो
जैसा कि दूसरी क्वेरी में दिखाया गया है, किसी भी DATABASE को लॉगइन की सूची में शामिल करें, जहां मैंने पहले ही यह लॉगिन नाम बनाया था। इसलिए जब SQL सर्वर ने उपयोगकर्ता के अस्तित्व को स्वीकार किया, तो यह अभी भी त्रुटि है क्योंकि मैं मास्टर के अलावा कहीं और सर्वर-स्तर की अनुमति देने का प्रयास कर रहा हूं, जिसे MSSQL में अनुमति नहीं है।
use test; create user TestUser; grant create database to TestUser
बनाएँ डेटाबेस अनुमति केवल मास्टर डेटाबेस में दी जा सकती है। एमएसजी 0, स्तर 11, राज्य 0, लाइन 0 वर्तमान कमांड पर एक गंभीर त्रुटि हुई। यदि कोई परिणाम हैं, तो उनकी उपेक्षा की जानी चाहिए।
अब जब कोई उपयोगकर्ता क्रिएट डेटा के लिए आवेदन करने के लिए है, तो मुझे सामान्य त्रुटि संदेश दिया जाता है, जिसे आप कहीं भी सर्वर-स्तर की अनुमति नहीं दे सकते, लेकिन मास्टर, क्योंकि SQL सर्वर इन अनुमतियों को संग्रहीत करता है।
खैर, यह मजेदार था।