Tablolara yetki vermeden sadece View’e yetki verebilmek (Ownership Chains)
View içeriğinde başka bir veritabanındaki objeyi içermiyorsa sadece view’e select yetkisi verdiğiniz takdirde, yetki verdiğiniz login tablolara yetki vermeden view’i select çekebilecektir. Fakat view’in içeriğinde başka bir veritabanı kullanılıyorsa aşağıdaki gibi bir hata alırsınız.
Msg 229, Level 14, State 5, Line 2
The SELECT permission was denied on the object ‘sehir’, database ‘Test’, schema ‘dbo’.
Aşağıdaki script yardımıyla yukarıdaki bahsedilen 2 veritabanı için DB_CHANING’i açarsanız ve bu 2 veritabanının owner’ı aynı ise yukardaki hatayı almadan select çekebileceksiniz.
ALTER DATABASE VeritabanıAdi1 SET DB_CHAINING ON GO ALTER DATABASE VeritabanıAdi2 SET DB_CHAINING ON
Burada dikkat edilmesi gereken önemli bir noktaya değineyim. Konsolide edilmiş bir instance’ınız olduğunu düşünelim. Ve bir uygulama 2 veritabanı kullanıyor. Bu 2 veritabanındaki bazı view’leri select edebilecek bir kullanıcı oluşturmanız gerekti. A veritabanında bir view oluşturdunuz ve bu view B veritabanındaki bir tabloyu select ediyor. View’i select edebilmek için yetkilendirdiğiniz kullanıcının view içersinde select edilen B veritabanındaki tablonun tamamını görememesi gerekiyor. Böyle bir durumda yukarda anlattığım gibi A ve B veritabanlarının owner’larının aynı olduğundan emin olduktan sonra yukarıdaki script yardımıyla DB_CHANING’i enable ettiğinizde sorun çözülecektir. Ama konsolide edilmiş bir ortam olduğu için bu ihtiyaç başka bir uygulama içinde ortaya çıkarsa karşımıza başka sorunlar çıkacaktır. Örneğin C ve D veritabanlarında da benzer bir ihtiyaç oluştu ve yukarıdaki gibi iki veritabanı içinde DB_CHANING’i aktif hale getirdik. Dolayısıyla A,B,C ve D veritabanlarında DB_CHANING aktif hale gelmiş oldu. Eğer bu 4 veritabanının owner’ları aynı olursa C veritabanında yetkili bir kullanıcı bir view oluşturabilir ve bu view’in içersinde A veritabanındaki bir tabloyu tabloya direk yetkisi olmadığı halde select,hatta truncate edebilir.
Server Seviyesinde de bu özellik aktif hale getirilebilir. Ama yukarıda bahsettiğim güvenlik sebebiyle bu özelliği aktif hale getirmemenizde fayda var. Yinede bazı durumlarda ihtiyaç olabileceğini düşünerek aşağıda script’ini paylaşıyorum.
EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE; EXECUTE sp_configure 'cross db ownership chaining', 1; RECONFIGURE;
Instance seviyesinde hangi veritabanlarında DB CHAINING enable durumda olduğunu öğrenmek için aşağıdaki script’i kullanabilirsiniz.
SELECT [name] AS [Database], [is_db_chaining_on] FROM [sys].databases where [is_db_chaining_on]=1 ORDER BY [name];