Bir Kullanıcının Yetkilerini Başka Kullanıcıya Kopyalamak

SQL Server’de bir kullanıcıya verdiğimiz yetkileri başka bir kullanıcıya nasıl kopyalayabiliriz. T-SQL’de bunu doğrudan yapabileceğimiz bir komut yapısı bulunmamaktadır. Her defasında her kullanıcı için GRANT ve DENY ifadelerini kullanarak manual olarak aynı yetkilerin verilmesi gerekir. Veya Management Studio veya Enterprise Manager üzerindeki Generate Script bölümü kullanılarak veritabanına ait script kodları oluşturulur. Orada ilgili kopyalama ve değiştirme işlemi yapılır. Bu yazıda nasıl bir script yazılarak bu işlemin daha kolay yapılacağını örneklendireceğiz.
Öncelikle Login1 ve Login2 isminde iki tane SQL Server bağlantı kullanıcısı tanımlayalım.

CREATE LOGIN Login1 WITH PASSWORD = '123';
GO
CREATE LOGIN Login2 WITH PASSWORD = '123';

Bu kullanıcıları Deneme veritabanına bağlanmaları için ilişkilendirelim yani Deneme veritabanı için user tanımlayacağız.

CREATE USER [Kullanici1] FOR LOGIN [Login1]
GO
CREATE USER [Kullanici2] FOR LOGIN [Login2]

Kullanici1 isimli kullanıcıyı Deneme veritabanındaki Musteri tablosunu SELECT edebilecek ama INSERT ve DELETE yapamayacak şekilde yetkilendirelim. Musteri tablosundaki MusteriId kolonunu SELECT etmesin sadece AdSoyad kolonunu SELECT edebilsin.

DENY DELETE ON [dbo].[Musteri] TO [Kullanici1]
DENY INSERT ON [dbo].[Musteri] TO [Kullanici1]
DENY SELECT ON [dbo].[Musteri] ([MusteriId]) TO [Kullanici1]
GRANT SELECT ON [dbo].[Musteri] ([AdSoyad]) TO [Kullanici1] AS [dbo]

Bu işlemi kontrol etmek için Login1 ile SQL Server’e bağlanıp Musteri tablosundan kayıt silelim. Bu durumda The DELETE permission was denied on the object ‘Musteri’, database ‘Deneme’, schema ‘dbo’. hata mesajıyla karşılaşırız. Veya tablodaki tüm kolonları listelemek istediğimiz zaman The SELECT permission was denied on the column ‘MusteriId’ of the object ‘Musteri’, database ‘Deneme’, schema ‘dbo’. hata mesajı verilir.
SQL Server 2005’in güvenlikle ilgili sorgulanacak catalog view’leri şunlardır;
sys.objects : Mevcut veritabanı içerisindeki table, view, stored procedure nesnelerini listeler.
sys.columns : Table, view gibi nesnelerin kolonlarını listeler.
sys.database_role_members : Veritabanı kullanıcısıyla veritanı rolleri arasındaki ilişkiyi listeler.
sys.database_permissions : Kullanıcı ve rollere atanmış olan database seviyesindeki yetkileri listeler.
sys.database_principals : Database kullanıcı ve rollerini listeler.
Bu katalogları kullanarak tüm yetkileri ilişkili oldukları nesnelerle aşağıdaki script aracılığıyla listeleyebiliriz.

select   database_permissions.permission_name,
           coalesce(objects.type_desc,database_permissions.class_desc)
                           + case when objects.type_desc is not null and minor_id > 0 then '-COLUMN'
                                      else '' end as object_type,
           case database_permissions.class_desc
                  when 'SCHEMA' then schema_name(major_id)
                  when 'OBJECT_OR_COLUMN' then
                                  case when minor_id = 0 then object_name(major_id)
                                   else (select object_name(object_id) + '.'+ name
                                          from sys.columns
                                          where object_id = database_permissions.major_id
                                             and column_id = database_permissions.minor_id) end
                  else 'other' end as object_name,
           database_principals.name as database_principal,
           database_permissions.state_desc as grant_state
from    sys.database_permissions
               join sys.database_principals
                     on database_permissions.grantee_principal_id = database_principals.principal_id
               left join sys.objects
                     on objects.object_id = database_permissions.major_id
where database_permissions.major_id > 0
    and permission_name in ('SELECT','INSERT','UPDATE','DELETE')
order by object_name 


SQL Server 2000’de konuyla ilgili olarak syspermissions, sysprotects, sysobjects, sysusers, syscolumns katalog nesneleri kullanılmaktadır.
Aşağıdaki kodlar bir kullanıcıya ait yetkileri diğer kullanıcıya kopyalamak için ikinci kullanıcıya göre uyarlanmış scriptleri oluşturur.
SET NOCOUNT ON

DECLARE @EskiKullanici sysname, @YeniKullanici sysname

SET @EskiKullanici = ‘Kullanici1’
SET @YeniKullanici = ‘Kullanici2’

SELECT ‘–‘+ QUOTENAME(DB_NAME()) +’ veritabanını seç’
SELECT ‘USE’ + SPACE(1) + QUOTENAME(DB_NAME())

SELECT ‘–‘+ QUOTENAME(@EskiKullanici) + ‘ kullanıcısının yetkileri ‘+
QUOTENAME(@YeniKullanici) +”’ye kopyalanacak’

SELECT ‘EXEC sp_addrolemember @rolename =’
+ SPACE(1) + QUOTENAME(USER_NAME(rm.role_principal_id), ””)
+ ‘, @membername =’ + SPACE(1) + QUOTENAME(@YeniKullanici, ””) AS ‘–Rol yetkileri’
FROM sys.database_role_members AS rm
WHERE USER_NAME(rm.member_principal_id) = @EskiKullanici
ORDER BY rm.role_principal_id ASC

SELECT CASE WHEN perm.state
Bu script aşağıdaki gibi script yapısını oluşturur.
--[Deneme] veritabanını seç
----------------------------
USE [Deneme]
-----------------------------
--[Kullanici1] kullanıcısının yetkileri [Kullanici2]'ye kopyalanacak
--Rol yetkileri
-----------------------------
--Nesne Seviyesindeki Yetkiler
-----------------------------
DENY DELETE ON [dbo].[Musteri] TO [Kullanici2]
DENY INSERT ON [dbo].[Musteri] TO [Kullanici2]
DENY SELECT ON [dbo].[Musteri]([MusteriId]) TO [Kullanici2]
GRANT SELECT ON [dbo].[Musteri]([AdSoyad]) TO [Kullanici2]
--Database Seviyesindeki Yetkiler
-----------------------------
GRANT CONNECT TO [Kullanici2]

Bu script’i Query Analyzer’a kopyalayıp çalıştırmamız yeterlidir.
Şimdi tüm yetkileri listeleyecek olursak aşağıdaki gibi Kullanici2 de dahil edilmiş olur.

Kaynak : vyaskn.tripod.com

Bir Kullanıcının Yetkilerini Başka Kullanıcıya Kopyalamak” hakkında 2 yorum

  1. Osman KILIÇ

    kolay gelsin bu kadar usta birini buldum bir soruda ben sorayım bari :=)
    bir tabloda 4 adet alanım var bu alanları anlatayım önce
    alan 1 (s)
    alan 1 (*)
    alan 2 (s)
    alan 2 (*)
    alan 3 1060
    alan 4 1065alan 3 de 1060 ı arama yapıyorum buldugu takdirde alan1 e bakması lazım bulursa alan1 e bakacak (s) ise alan 2 ye bakacak (s) ise tablo 4 deki 1065 i alıp tekrar tablo 3 bakacak varsa tekrarlıyacak bu olayı eyer tablo 1 tablo 2 özellikle tablo 2 (*) ise bu sorgu sonlanacak bilmem anlatabildimmi :=)

    Cevapla
  2. Ahmet Kaymaz Yazar

    Osman,bunun en iyi çözümü döngüsel işlem (cursor, while .) yaptırmandır. Bahsettiğin değeri buluncaya kadar tabloyu tarayacaksın.

    Cevapla

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir