विभिन्न SQL सर्वर स्कीमा के लिए उपयोगकर्ता अनुमतियाँ सेट करना


16

मुझे किसी विशेष उपयोगकर्ता तक पहुंच को सीमित करने की आवश्यकता है, लेकिन उन्हें अभी भी डेटा को dbo के स्वामित्व वाली तालिकाओं में देखने में सक्षम होने की आवश्यकता है।

मैं निम्नलिखित करने की कोशिश कर रहा हूं:

  1. dbo स्कीमा कार्य करता है क्योंकि यह सामान्य रूप से होता है, इसमें हर चीज की पहुंच होती है
  2. स्कीमा 1 स्कीमा की पहुंच केवल स्कीमा 1 वस्तुओं तक है
  3. यदि एक स्कीमा 1 दृश्य या संग्रहीत कार्यविधि dbo के स्वामित्व वाली तालिकाओं में डेटा तक पहुँचती है, तो अनुमतियाँ श्रृंखला उचित रूप से
  4. user1 के पास स्कीमा 1 तक पहुंच है, और कुछ नहीं; सिवाय # 3 के मामले में

यहाँ मैंने कोशिश की है:

  1. एक यादृच्छिक पासवर्ड के साथ एक परीक्षण लॉगिन करने के लिए मैप किया गया एक उपयोगकर्ता 1 उपयोगकर्ता बनाएं
  2. उन में कुछ परीक्षण डेटा के साथ dbo स्कीमा में एक युगल टेबल बनाया
  3. एक स्कीमा 1 स्कीमा बनाया
  4. एक स्कीमा 1.get_profiles बनाया जो स्कीमा 1 नामक एक दृश्य से चुनता है। लाभ जो dbo.people, dbo.taglinks और dbo.tags में डेटा तक पहुँचता है

हालाँकि, उपयोगकर्ता 1 के रूप में लॉग इन करते समय निम्नलिखित स्टेटमेंट का उपयोग करें:

EXEC get_profiles 1

का परिणाम:

The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'.

मैंने कोशिश की है WITH EXECUTE AS OWNERऔर यह समझने के लिए शुरू नहीं कर सकता कि "स्वामित्व जंजीर" कैसे काम करने वाला है।

मैंने भी कोशिश की है

GRANT EXECUTE ON SCHEMA::schema1 TO user1
GRANT INSERT ON SCHEMA::schema1 TO user1
GRANT SELECT ON SCHEMA::schema1 TO user1
GRANT UPDATE ON SCHEMA::schema1 TO user1
GRANT VIEW DEFINITION ON SCHEMA::schema1 TO user1

लेकिन मुझे निम्न त्रुटि मिलती है (डबो-स्तरीय पहुँच वाला उपयोगकर्ता होने के बावजूद):

Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.

जो मुझे चाहिए वह user1 है जो मैं इसे संग्रहीत प्रक्रियाओं के माध्यम से डेटा तक पहुंचने में सक्षम हो सकता हूं, और कुछ नहीं।

इसके अतिरिक्त, यह अंततः एक मौजूदा SQL एज़्योर डेटाबेस पर रहने का इरादा है, लेकिन मैं पहले एक स्थानीय डमी डेटाबेस के खिलाफ परीक्षण कर रहा हूं।


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

1
यह मेरे लिए और अधिक स्पष्ट हो गया है। मुझे लगता है कि समस्या यह थी कि मैं स्कीमा 1 के मालिक को d1 के बजाय User1 पर सेट किया था। मैंने User1 के स्वामित्व में स्कीमा 1 को सेट किया, प्रश्न के अनुसार अनुकूलित किया और मुझे कुछ काम करने में सक्षम किया। यदि आप चाहें तो प्रश्न के उत्तर का प्रस्ताव कर सकते हैं। धन्यवाद!
जूलिया मैकगिगन

खुशी है कि इसने आपकी मदद की।
परिजन शाह

जवाबों:


17

मूल अवधारणा GRANT / DENY स्कीमा अनुमतियों का उपयोग करना है । आप एक भूमिका बनाकर और उसके बाद सदस्यों को जोड़कर अनुमतियों को कुशलता से प्रबंधित कर सकते हैं।

नीचे एक उदाहरण है जो आपको विस्तार से बताएगा

use master
go
--Create Logins
CREATE LOGIN UserA WITH Password='UserA123';
go
CREATE LOGIN UserB WITH Password='UserB123';

use AdventureWorks2008R2
go
--Create Database Users
CREATE USER UserA;
go
CREATE USER UserB;
go
--Create the Test Schemas
CREATE SCHEMA SchemaA AUTHORIZATION UserA
go
CREATE SCHEMA SchemaB AUTHORIZATION UserB
go

-- create test tables
create table schemaA.TableA (fname char(5))
go
insert into schemaA.TableA (fname) values ('Kin-A')
go

create table SchemaB.TableB (fname char(5))
go
insert into SchemaB.TableB (fname) values ('Kin-B')
go

अब परीक्षण करें:

--Test for UserA in SchemaA
EXEC('select * from schemaA.TableA') AS USER = 'UserA'
go
--Kin-A

-- Test for UserB in SchemaB == this should fail
EXEC('select * from SchemaB.TableB') AS USER = 'UserA'
go
--Msg 229, Level 14, State 5, Line 1
--The SELECT permission was denied on the object 'TableB', database 'AdventureWorks2008R2', schema 'SchemaB'.

अब संग्रहित प्रक्रियाएँ बनाएँ:

CREATE PROCEDURE SchemaB.proc_SelectUserB
AS
    select * from schemaA.TableA;
go
create procedure schemaA.proc_SchemaA
as 
    select * from schemaA.TableA

अब स्कीमा की SP पर UserA को अनुमतियाँ प्रदान करें

GRANT EXECUTE ON OBJECT::[SchemaB].[proc_SelectUserB] TO [UserA] 
go

यह परखें कि क्या यह देखने के लिए कि UserA स्कीमा से SP को चलाने में सक्षम है। यह निकल जाएगा

EXECUTE AS LOGIN='UserA';
    Exec SchemaB.proc_SelectUserB;
    revert;
go
--- Kin-A

लेकिन UserA स्कीम से डेटा देखने में सक्षम नहीं होगा

EXECUTE AS LOGIN='UserA';
    select * from SchemaB.TableB
revert;
go

--- Msg 229, Level 14, State 5, Line 3
--- The SELECT permission was denied on the object 'TableB', database 'AdventureWorks2008R2', schema 'SchemaB'.

वैकल्पिक रूप से आप DATABASE ROLE का उपयोग कर सकते हैं और अनुमतियों के बेहतर प्रबंधन के लिए उपयोगकर्ताओं को इसमें जोड़ सकते हैं:

EXEC sp_addrole 'SchemaBUsesSchemaAProc'
go
EXEC sp_addrolemember 'SchemaBUsesSchemaAProc','UserA';
go

नीचे दिए गए कथन से यह सुनिश्चित हो जाएगा कि UserA स्कीमा और NOT स्कीमा को देखने में सक्षम है। अच्छी बात यह है कि आप उपयोगकर्ताओं को केवल SchemaBUsesSchemaAProcभूमिका में जोड़ सकते हैं और वे उस भूमिका को दी गई सभी अनुमतियों को प्राप्त कर लेंगे।

GRANT SELECT ON SCHEMA::SchemaA TO SchemaBUsesSchemaAProc;
go

यदि आप केवल उपयोगकर्ता को SPA को निष्पादित करने की अनुमति देना चाहते हैं, जो स्कीमाबी के स्वामित्व में हैं, तो नीचे दिया गया कथन काम करेगा:

GRANT EXECUTE ON OBJECT::[SchemaB].[proc_SelectUserB] TO [SchemaBUsesSchemaAProc] 
go

इस तरह, UserA, स्कीमाबी तालिका को देखने में सक्षम नहीं है, लेकिन फिर भी स्कीमा से प्रोक्स निष्पादित कर सकता है।

नीचे अनुमति पदानुक्रम की व्याख्या करेगा :

यहाँ छवि विवरण दर्ज करें


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