Farklı SQL Server şemaları için kullanıcı izinlerini ayarlama


16

Belirli bir kullanıcıya erişimi sınırlamanız gerekiyor, ancak yine de dbo'ya ait tablolardaki verileri görebilmeleri gerekiyor.

Aşağıdakileri yapmaya çalışıyorum:

  1. dbo şeması normalde olduğu gibi çalışır, her şeye erişebilir
  2. şema1 şemasının yalnızca şema1 nesnelerine erişimi var
  3. bir şema1 görünümü veya saklı yordam dbo'ya ait tablolardaki verilere erişiyorsa, izinler zinciri uygun şekilde
  4. user1, şema1'e erişebilir ve başka bir şey yoktur; # 3 hariç

İşte denedim:

  1. Rastgele bir parolayla test girişiyle eşlenen bir user1 kullanıcısı oluşturun
  2. Bazı test verileri içeren dbo şemasında birkaç tablo oluşturuldu
  3. Bir şema1 şeması oluşturuldu
  4. Dbo.people, dbo.taglinks ve dbo.tags içindeki verilere erişen schema1.profiles adlı görünümden seçilen bir schema1.get_profiles oluşturuldu

Ancak, user1 olarak oturum açmışken aşağıdaki ifadeyi kullanarak:

EXEC get_profiles 1

sonuç:

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

Denedim WITH EXECUTE AS OWNERve "sahiplik zincirinin" nasıl çalıştığını anlamaya başlayamıyorum.

Ben de denedim

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

ancak aşağıdaki hatayı alıyorum (dbo düzeyinde erişime sahip bir kullanıcı olmasına rağmen):

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

İhtiyacım olan veri1 verdim saklı yordamlar aracılığıyla verilere erişmek için, ve başka bir şey.

Ayrıca, bu sonunda varolan bir SQL Azure veritabanında yaşamak için tasarlanmıştır, ancak önce yerel bir kukla veritabanı karşı test ediyorum.


Cevabıma bakın: Şemayı kullanıcıdan gizleme Daha fazla açıklamaya ihtiyacınız olup olmadığını bana bildirin.
Kin Shah

1
Bu benim için daha açık hale geldi. Ben sorun Schema1 sahibi dbo yerine User1 olarak ayarlanmış olduğunu düşünüyorum. Şema1'i Kullanıcı1'e ait olacak şekilde ayarladım, uyarladım ve soruyu takip ettim ve işe yarayan bir şey elde edebildim. İsterseniz soruya bir cevap önerebilirsiniz. Teşekkürler!
Julia McGuigan

Sana yardım ettiğine sevindim.
Kin Shah

Yanıtlar:


17

Temel kavram, HİBE / DENY Şeması İzinlerini kullanmaktır. . Bir rol oluşturarak ve daha sonra ona üye ekleyerek izinleri etkili bir şekilde yönetebilirsiniz.

Aşağıda size ayrıntılı olarak açıklanacak bir örnek verilmiştir.

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

Şimdi test edin:

--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'.

Şimdi Saklı Yordamlar oluşturun:

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

Şimdi SchemaB'nin SP'sinde UserA'ya yürütme izinleri verin

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

Test edin .. UserA'nın schemaB'den SP çalıştırıp çalıştıramayacağını görmek için. Bu geçecek

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

Ancak UserA, SchemaB'deki verileri göremez

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'.

Alternatif olarak, DATABASE ROLE'u kullanabilir ve izinlerin daha iyi yönetilebilirliği için kullanıcıları ekleyebilirsiniz:

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

Aşağıdaki ifade UserA'nın schemaA'yı DEĞİL, schemaB'yi görmesini sağlayacaktır. İyi olan şey, SchemaBUsesSchemaAProcrol için kullanıcıları ekleyebilmeniz ve bu role verilen tüm izinleri devralacak olmalarıdır.

GRANT SELECT ON SCHEMA::SchemaA TO SchemaBUsesSchemaAProc;
go

Yalnızca UserA'nın SchemaB'ye ait SP'leri yürütmesine izin vermek istiyorsanız, aşağıdaki ifade işi yapar:

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

Bu şekilde, UserA SchemaB'nin tablolarını göremez, ancak yine de SchemaB'den procları çalıştırabilir.

Aşağıda izin hiyerarşisi açıklanacaktır :

resim açıklamasını buraya girin


2
Tekrarlamak gerekirse, her iki şemanın da aynı kullanıcıya ait olması önemlidir. Ana sorun buydu.
Julia McGuigan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.