MSSQL Server’da Contained Database Nedir ve Nasıl Oluşturulur

Bu makalede MSSQL Server’da Contained Database Nedir ve Nasıl Oluşturulur konusuna değinmiş olacağız. Sql server 2012 ile hayatımıza girmiştir. Kullanmadan önce aktif etmemiz gerekiyor. Contained database veritabanımızın diğer veritabanlarından ve instance’dan ayrı olmasıdır. Kısacası metadata bilgileri instance seviyesinde tutulmuyor veritabanı seviyesinde tutuluyor. Normalde bir veritabanına bir login map ettiğimizde veritabanımızı başka bir ortama taşıdığımızda bu loginlerinde taşınması lazım çünkü veritabanı altında tanımlamış olduğumuz loginin user’ı gider ama login’ler taşınmaz ya taşıdığımız ortamda yeni bir login oluşturmamız gerekiyor aynı sid ile ya da contained database oluşturarak bu taşınma sorununun önüne geçebiliriz. Ayrıca veritabanını contained yapıya dönüştürdüğümüzde  loginlerin taşınması sorunu bir tarafa diğer veritabanlarını görme sorunu da çözülmüş oluyor.

Contained database oluşturmak için ilk başta instance seviyesinde bu configürasyonumuzu sağlamamız gerekiyor. Kendi instance’ımızda contained database oluşturacağımız zaman yada taşıyacağımız ortamda açmadan önce aşağıdaki komutların çalıştırılması lazım. Yada instance üzerine sağ tıklayıp advanced’den yapabiliriz.

sp_configure 'show advanced options',1
reconfigure
go

sp_configure 'contained database authentication',1
reconfigure
go
sp_configure 'show advanced options',0
reconfigure

Daha sonra contained database oluşturmamız gerekiyor veritabanının üzerine sağ tıklayıp New Database dedikten sonra partial seçeneğini işaretlememiz gerekiyor.

Containment  type’ı partial yaptıktan sonra  veritabanı altında security>user’dan sql user with password oluşturmamız gerekiyor.

Gerekli yetkileride sol tarafta bulunan  bölümde vermemiz lazım owned schemas ve membership kısmından db owner verilmesi yeterli.

Veritabanımızı başka bir instance üzerine taşıdığımızı düşünelim taşımadan önce sp_configure ayarlarının yapılması gerekiyor.

Contained yapıda oluşturduğumuz veritabanı altında oluşturduğumuz user ile başka bir sunucuya giriş yaptığımızda hata mesajı almış olduk.

Burada hata almamak için küçük bir ayar yapılması lazım. Connect to database kısmına isminin yazılması gerekiyor.

Sorunsuz bir şekilde bağlanmış bulunmaktayız.

S1 sunucumda contained database kapalı, S2 sunucusunda database backup alıp başka bir sunucuya restore edeceğim.

S2  sunucusundan backup aldıktan sonra S1 sunucusuna restore etmeye çalıştığımda hata mesajı ile karşılaşıyorum.

Bu hatayı almış oldum sp_configure’den contained database yapısının aktif edilmesi gerektiğini söylüyor.

sp_configure 'show advanced options',1
reconfigure
go

sp_configure 'contained database authentication',1
reconfigure
go
sp_configure 'show advanced options',0
reconfigure

Bu ayarları yaptıktan sonra otomatik olarak bağlandığını görmüş oluyorum.

Şimdi oluşturmuş olduğumuz  contained database’imize başka user’lar nasıl eklenebilir onu yapmaya çalışalım.

Elimizde bulunan loginleri contained database’e taşımak münkün elimizde bulunan login derken kendi sistemimizde 2 tane kullanıcıya CONTAIDDB üzerinde yetki vereceğiz.

Şimdi DENEME2 adında  instance bazında login oluşturuyorum.

Daha sonra partial yapıda oluşturduğumuz veritabanı altında  DENEME2 login’inde geldiğini görmüş olacağız.

Evet bu yapımızdada sanki contained database yapısı gibi gözüküyor ama backup alınıp başka bir server’a restore ettiğimizde  DENEME2 login’iyle giriş yapmaya çalıştığımızda yapamayacağız çünkü login yok veya yeni sunucuda aynı hash değerleriyle login oluşturulması gerekmekte buda contained database yapısına ters çünkü zaten böyle bir sorunumuz vardı diye contained dabatabase yapısına geçiyoruz.

Bu sorunun önüne geçmek için loginimizi contained database altına sanki CONTAIDDB veritabanı altında sql user with password’la oluşturulmuş gibi olacak ve bu veritabanı altında oluşturulan yeni user  ile giriş yaptığımızda sanki contained yapıda oluşturulmuş gibi olacak.

Yukarıda ekran resminde  loginimiz contained yapıda değil.

Yukarıda ilk örneğimde contaidddbuser login’ninin CONTAIDDB  veritabanı üzerinde db_owner yetkisi vardı. Bu kullanıcıyı contained database yapısında kullanmıştık. Yukarıda yapmış olduğum DENEME2 loginine  contaid database üzerinde db_owner yetkisi vermiştik. Ama bu login hala contained database yapısında değil.

use CONTAIDDB
EXEC sp_migrate_user_to_contained 
 @username =  N'DENEME2' ,   
     @rename =  N'copy_login_name'  ,   
     @disablelogin = N'do_not_disable_login' ;

Bu procedure 3 adet parametre almaktadır.

UserName: Taşımak istediğiniz Login adı

Rename: Eğer login adı ile ona bağlı olan user adı farklı oluşturulmuşsa, Contained User adı olarak ‘keep_name’ seçeneği ile user adını, ‘copy_login_name’ seçeneği ile login adını kullanır. Login ve user adları aynı ise iki seçenek de aynı sonucu verir.

DisableLogin: İşlemden sonra loginin disable durumda olup olmayacağının belirlenmesidir. ‘disable_login’ ve ‘do_not_disable_login’ seçenekleri vardır.

Aşağıda  bulunan cursor yardımıyla contained database altındaki tüm user’ları contained database yapısına getirebiliriz.

Use CONTAIDDB
DECLARE @username sysname ;  
DECLARE user_cursor CURSOR  
    FOR   
        SELECT dp.name   
        FROM sys.database_principals AS dp  
        JOIN sys.server_principals AS sp   
        ON dp.sid = sp.sid  
        WHERE dp.authentication_type = 1 AND sp.is_disabled = 0;  
OPEN user_cursor  
FETCH NEXT FROM user_cursor INTO @username  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
        EXECUTE sp_migrate_user_to_contained   
        @username = @username,  
        @rename = N'keep_name',  
        @disablelogin = N'disable_login';  
    FETCH NEXT FROM user_cursor INTO @username  
    END  
CLOSE user_cursor ;  
DEALLOCATE user_cursor ;

Daha sonra herhangi bir login oluşturulduğunda ilgili contained database altında yetki verildikten sonra  yukarıdaki kod bloğuyla ilgili veritaban altında bulunan tüm kullanıcıları bu yapıya çevirdik.

Bu örnek için kurmuş olduğum loginde bu yapıya geçmiş oldu.

Asıl mesele CONTAIDDB altında bulunan security tabında bir user oluşturmak şimdi bu CONTAIDDB altında user’larımızı oluşturalım.

A user’ını  contained database altında oluşturdum ve sol tarafta owned schemas veya membership kısmından gerekli yetkileri verebiliriz. Veritabanımızı contained yapıya dönüştürmezsek eğer SQL user with password adı altında bir kullanıcı oluşturamayız.

Burada A kullanıcısını db_owner olarak oluşturduğum için tüm userları görmüş oldum daha kısıtlı bir yetki ile oluştursaydım gelmeyecekti.

Kısıtlı bir şekilde B user’ı oluşturup login olduğum tüm kullanıcıların gelmediğini görmüş olacağım.

Veritabanı contained yapıya dönüştürülmediğinde veritabanı altında bulunan user tabında sql user with password ifadesi görülmemektedir. Aşağıdaki resimde de görülmektedir.

Başka bir makalede görüşmek dileğiyle..

“Gurura kapılarak insanlara burun kıvırma, ortalıkta çalım satarak yürüme; unutma ki Allah gurura kapılıp kendini beğenen hiç kimseyi sevmez.”Lokman-18

Author: Yunus YÜCEL

Bir yanıt yazın

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