Veritabanı rolleri, sadece belirli bir veritabanı için geçerlidir ve veritabanı seviyesinde yetki kontrolü sağlar. SQL Server, kullanıcıların farklı seviyelerde erişim ve yetkilerle işlem yapabilmesini sağlar.
Bu makalede sql server sunucusunda yeni bir login oluşturulunca user mapping bölümünde kullanıcıyı herhangi bir veritabanı üzerinde veritabanı seviyesinde yetki verebiliriz.
User Mapping bölümünde oluşturacağımız Login’in hangi veritabanlarına erişiminin ve bu veritabanlarında ne tür yetkilerinin olmasını istediğimizi belirliyoruz. Bu kısımda alt taraftaki seçenekler de Database bazlı rollerdir.

DBROL isminden bir kullanıcı oluşturup AdvantureWorks2014 veritabanında yetki veriyoruz. İlk başta database bazında herhangi bir yetki vermeyip database üzerinde ne gibi konfigürasyonlar yapabiliyoruz ona bakalım.

Public yetkisi olduğu için veritabanı altında hiçbir tabloyu göremeyeceğiz. Çünkü public yetkisinde veritabanı üzerine erişim sınırlı.

Veritabanı üzerinde bazı ayar değişiklikleri yaptığımdada yine aynı hatayı veriyor bunun için bazı veritabanı seviyesinde rollere ihtiyacımız oluyor.
db_accessadmin : Veri tabanında bulunan kullanıcılara kural ve yetki atayan veritabanı seviyesinde role dür. Kullanıcıları ekleyebilir, silebilir, veritabanına giriş izinleri verebilir.
db_backupoperator : SQL Server üzerinde tanımlanmış olan veritabanı üzerinde backup alınabilir hale gelmesini sğlar.
db_datareader : Veritabanı üzerinde select sorgusu ile sorgulanabilir ifadelerin çalıştırılabilmesi için verilen veritabanı seviyesinde roldür.
db_datawriter : Kullanıcının database üzerinde yer alan tablolarda değişiklik yapmasına imkan veren kullanıcı rolüdür. Bu yetkiye sahip kullanıcı tablolara insert,update,delete yapabilir.
db_ddladmin : Veri tabanındaki kullanıcıların DDL ( Data Definition Language) komutlarını çalıştırmasına izin verir. DDL deyimlerinin örnekleri arasında CREATE, ALTER ve DROP bulunur. Tablo, view,functions indeks gibi nesneleri oluşturabilir, değiştirebilir veya silebilir.
db_denydatareader : Tablo üzerinde select sorgularının çalıştırmasına izin vermez.
db_denydatawriter : Bu role sahip kullanıcımızın database objelerine Update,Delete,Insert sorguları atmasını engeller.
db_owner : Veritabanı üzerinde tam yetkili olan veritabanı seviyesinde bir role dür.
db_securityadmin : Veritabanı üzerinde bulunan kullanıcıları yönetme yetkilendirme gibi işlemleri vardır.
Public : Oluşturulan her user için tanımlanan default roldür. Her veritabanı altında bu durum aktifdir.Sql server bu kullanıcıyı arka planda takip edebilmek adına giriş izni var mı yok mu denedimi hata aldımı bir takım işlemleri kontrol etmek için kullanılır.
Şimdi genellikle gerçek sistemlerde kullanacılara veritabanı üzerinde db_datareader,db_datawriter ,db_ddladmin bu yekiler verilir şimdi gelelim bu yetkiler ile neler yapılır veya yapılamaz.
SQL Server’da bir kullanıcıya bir rol atamak için şu komut kullanılabilir:
EXEC sp_addrolemember 'dbo_wner', 'KullaniciAdi';
Db_datareader yetkisi vermeden önce kullanıcımızın public yetkisi olduğu veritabanına select çekelim bakalım ne gibi işlemlerle karşılaşacağız.
Sürekli connect to server’dan login olmamak sanki o kullanıcıya bağlanmışız gibi execute as login script’ini kullanalım.
execute as login = 'DBROL'
USE [AdventureWorks2014]
select*from [HumanResources].[Department]
revert
go
The SELECT permission was denied on the object ‘Department’, database ‘AdventureWorks2014’, schema ‘HumanResources’.
Execute as login ile giriş yaptıktan sonra revert komutu çıkmamızı sağlıyor bu login’den.

Şimdi bu kullanıcımızın user mapping ile yetkili olduğu veritabanı üzerinde db_datareader yetkisi verelim.

Bu yetkiyi verdikten sonra tekrar execute as login komutuyla bakalım ne gibi bir sonuçla karşılaşacağız.

Tablomuzdaki tüm değerleri görmüş olduk. Sorun şu bu login tüm tablolara select çekebilecek ben ilgili tablolara sadece select çeksin dersem şu yol izlenir.
İlk başta login üzerindeki db_datareader rolü kaldırılır sadece public yetkimiz var.
Login’imizin yetkili olduğu veritabanı üzerinde bulunan security bölümünde ilgili kullanıcıya sağ tıklanır properties’dan girilir.

Burada bulunana securables kısmında search deyip specific objects ikonunu tıklayarak tamam tuşuna basılır. Yine sol tarafta bulunan membership kısmında daha kapsamlı yetkiler veriliyor.(read-write-owner) burada kısıtlayacağız.


Object types bölümüne tıklıyoruz.

Burada tablo bazlı kısıtlama yapacağımız için tables ikonunu seçiyoruz. Burada istersek farklı konfigürasyonlarıda yapabiliriz.

Browse sekmesine tıkladıktan sonra hangi tabloya select çekmek veya başka bir işlem yapmak istiyorsak o tablo veya tablolar seçilir bir sonraki adıma geçilir.

3 tablomuzu seçtikten sonra grant, deny veya with grant ekranına gidiyoruz.

Baştaki tablomuza deny diğer tablolarıma grant yetkisi verdim bakalım select çekebilecek miyiz.

Yetki verdiğimiz tablo gelmiş oldu diğer tabloya yetki çekelim bakalım geliyor mu.

Görmüş olduğumuz gibi tanımlamış olduğumuz gibi verimiz gelmedi. Yukarıda görmüş olduğumuz gibi tüm tablolara select yetkisi vereceğimize sadece belirli tablolara verebiliriz.
Diğer database seviyesinde roller içinde yetkilerimizi daha alt seviyede yapabiliriz.
Schema bazında yetkide verebiliriz sadece dbo olan scheme’lara select çeksin diye.


Şema bazındada görmüş olduğumuz gibi yetki verebiliriz.

Yada veritabanı altında bulunan security kısmındada ilgili schema’larımızı bulup üzerine sağ tıklayıp ayarlardan permission’dan istediğimiz sipesifik yetkileri aynı şekilde verebiliriz.

Kullanıcıya daha üst bir yetki vermek istiyorsak veritabanı üzerine sağ tıklayıp permission kısmından function oluşturmasını veya tablo oluşturmasını söyleyebiliriz.
Ama security bölümündeki user kısmından sadece var olan tablo veya başka bir şey üzerinden işlem yapılır.
Server rollerinde olduğu gibi database rollerinde de her bir rolün detaylı yetkilerini görmek istediğimizde sp_dbfixedrolepermission ile görebiliriz.
exec sp_dbfixedrolepermission 'db_datareader'


Oluşturulan login’in user mapping bölümünde hangi db altında tanımlanmasını istiyorsak onu seçeriz ve aynı isimde user oluşur user ismini kendimizde ssms arayüzünden ya da aşağıda bulunan script yardımıyla yapabiliriz.

Dikkat edersek veritabanı altında bizim login ismimizle aynı gelir yukarıdaki şekilde oluşturduktan sonra tekrardan değiştirme yapacağız.

Şimdi user ismini YU yapalım.


Kod şeklide resimde gözükmektedir
--Bu kod önceden veritabanı altında oluşan user name ismini değiştirmektedir.
USE [AdventureWorks2014]
GO
ALTER USER [USERISIM] WITH NAME=[YU]
GO
Aşağıdaki komut ile belirtilen kullanıcının instance altında hangi veritabanı üzerinde hangi database rollere sahip olduğunu görebiliriz. Komut instance altındaki tüm veritabanlarını taramaktadır.
EXEC sp_MSforeachdb '
USE [?];
SELECT DB_NAME() AS VeriTabaniAdi, dp.name AS KullaniciAdi, dp.type_desc AS KullaniciTuru,
STRING_AGG(rp.name, '','') AS Roller
FROM sys.database_principals dp
LEFT JOIN sys.database_role_members rm ON dp.principal_id = rm.member_principal_id
LEFT JOIN sys.database_principals rp ON rm.role_principal_id = rp.principal_id
WHERE dp.name = ''LOGIN_NAME''
GROUP BY dp.name, dp.type_desc;'
Not: Bir veritabanına okuma yetkisi verildikten sonra bu kullanıcı veritabanı properties ekranına girebilir. Ayrıca veritabanı altında bulunan index ve istatistik bilgilerine ulaşabilir. Ayrıca komutla veritabanı üzerinde tüm tabloların boyutunu görebilir.
Bu makalede veritabanı altında bulunan database rollerini görmüş olduk. Başka bir makalede görüşmek dileğiyle..
“Allah’ın, göklerde ve yerde bulunan şeyleri hizmetinize verdiğini, nimetlerini gizli ve açık olarak önünüze bolca serdiğini görmez misiniz? İnsanlardan öyleleri vardır ki bir bilgi, bir rehber ve aydınlatıcı bir kitap olmadan Allah hakkında tartışmaya kalkışırlar.”Lokman-20