SQL Server 2011 Denali – Contained Database
SQL Server 2011 Denali ile gelen çok güzel özelliklerden biri de Contained Database mantığı. Contained Database ile database engine’den izole edilmiş bir veritabanı oluşturabilir ve instance’lar arasında sıkıntısız bir şekilde taşıma işlemi gerçekleştirebiliriz.
Hepimizin başına gelmiştir. A sunucusunda bulunan bir veritabanını B sunucusuna backup-restore ya da detach-attach metodu ile taşıdıktan sonra kullanıcıların gelmediğini görürüz ve bu kullanıcıları şifreleri ile beraber taşımak zorunda kalırız. Ya da kullanıcılar orphaned olarak kalır ve ekstra işlem yapmamız gerekir. Bunun nedeni login’lerin server seviyesinde saklanıyor olması ve authentication’ın server side’da yapılıyor olmasıdır.
Contained Database ise veritabanının tanımlanması için gerekli olan bütün metadata bilgilerini ve veritabanı özelliklerini kendi üzerinde tutar. Bu tarz veritabanlarında login’ler database engine level’ında authenticate olmazlar. User bilgileri veritabanı içerisinde saklanır. Bu şekilde database engine’den izole edilmiş olan veritabanı, sunucular arasında çok rahat bir şekilde taşınır ve ekstra yapılacak işlem sayısı çok aza indirilir.
SQL Server Denali ile beraber CONTAINMENT tipi olarak 2 seşenek gelmektedir. Bunlar Full ve Partial Containment’tır. Fakat CTP3’de şu an için sadece Partial Containment tipini kullanabilmekteyiz.
Sunucuda Contained Database kullanabilmek için server side seçeneği olan “contained database authentication” özelliğinin true yapılması gerekmektedir. Bu özelliği hem SSMS’den hem de query ile yapmamız mümkün.
T-SQL ile Contained Database Özelliğinin Aktif Edilmesi
Bu işlemi aşağıdaki script ile yapabilirsiniz.
sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE ;
GO
sp_configure 'contained database authentication', 1;
GO
RECONFIGURE ;
GO
sp_configure 'show advanced options', 0 ;
GO
RECONFIGURE ;
GO
SSMS ile Contained Database Özelliğinin Aktif Edilmesi
SSMS’te server adına sağ tıklayıp properties kısmına geçelim. Advanced tab’ında bulunan Containment kısmında Enable Contained Databases özelliğini True yapalım.

Contained Database Oluşturma
Gene hem T-SQL ile hem de SSMS ile bu işlemi yapabiliriz. SSMS ile yaparken standart olarak new database ekranını açalım ve Options kısmına geçelim.
Burada gördüğünüz gibi Containment Type adında yeni bir özellik eklenmiş durumda. Bu kısımdan containment’ın tipini full ya da partial olarak seçebiliriz. Dediğim gibi CTP3'de sadece partial desteklenmekte.

Containment tipi değiştirdiğimizde alt tarafta bulunan Containment kısmının aktif olduğunu görüyoruz. Burada bulunan 5 özelliği veritabanına özel tanımlayarak sunucudan izole edebiliriz.
Örneğin sunucunun Default Language özelliği Turkish iken Contained veritabanının Default Language özelliğini English yapmamız mümkün. Bu durumda bu veritabanını başka bir sunucuya taşıdığımızda gene bu özellikler ile taşınmış olacaktır.
Contained Olmayan Bir Veritabanını Contained Hale Dönüştürme
Gene bu işlemi bir önceki adımda anlattığım gibi SSMS programında Database özelliklerinden yapabilirsiniz. Ya da aşağıdaki script ile bu işlemi yapmanız mümkün.
USE [master]
GO
ALTER DATABASE [SampleDB1] SET CONTAINMENT = PARTIAL
GO