किसी भी DATABASE अनुमतियाँ बनाएँ बनाम DATABASE बनाएँ


21

Microsoft SQL सर्वर में, CREATE DATABASEऔर CREATE ANY DATABASEअनुमतियों के बीच अंतर क्या है ?

मैं एक आधिकारिक उत्तर नहीं पा रहा हूं। मैं सबसे अच्छा अनुमान लगा सकता हूं कि या तो (ए) का CREATE ANYतात्पर्य है कि मैं डेटाबेस को किसी अन्य उपयोगकर्ता के स्वामित्व में बना सकता CREATEहूं , जबकि मैं नहीं कर सकता, या (ख) Sybase / प्रारंभिक SQL सर्वर दिनों में मूल अनुमति थी CREATE ANYऔर के CREATEलिए अन्य नाम दिया गया है ANSI अनुरूपता।


हारून ने क्या कहा, यह सुनकर, लेकिन आपको वास्तव में संपादन में कटौती करनी चाहिए, इसे उत्तर के रूप में पेस्ट करना चाहिए, फिर इसे स्वीकार करना चाहिए। दो कारण: यह स्पष्ट करता है कि उत्तर क्या है (और आपका संपादन एक महान उत्तर है) और इसके अलावा यह भी है (अनुत्तरित प्रश्न कभी-कभी अधिक ध्यान देने के लिए शीर्ष पर टकरा जाते हैं)।
साइमन रिगर्त्स

1
हो गया, लेकिन मैं इसे कल तक स्वीकार नहीं कर सकता, और मैं सभी कल पर कोई जवाब नहीं दे सकता था (<100 प्रतिनिधि के लिए स्व-उत्तर के लिए 5 घंटे की सीमा)।
तोहव

जवाबों:


21

मेरा मानना ​​है कि मुझे लेखकीय उत्तर मिला है, इस लेख में दी गई तालिका से बहुत मदद मिली है: 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 सर्वर इन अनुमतियों को संग्रहीत करता है।

खैर, यह मजेदार था।

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