বিভিন্ন এসকিউএল সার্ভারের স্কিমার জন্য ব্যবহারকারীর অনুমতি সেট করা


16

আমার একটি নির্দিষ্ট ব্যবহারকারীর অ্যাক্সেস সীমাবদ্ধ করা দরকার, তবে তাদের ডিবিওর মালিকানাযুক্ত টেবিলগুলিতে ডেটা দেখতে সক্ষম হওয়া দরকার।

আমি নিম্নলিখিতটি করার চেষ্টা করছি:

  1. ডিবিও স্কিমা ফাংশন যেমন এটি সাধারণত হয়, সমস্ত কিছুর অ্যাক্সেস রয়েছে
  2. স্কিমা 1 স্কিমাটিতে কেবল স্কিমা 1 অবজেক্টে অ্যাক্সেস রয়েছে
  3. যদি কোনও স্কিমা 1 দেখুন বা সঞ্চিত পদ্ধতিটি ডিবিও-র মালিকানাযুক্ত টেবিলগুলিতে ডেটা অ্যাক্সেস করে, অনুমতিগুলি যথাযথভাবে শৃঙ্খলাবদ্ধ করে
  4. ইউজার 1 এর স্কিমা 1 এ অ্যাক্সেস রয়েছে এবং অন্য কিছুই নেই; # 3 এর ক্ষেত্রে বাদে

এখানে আমি চেষ্টা করেছি:

  1. এলোমেলো পাসওয়ার্ড সহ পরীক্ষার লগইনে ম্যাপযুক্ত একজন ব্যবহারকারী 1 তৈরি করুন
  2. এর মধ্যে কয়েকটি পরীক্ষার ডেটা দিয়ে ডিবিও স্কিমে কয়েকটি টেবিল তৈরি করেছে
  3. একটি স্কিমা 1 স্কিমা তৈরি করেছে
  4. একটি স্কিমা 1.get_ প্রোফাইলে তৈরি করেছে যা স্কিমা 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.

আমার যেটি দরকার তা হ'ল ইউজার 1 আমি যে স্টোর দিয়ে থাকি সেগুলি দিয়ে ডেটা অ্যাক্সেস করতে সক্ষম হওয়া এবং অন্য কিছুই নয়।

অতিরিক্তভাবে, এটি অবশেষে বিদ্যমান এসকিউএল অ্যাজুরি ডাটাবেসে লাইভ করার উদ্দেশ্যে তৈরি করা হয়েছে তবে আমি প্রথমে স্থানীয় ডামি ডাটাবেসের বিরুদ্ধে পরীক্ষা করছি।


আমার উত্তরটি দেখুন: ব্যবহারকারীর কাছ থেকে স্কিমা কীভাবে গোপন করবেন আপনার যদি আরও কোনও স্পেসিফিকেশন দরকার হয় তবে আমাকে জানান।
কিন শাহ

1
এটি আমার কাছে এটি আরও স্পষ্ট করে বলে মনে হচ্ছে। আমি মনে করি সমস্যাটি ছিল আমার কাছে ডিবিওর পরিবর্তে স্কিমা 1 এর মালিক ব্যবহারকারীর কাছে সেট করা ছিল। আমি স্কিমা 1 টি ব্যবহারকারীর মালিকানাধীন হিসাবে সেট করেছিলাম, মানিয়ে নিয়েছি এবং প্রশ্নটি অনুসরণ করেছি এবং আমি কিছু কাজ করতে সক্ষম হয়েছি। আপনি চাইলে প্রশ্নের উত্তর প্রস্তাব করতে পারেন। ধন্যবাদ!
জুলিয়া ম্যাকগুইগান

খুশি যে এটি আপনাকে সাহায্য করেছে।
কিন শাহ

উত্তর:


17

মূল ধারণাটি হ'ল গ্রান্ট / ডেনি স্কিমা অনুমতি ব্যবহার করা । আপনি কোনও ভূমিকা তৈরি করে এবং এরপরে সদস্যদের যুক্ত করে দক্ষতার সাথে অনুমতিগুলি পরিচালনা করতে পারেন।

নীচে একটি উদাহরণ যা আপনাকে বিস্তারিতভাবে ব্যাখ্যা করবে

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

এখন স্কিমাবি'র এসপিতে ইউজারএকে অনুমতি কার্যকর করার অনুমতি দিন

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

এটি পরীক্ষা করুন .. দেখতে ইউজারএ স্কিমাবি থেকে এসপি চালাতে সক্ষম কিনা। এটি পাস করবে

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

তবে ইউজারএ স্কিমাব থেকে ডেটা দেখতে সক্ষম হবে না

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 রোলটি ব্যবহার করতে পারেন এবং অনুমতিগুলির আরও ভাল পরিচালনা করার জন্য এটির মধ্যে ব্যবহারকারীদের যুক্ত করতে পারেন:

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

নীচের বিবৃতিতে নিশ্চিত হয়ে যাবে যে ইউজারএ স্কিমাএ এবং নয় স্কিমাবি দেখতে সক্ষম হয়েছে। ভাল কথাটি হ'ল আপনি কেবল ব্যবহারকারীদের SchemaBUsesSchemaAProcভূমিকায় যুক্ত করতে পারেন এবং তারা সেই ভূমিকার জন্য দেওয়া সমস্ত অনুমতিগুলির উত্তরাধিকারী হবে।

GRANT SELECT ON SCHEMA::SchemaA TO SchemaBUsesSchemaAProc;
go

আপনি যদি কেবল ইউটিএএকে এসপি'র চালনা করার অনুমতি দিতে চান যা স্কিমাবের মালিকানাধীন তবে নীচের বিবৃতিটি কাজটি করবে:

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

এইভাবে, ইউজারএ স্কিমাবের টেবিলগুলি দেখতে সক্ষম হয় না, তবে তবুও স্কিমাবি থেকে প্রকগুলি চালিত করতে পারে।

নীচে অনুমতি শ্রেণিবিন্যাসের ব্যাখ্যা করবে :

এখানে চিত্র বর্ণনা লিখুন


2
কেবল পুনরাবৃত্তি করার জন্য, এটি গুরুত্বপূর্ণ যে উভয় স্কিমা একই ব্যবহারকারীর মালিকানাধীন। এটি ছিল আমার মূল সমস্যা।
জুলিয়া ম্যাকগুইগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.