SQL 2008 R2 उपयोगकर्ता / स्कीमा बनाता है जब Windows उपयोगकर्ता तालिकाओं बनाता है


9

हमने एक सर्वर लॉगिन और डेटाबेस उपयोगकर्ता जोड़ा है जो निम्न स्क्रिप्ट का उपयोग करके SQL समूह के लिए एक SQL 2008 R2 उदाहरण के लिए एक विंडोज ग्रुप को मैप करता है, नाम के लिए नाम बदलकर:

USE master
go
CREATE LOGIN [DOMAIN\AppUsers] FROM WINDOWS
WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
go
USE AppDb
go
CREATE USER [DOMAIN\AppUsers] FOR LOGIN 
[DOMAIN\AppUsers]
go
EXEC sp_addrolemember N'db_owner', N'DOMAIN\AppUsers'
go

जब DOMAIN \ User1 खाता ऐप पर लॉग इन होता है, तो dbo स्कीमा में User1 क्वेरीज़ ठीक होती हैं क्योंकि User1 DOMAIN \ AppUsers का सदस्य होता है, लेकिन यह ऐप उपयोगकर्ता को टेबल भी बनाने की अनुमति देता है। स्कीमा निर्दिष्ट किए बिना इन तालिकाओं को बनाते समय , SQL सर्वर निम्न कार्य करता है:

  1. AppDb में 'DOMAIN \ User1' उपयोगकर्ता बनाता है जो उदाहरण के लिए SSMS \ Security \ Logins में सूचीबद्ध नहीं 'DOMAIN \ User1' लॉगिन का उपयोग करता है।
  2. AppDb में 'DOMAIN \ User1' स्कीमा बनाता है।
  3. नए 'DOMAIN \ User1' स्कीमा का उपयोग करके उन तालिकाओं को बनाता है।

मैं इन परिणामों से पूरी तरह से प्रभावित हूं। यहाँ मेरे सवाल हैं:

  1. मुझे उम्मीद है कि अतिरिक्त ऑब्जेक्ट बनाने के बजाय तालिका निर्माण विफल हो जाएगा। क्या कोई मुझे ऑनलाइन पुस्तक के उस भाग की ओर संकेत कर सकता है जो यह बताता है?
  2. यदि सर्वर 'DOMAIN \ AppUsers' स्कीमा क्यों नहीं बनाता है और यदि स्कीमा जोड़ने जा रहा है तो उस स्कीमा में नई तालिकाएँ नहीं जोड़ें?
  3. इसके अलावा, डेटाबेस SSMS \ Security \ Logins में नहीं दिखाया गया लॉगिन का उपयोग कैसे करता है?
  4. SSMS \ डेटाबेस \ AppDb \ Security \ उपयोगकर्ता में 'DOMAIN \ User1' उपयोगकर्ता को देखते हुए, उपयोगकर्ता आइकन में एक छोटा लाल तीर होता है, जो नीचे इंगित करता है। इसका क्या मतलब है?

हम सिर्फ एक संगठन के भीतर विंडोज प्रमाणीकरण का उपयोग करना शुरू कर रहे हैं जो सरलता के लिए एसक्यूएल प्रमाणीकरण को प्राथमिकता देता है, इसलिए मुझे यकीन है कि मेरा सवाल मतभेदों से अनभिज्ञ होने से है। यह कोड बहुत पहले लिखा गया था जब हमने विंडोज ऑथेंटिकेशन का उपयोग करने पर विचार किया था, इसलिए मुझे यकीन है कि हमें डेटाबेस के मालिक के अलावा किसी और के रूप में विंडोज ऑथेंटिकेशन का उपयोग करने पर लॉग इन करते हुए नए स्कीमा बनाने की अपनी समझ में सुधार करना होगा।

यदि आप नहीं बता सकते हैं, तो मैं SQL प्रमाणीकरण पर विंडोज प्रमाणीकरण के उपयोग के लिए जोर दे रहा हूं। अगर हमें इसकी ठोस समझ नहीं है, तो हम SQL प्रमाणीकरण पर वापस लौटेंगे।


आप डिफ़ॉल्ट स्कीमा {dbo, उदाहरण के लिए} को डोमेन उपयोगकर्ताओं के लिए परिभाषित कर सकते हैं, लेकिन डोमेन समूहों के लिए नहीं।

जवाबों:


9

यह हमेशा SQL Server 2000 में वापस होता है।
स्कीमा के बिना, SQL सर्वर कैसे जानता है कि आप इसे dboस्कीमा में रखना चाहते हैं ?

डिफ़ॉल्ट स्कीमा निर्दिष्ट करने का एकमात्र तरीका है:

  • SQL लॉगिन (विंडोज नहीं) का उपयोग करें
  • "sysadmin" के रूप में चलाएं

इनमें से कोई भी स्वीकार्य नहीं है

सबसे अच्छा अभ्यास हमेशा डीडीएल और डीएमएल के लिए हर वस्तु संदर्भ के लिए स्कीमा को योग्य बनाना है। योजना के पुन: उपयोग के कारण स्पष्ट प्रदर्शन लाभ हैं।

इसके अलावा, SQL Server 2005 के लिए जानबूझकर स्कीमा का उपयोग बेहतर है:

  • तालिकाओं में Data
  • अन्य तालिकाओं में Archive, Stagingआदि
  • ग्राहक अनुमतियाँ प्रति स्कीमा में कोड: Desktop, WebGUIआदि

Dbo स्कीमा का उपयोग करना है तो पिछले सहस्राब्दी :-) लिंक:


तो मेरा इस से दूर है कि हम स्कीमा के साथ नए तालिकाओं को उपसर्ग करने के लिए कोड को अपडेट करें, है ना? क्या इसका मतलब यह है कि नए उपयोगकर्ता का सिक्योरिटी नोड के तहत आना एक सामान्य घटना है?
फ्लिपडबोट

@flipdoubt: दोनों के लिए हाँ। एक बार जब आप इसे प्राप्त कर लेते हैं, और स्कीमा का उपयोग नामस्थान या कंटेनर के रूप में करते हैं, तो यह दूसरा स्वभाव बन जाता है
gbn

एक आखिरी सवाल। यदि उपयोगकर्ता को स्वचालित रूप से जोड़ा जाना आम बात है और ऑब्जेक्ट निर्माण के दौरान स्कीमा निर्दिष्ट करने के लिए एक सर्वोत्तम अभ्यास है, तो आप नए स्कीमा में किसी ऑब्जेक्ट को क्वेरी करने में त्रुटि पैदा करने से पहले नए स्कीमा को अधिकार कैसे दे सकते हैं? 'DOMAIN \ User1' के बारे में मैंने जो उदाहरण पोस्ट किया है, उसका उपयोग करके मैं 'DOMAIN \ AppUsers' खाते तक पहुँच प्रदान कर सकता हूँ, लेकिन क्या प्रश्न 'DOMAIN \ User1' या 'DOMAIN \ AppUsers' के एक्सेस अधिकारों का उपयोग करेंगे? यह सिर्फ इतना डरपोक है कि सर्वर उपयोगकर्ता को ऑब्जेक्ट बनाते ही बनाता है।
फ्लिपडौबट

अनुमतियाँ स्कीमा स्वामी के लिए डिफ़ॉल्ट होंगी, जो उपयोगकर्ता 1 है। यह स्कीमा के लिए DB_OWNER जैसा है
gbn

2

खैर @ से अधिक तेजी से मैं कर रहा प्रकार ...

मेरी एकमात्र पेशकश है ... आप संदर्भ देते हैं कि उपयोगकर्ता ऐप में लॉग इन कर रहा है और यह उपयोगकर्ता को टेबल और इस तरह का निर्माण करने की अनुमति देता है। यदि एप्लिकेशन इसे अनुमति दे रहा है और उपयोगकर्ता स्वयं SQL सर्वर के माध्यम से ऐसा नहीं कर रहा है (सीधे SSMS का उपयोग करके डेटाबेस में लॉग इन कर रहा है) तो आपको उस एप्लिकेशन के विक्रेता से जांच करनी होगी।


हमने एप लिखा।
फ्लिपडाउट

2

हालाँकि यह प्रश्न बहुत पुराना है और इसका पहले से ही स्वीकृत उत्तर है, मैं आपके प्रश्नों का उत्तर विशेष रूप से देने की कोशिश करूँगा (सामान्य सलाह देने के बजाय)।

  1. व्यवहार " दस्तावेज़ योजना और उपयोगकर्ता निर्माण" अनुभाग में https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql में प्रलेखित है।

  2. यदि आप चाहते हैं कि वस्तुओं को एक विशेष स्कीमा में बनाया जाए (जब स्कीमा विवरण में स्पष्ट रूप से निर्दिष्ट नहीं है), तो आपको उपयोगकर्ता के लिए DEFAULT_SCHEMA निर्दिष्ट करना चाहिए। SQL सर्वर 2008 R2 (और पूर्व संस्करणों) में, यदि आप Windows समूह के आधार पर किसी उपयोगकर्ता को DEFAULT_SCHEMA असाइन करने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी, लेकिन SQL सर्वर 2012 (और बाद के संस्करणों में) यह अब संभव है।

  3. यह केवल इसलिए नहीं दिखाया गया है क्योंकि उस उपयोगकर्ता के लिए कोई लॉगिन नहीं है। जैसा कि https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql में निर्दिष्ट है , एक उपयोगकर्ता किसी ऐसे व्यक्ति के लिए बनाया जा सकता है जो एक अलग समूह का उपयोग करके लॉग इन करता है या उसके बिना भी कोई लॉगिन

  4. छोटा लाल तीर (या SSMS के नए संस्करणों में छोटा लाल x) एक उपयोगकर्ता का प्रतिनिधित्व करता है, जिसके पास डेटाबेस में CONNECT अनुमति नहीं है (हालाँकि, यह अनुमति दूसरे समूह के माध्यम से प्राप्त की जा सकती है)।


0

जब भी यह एक पुराना सवाल है मैंने इस व्यवहार को देखा है (SQL Server 2014 में) और निम्नलिखित पाया:

स्क्रिप्ट दी

USE [master]
CREATE DATABASE [Test]

USE [Test]

-- Note that we create the users without specifying the default schema
CREATE USER [MyDomain\MyADGroup] FOR LOGIN [MyDomain\MyADGroup] -- ad group
CREATE USER [MyDomain\MyDomainUser] FOR LOGIN [MyDomain\MyDomainUser] -- ad user (not in said AD group)

ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyADGroup]
ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyDomainUser]

EXECUTE AS LOGIN = 'MyDomain\MyAdGroupUser' -- a windows account which is a member of [MyDomain\MyADGroup]

CREATE TABLE Test
(
    a INT
)

REVERT 

EXECUTE AS USER = 'MyDomain\MyDomainUser'

CREATE TABLE Test
(
    a INT
)

यह स्क्रिप्ट टेस्ट नामक दो टेबल बनाएगी।

पहली CREATE TABLEनामक एक तालिका [MyDomain\MyAdGroupUser].[Test]बनाता है और MyDomain\MyAdGroupUserस्कीमा भी बनाता है (साथ ही एक MyDomain\MyAdGroupUserडेटाबेस उपयोगकर्ता जो अक्षम है)

दूसरा CREATE TABLEएक टेबल बनाता है जिसे बुलाया जाता है[dbo].[Test]

इसका कारण यह है कि चूंकि CREATE TABLEकमांड स्कीमा की स्थिति का पता नहीं लगाते हैं, वे डिफ़ॉल्ट स्कीमा का उपयोग करेंगे।

जैसा कि हमने उपयोगकर्ताओं को बनाते समय डिफ़ॉल्ट स्कीमा को निर्दिष्ट नहीं किया था, SQL सर्वर विंडोज उपयोगकर्ता के डिफ़ॉल्ट स्कीमा को डीबीओ के रूप में सेट करता है, लेकिन विंडोज समूह उपयोगकर्ता के लिए कोई डिफ़ॉल्ट स्कीमा सेट नहीं करता है और इसलिए यह स्कीमा / उपयोगकर्ता निर्माण का कारण बनता है

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