20 Şubat 2014 Perşembe

Contained Databases


Selam arkadaşlar,

Size SQL Server 2012 ile birlikte gelen (ve belli ki arkası da gelecek olan) yeni bir özellikten, Contained Database özelliğinden bahsetmek istiyorum.

Bir cümlede anlatmaya çalışırsak, Contained Database'ler SQL Server Instance'ına bağımlı kalmadan, kendi kullanıcılarını (Login'lerini barındıran) ve bu sayede bir High Availibility yöntemiyle veya elle başka bir SQL Server Instance'ına taşındığında Login Mapping işleriyle uğraşmadan hemen kullanılabilecek veritabanlarıdır. 

SQL Server 2012 versiyonunda Contained Database özelliği kısmi olarak desteklenmekte (Containment = Partial), tam desteğin daha sonraki versiyonlarda geleceğine dair söylentiler var.

Daha da merak edenler için hemen veritabanlarının SQL Server Instance'ına bağımlılığı derken neyi kastettiğimi açıklayayım. Önceden de hatırlarsanız SQL Server'da kullanıcıların hem Instance düzeyinde (Login olarak) hem de veritabanı düzeyinde (User olarak) yaratıldığından ve yetkilendirildiğinden ayrıntılarıyla bahsetmiştim. Yeniden ve tek cümleyle hatırlatmak gerekirse, bir kullanıcının bir SQL Server veritabanına bağlanıp işlem yapabilmesi için öncelikle SQL Server Login'iyle SQL Server Instance'ına bağlanabilmesi ve Login'ine bağlanmış olan Database User'ı ile de veritabanına bağlanıp işlem yapabilmesi gerekiyor. Contained Database'lerde ise bir Login'e gerek kalmadan, Instance düzeyinde bir yetki denetimine tabi olunmadan doğrudan bir Database User ile veritabanına bağlanılıp işlemler yapılabiliyor.

Bir Contained Database oluştururken yine CREATE DATABASE komutunu kullanıyoruz, normal veritabanlarından farklı olarak ise sadece "CONTAINMENT = PARTIAL" parametrelerini aşağıdaki de ekliyoruz. Aşağıdaki kod ile "Veritabanim_contained" adında bir Contained Database oluşturmuş oluyoruz.

CREATE DATABASE [Veritabanim_contained] CONTAINMENT = PARTIAL

Hatırlarsanız bir veritabanı kullanıcısı (Database User) oluştururken aşağıdaki gibi bir komut kullanıyoruz:

CREATE USER [ekremo] FOR LOGIN [ekremo] WITH DEFAULT_SCHEMA=[dbo]

Bir Contained Database için ise aşağıdaki gibi bir kullanıcı da oluşturabiliyoruz:

CREATE USER [ekremo_contained] WITH PASSWORD=N'123456', DEFAULT_SCHEMA=[dbo]

Gördüğünüz gibi bu kullanıcının doğrudan kendi şifresi var ve bu veritabanına log in olurken bu bilgileri kullanarak log in olacak. Böylece hiç Instance seviyesinde bir güvenlik denetimi işlemi yapılmamış olacak. Doğrudan veritabanına log in olabilecek. Ben yukarıdaki örnekte nasıl bir şifreyle kullanıcı oluşturulacağını gösterdim, fakat bir Windows User'dan da, bir sertifikayla da Contained Database User oluşturulabilir.

Peki neden böyle bir ihtiyaç var? Yani birileri Login'lere gıcık mı oldu da o kadar uğraştı ve Contained Database diye bir şey icat etti? Tabii ki bunun oldukça geçerli bir nedeni var: High Availibility!

Bu konuda hiçbir bilgisi ve ilgisi olmayan arkadaşlarım için: "veritabanlarının a sunucusundan b sunucusuna otomatik olarak yedeklenmesi" diyebileceğim, meraklı arkadaşlarım için ise "Log ShippingDatabase Mirroring (artık Always On oluyor bu)Replication, Failover Clustering" gibi yöntemler sadece veritabanı düzeyinde kullanılan yöntemlerdir. Yani bu yöntemlerle SQL Server Instance düzeyindeki Login'ler, Linked Server'lar, SQL Server Agent Job'ları vd. nesneler aktarılmaz. Eğer Instance seviyesindeki bu nesnelerden uygulamanın çalışması için elzem olanlarının da otomatik olarak replike edilmesi için gerek 3. parti uygulamalarla gerekse Custom Script'lerle de bir çözüm bulunamazsa bu durumda a sunucusu kullanılamaz hale geldiğinde b sunucusuna otomatik olarak aktarılan / replike edilen veritabanları birisi müdahale etmeden kullanılamaz olacaktır. Contained Database'ler ise Instance'tan bağımsız veritabanları oldukları için, b sunucusu devreye girdiğinde otomatik olarak kullanılabilir olacaklar, en azından Login Mapping, Orphaned User gibi kullanıcı sorunları yaşanmayacaktır.

Bu yazıdan alıp gitmenizi istediğim en temel şey, artık x Instance'ından alınan/kopyalanılan bir veritabanının y Instance'ına aktarıldığında ekstra hiçbir şey yapılmasına gerek kalmadan çalışabilmesi için bir şeyler yapıldığından haberdar olmanız.

Ekrem Önsoy

Hiç yorum yok: