Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Aralık 2017  >>
PaSaÇaPeCuCuPa
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
Keywords

SQL Server 2012 kurulumu yaptığımızda hali hazırda bulunan database’ler Contained Database değildir. Bu database’leri istersek Contained Database haline dönüştürebiliriz. Fakat hali hazırda kullandığımız login’leri de Contained Database User haline dönüştürmeliyiz ki user’ları server’dan izole edip database taşımalarında sıkıntısız bir şekilde bu user’ları kullanmaya devam edebilelim.

[more]

Bir önceki yazımda Contained olmayan user’ları nasıl bulabileceğimizi görmüştük.

Sorgu sonucu bulduğumuz user’ları sp_migrate_user_to_contained SP’sini kullanarak Contained hale getirebiliriz.

Bir önceki yazımdaki örnekten devam edecek olursak, login_turgay isimli login’i Contained hale getirmek için şu kodu kullanabiliriz. Tabiki ilk olarak database’i Contained hale getirmemiz gerekmekte. Aksi halde user dönüştürme SP’si hata alacaktır.

ALTER DATABASE AdventureWorks SET CONTAINMENT=PARTIAL;
GO
EXEC sp_migrate_user_to_contained
	@username = N'login_turgay',
	@rename = N'keep_name',
	@disable_login = N'disable_login'

 

Bu işlem sonucunda login_turgay isimli login Contained User haline dönecek ve ilgili login nesnesi disable edilecektir.

Bu şekilde Contained hale dönüştürmeyi düşündüğümüz database’lerde bulunan kullanıcıları da Contained hale getirebiliriz.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Daha önceki yazılarımda bahsetmiştim. Contained Database, SQL Server 2012 ile gelen güzel özelliklerden biri. Kısaca üstünden geçmek gerekirse; Contained Database ile database engine’den izole edilmiş bir database oluşturabilir ve instance’lar arasında sıkıntısız bir şekilde taşıma işlemi gerçekleştirilebilir.

Peki her database’i contained hale dönüştürebilir miyiz? Yani contained database’lerde desteklenmeyen bir özellik var mı?

[more]

SQL Server’da kullanılan bütün objeler Contained olarak desteklenmezler. Örneğin aşağıdaki url’de Partial Containment Type tarafından desteklenmeyen entity listesine erişebilirsiniz.

http://msdn.microsoft.com/en-us/library/ff929071%28v=sql.110%29.aspx

Peki benim halihazırda kullandığım bir database var bu database contained olarak destekleniyor mu? Ya da soruyu değişik bir şekilde sorarsak; database’imde Contained olmayan bir obje var mı?

Bu sorumuza sys.dm_db_uncontained_entities DMV’si ile cevap bulabiliriz. Bu DMV üzerinde çalıştırıldığı database’de contained olmayan entity’leri listelemektedir.

Kullanımı şu şekildedir;

select * from sys.dm_db_uncontained_entities

 

Şimdi bir örnek yaparak konuyu daha iyi anlamaya çalışalım. Örneğimde normal bir login ve bu login’e bağlı bir user create edeceğim. Dolayısıyla Contained olmayan yani server’a bağımlı bir obje sahibi olacağım.

Daha sonra da yukarıdaki DMV’yi kullanarak Contained olmayan obje listesinde bu login’i görmeye çalışacağım.

Use AdventureWorks
GO
--Login create ediyorum
create login login_turgay with password='password'
GO
--User create ediyorum
create user login_turgay for login login_turgay
go

 

Şimdi DMV’yi kullanarak contained olmayan objeleri listeliyorum.

select dp.principal_id,dp.name,dp.type_desc,dp.default_schema_name,dp.create_date 
from sys.dm_db_uncontained_entities ue
join sys.database_principals dp on dp.principal_id=ue.major_id
join sys.server_principals sp on sp.sid=dp.sid
where ue.class=4
	  and dp.authentication_type = 1
	  and sp.is_disabled = 0 

 

image

Gelen sonuca baktığımda az önce create etmiş olduğum “loginx” isimli login’in beklediğim gibi Contained olmayan bir obje olduğunu görüyorum.

Bir sonraki yazımda Contained olmayan bu user’ları Contained hale nasıl dönüştürebileceğimize bakıyor olacağız.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bir önceki yazımda SQL Server 2011 “Denali” gelen çok önemli özelliklerden biri olan Contained Database mantığından bahsetmiştim. Bugünkü yazımda ise Database Engine’den izole bir Contained Database user’ı nasıl create edebileceğimizi ve kullanabileceğimizi görüyor olacağız.

[more]

Contained Database’in ne olduğunu tekrar hatırlatmak gerekirse; Contained Database  database’in tanımlanması için gerekli olan bütün metadata bilgilerini ve database özelliklerini kendi üzerinde tutar. Bu tarz database’lerde login’ler database engine level’ında authenticate olmazlar. User bilgileri istenirse şifresi ile birlikte database içerisinde saklanır. Bu şekilde database engine’den izole edilmiş olan database, server’lar arasında çok rahat bir şekilde taşınır ve ekstra yapılacak işlem sayısı çok aza indirilir.

Contained Database User Oluşturma

Contained Database’lerde user create etme ekranında diğer database’lerden farklı olarak “SQL User with password” seçeneği bulunmaktadır. Bu seçenek vasıtasıyla database engine’den bağımsız ve authentication’ı database’in yapacağı bir user create etmiş oluruz.

image_15

Aynı işlemi T-SQL ile şu şekilde yapabiliriz.

USE [SampleDB1]
GO
CREATE USER [CDBUser1] WITH PASSWORD=N'Abc12345'
GO

 

Contained Database User ile Connection Kurma

Contained Database User’lar database engine seviyesinde değil database seviyesinde tanımlanırlar dedik. Yani bu user’lar sadece tanımlandıkları database’e bağlantı kurabilirler. Dolayısıyla SSMS ile bağlantı kurarken Connect To Database kısmında ilgili database’in seçilmesi gerekmektedir yoksa bağlantı kurulamaz. Aşağıdaki resimlerde connection’ın nasıl kurabileceğini görebilirsiniz.

image_16

image_17

Bugünkü yazımızda database engine’den bağımsız bir contained database user’ın nasıl oluşturulabileceğini gördük. Tekrar not düşmek gerekirse bu database’i başka bir server’a taşıdığınızda herhangi bir user create’i yapmadan direk bu user’la bağlanabilmeniz mümkün.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2011 “Denali” ile gelen çok güzel özelliklerden biride Contained Database mantığı. Contained Database ile database engine’den izole edilmiş bir database oluşturabilir ve instance’lar arasında sıkıntısız bir şekilde taşıma işlemi gerçekleştirebiliriz.

[more]

Hepimizin başına gelmiştir. A server’ında bulunan bir DB’yi B server’ına 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 database’in tanımlanması için gerekli olan bütün metadata bilgilerini ve database özelliklerini kendi üzerinde tutar. Bu tarz database’lerde login’ler database engine level’ında authenticate olmazlar. User bilgileri database içerisinde saklanır. Bu şekilde database engine’den izole edilmiş olan database, server’lar 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 CTP1’de şu an için sadece Partial Containment type’ı kullanabilmekteyiz.

Sunucuda Contained Database kullanabilmek için server side option 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 Enable Edilmesi

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 Enable 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.

image_13

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 CTP1 de sadece partial desteklenmekte.

image_14

Containment type’ı değiştirdiğimizde alt tarafta bulunan Containment kısmının aktif olduğunu görüyoruz. Burada bulunan 5 özelliği bu DB’ye özel tanımlayarak server’dan izole edebiliriz.

Örneğin Server’ın Default Language’ı Turkish’ken Contained DB’nin Default Language’ını English yapmamız mümkün. Bu durumda bu DB’yi başka bir server’a taşıdığımızda gene bu özellikler ile taşınmış olacaktır.

Contained Olmayan Bir DB’ye Contained Hale Dönüştürme

Gene bu işlemi bir önceki adımda anlattığım gibi SSMS arayüzünde 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

 

Bir sonraki yazımda Contained Database’lerde user’ların DB Engine bağımsız nasıl tanımlanacağına bakıyor olacağız.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan