Test Ortamlarına Veritabanı Rol Üyelikleri Dağıtma
tarafından Jason Lee
Bu konuda, bir test ortamına çözüm dağıtımının parçası olarak veritabanı rollerine kullanıcı hesaplarının nasıl ekleneceği açıklanmaktadır.
Veritabanı projesi içeren bir çözümü hazırlama veya üretim ortamına dağıttığınızda, genellikle geliştiricinin veritabanı rollerine kullanıcı hesaplarının eklenmesini otomatikleştirmesini istemezsiniz. Çoğu durumda geliştirici, hangi kullanıcı hesaplarının hangi veritabanı rollerine eklenmesi gerektiğini bilmez ve bu gereksinimler herhangi bir zamanda değişebilir. Ancak, veritabanı projesi içeren bir çözümü geliştirme veya test ortamına dağıttığınızda, durum genellikle oldukça farklıdır:
- Geliştirici genellikle çözümü genellikle günde birkaç kez düzenli olarak yeniden dağıtır.
- Veritabanı genellikle her dağıtımda yeniden oluşturulur; bu da veritabanı kullanıcılarının her dağıtımdan sonra oluşturulması ve rollere eklenmesi gerektiği anlamına gelir.
- Geliştirici genellikle hedef geliştirme veya test ortamı üzerinde tam denetime sahiptir.
Bu senaryoda genellikle otomatik olarak veritabanı kullanıcıları oluşturmak ve dağıtım işleminin bir parçası olarak veritabanı rolü üyelikleri atamak yararlı olur.
Önemli faktör, bu işlemin hedef ortama göre koşullu olması gerektiğidir. Hazırlama veya üretim ortamına dağıtıyorsanız işlemi atlamak istiyorsunuz. Bir geliştirici veya test ortamına dağıtıyorsanız, daha fazla müdahale olmadan rol üyeliklerini dağıtmak istiyorsunuz. Bu konuda, bu sınamayı ele almak için kullanabileceğiniz bir yaklaşım açıklanmaktadır.
Bu konu, Fabrikam, Inc. adlı kurgusal bir şirketin kurumsal dağıtım gereksinimlerini temel alan bir dizi öğreticinin bir bölümünü oluşturur. Bu öğretici serisi, ASP.NET MVC 3 uygulaması, Windows Communication Foundation (WCF) hizmeti ve veritabanı projesi dahil olmak üzere gerçekçi bir karmaşıklık düzeyine sahip bir web uygulamasını temsil etmek için örnek bir çözüm (Contact Manager çözümü) kullanır.
Bu öğreticilerin merkezinde yer alan dağıtım yöntemi, derleme işleminin iki proje dosyası tarafından denetlendiği Proje Dosyasını Anlama bölümünde açıklanan bölünmüş proje dosyası yaklaşımını temel alır: biri her hedef ortama uygulanan derleme yönergelerini, diğeri de ortama özgü derleme ve dağıtım ayarlarını içerir. Derleme zamanında, ortama özgü proje dosyası, tam bir derleme yönergeleri kümesi oluşturmak için ortama özgü belirsiz proje dosyasıyla birleştirilir.
Göreve Genel Bakış
Bu konuda aşağıdakiler varsayılır:
- Proje Dosyasını Anlama bölümünde açıklandığı gibi çözüm dağıtımında bölünmüş proje dosyası yaklaşımını kullanırsınız.
- VsDBCMD'yi proje dosyasından çağırarak derleme işlemini anlama bölümünde açıklandığı gibi veritabanı projenizi dağıtabilirsiniz.
Bir veritabanı projesini test ortamına dağıtırken veritabanı kullanıcıları oluşturmak ve rol üyelikleri atamak için şunları yapmanız gerekir:
- Gerekli veritabanı değişikliklerini yapan bir Transact Yapılandırılmış Sorgu Dili (Transact-SQL) betiği oluşturun.
- SQL betiğini çalıştırmak için sqlcmd.exe yardımcı programını kullanan bir Microsoft Build Engine (MSBuild) hedefi oluşturun.
- Çözümünüzü bir test ortamına dağıtırken proje dosyalarınızı hedefi çağıracak şekilde yapılandırın.
Bu konuda, bu yordamların her birinin nasıl gerçekleştirileceği gösterilir.
Veritabanı Rolü Üyeliklerini Betik Oluşturma
Transact-SQL betiğini birçok farklı yolla ve seçtiğiniz herhangi bir konumda oluşturabilirsiniz. En kolay yaklaşım, Visual Studio 2010'da çözümünüzde betiği oluşturmaktır.
SQL betiği oluşturmak için
Çözüm Gezgini penceresinde veritabanı proje düğümünüzü genişletin.
Betikler klasörüne sağ tıklayın, Ekle'nin üzerine gelin ve Yeni Klasör'e tıklayın.
Klasör adı olarak Test yazın ve Enter tuşuna basın.
Test klasörüne sağ tıklayın, Ekle'nin üzerine gelin ve Betik'e tıklayın.
Yeni Öğe Ekle iletişim kutusunda betiğinize anlamlı bir ad verin (örneğin, AddRoleMemberships.sql) ve ekle'ye tıklayın.
AddRoleMemberships.sql dosyasına şunları sağlayan Transact-SQL deyimleri ekleyin:
- Veritabanınıza erişecek SQL Server oturum açma bilgileri için bir veritabanı kullanıcısı oluşturun.
- Veritabanı kullanıcısını gerekli veritabanı rollerine ekleyin.
Dosya şuna benzemelidir:
USE $(DatabaseName) GO CREATE USER [FABRIKAM\TESTWEB1$] FOR LOGIN[FABRIKAM\TESTWEB1$] GO USE [ContactManager] GO EXEC sp_addrolemember N'db_datareader', N'FABRIKAM\TESTWEB1$' GO USE [ContactManager] GO EXEC sp_addrolemember N'db_datawriter', N'FABRIKAM\TESTWEB1$' GO
Dosyayı kaydedin.
Hedef Veritabanında Betiği Yürütme
İdeal olarak, veritabanı projenizi dağıtırken dağıtım sonrası betiğin parçası olarak gerekli Transact-SQL betiklerini çalıştırırsınız. Ancak dağıtım sonrası betikler çözüm yapılandırmalarına veya derleme özelliklerine göre koşullu olarak mantık yürütmenize izin vermez. Alternatif olarak SQL betiklerinizi doğrudan MSBuild proje dosyasından çalıştırmak, sqlcmd.exe komutunu yürüten bir Target öğesi oluşturmaktır. Betiğinizi hedef veritabanında çalıştırmak için şu komutu kullanabilirsiniz:
sqlcmd.exe –S [Database server] –d [Database name] –i [SQL script]
Not
sqlcmd komut satırı seçenekleri hakkında daha fazla bilgi için bkz. sqlcmd Yardımcı Programı.
Bu komutu bir MSBuild hedefine eklemeden önce, betiğin hangi koşullarda çalışmasını istediğinizi göz önünde bulundurmanız gerekir:
- Hedef veritabanının rol üyeliklerini değiştirmeden önce var olması gerekir. Bu nedenle, veritabanı dağıtımından sonra bu betiği çalıştırmanız gerekir.
- Betiğin yalnızca test ortamları için yürütülmesi için bir koşul eklemeniz gerekir.
- "Ne olursa olsun" dağıtımı çalıştırıyorsanız (başka bir deyişle, dağıtım betikleri oluşturuyor ancak bunları gerçekten çalıştırmıyorsanız) SQL betiğini çalıştırmamalısınız.
Contact Manager örnek çözümünde gösterildiği gibi Proje Dosyasını Anlama bölümünde açıklanan bölünmüş proje dosyası yaklaşımını kullanıyorsanız, SQL betiğinizin derleme yönergelerini aşağıdaki gibi bölebilirsiniz:
- Gerekli ortama özgü özellikler, izinlerin dağıtılıp dağıtılmayacağını belirleyen özelliğiyle birlikte ortama özgü proje dosyasına (örneğin, Env-Dev.proj) girmelidir.
- MSBuild hedefinin kendisi, hedef ortamlar arasında değişmeyecek özelliklerle birlikte evrensel proje dosyasına (örneğin , Publish.proj) girmelidir.
Ortama özgü proje dosyasında veritabanı sunucusu adını, hedef veritabanı adını ve kullanıcının rol üyeliklerini dağıtıp dağıtmayacağını belirtmesine olanak tanıyan bir Boole özelliği tanımlamanız gerekir.
<PropertyGroup>
<CmTargetDatabase Condition=" '$(CmTargetDatabase)'=='' ">
ContactManager
</CmTargetDatabase>
<DatabaseServer Condition=" '$(DatabaseServer)'=='' ">
TESTDB1
</DatabaseServer>
<DeployTestDBRoleMemberships Condition="'$(DeployTestDBRoleMemberships)'==''">
true
</DeployTestDBRoleMemberships>
</PropertyGroup>
Evrensel proje dosyasında, sqlcmd yürütülebilir dosyasının konumunu ve çalıştırmak istediğiniz SQL betiğinin konumunu sağlamanız gerekir. Bu özellikler hedef ortamdan bağımsız olarak aynı kalır. Ayrıca sqlcmd komutunu yürütmek için bir MSBuild hedefi oluşturmanız gerekir.
<PropertyGroup>
<SqlCmdExe Condition=" '$(SqlCmdExe)'=='' ">
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe
</SqlCmdExe>
</PropertyGroup>
<Target Name="DeployTestDBPermissions"
Condition=" '$(DeployTestDBRoleMemberships)'=='true' AND
'$(Whatif)'!='true' ">
<PropertyGroup>
<SqlScript>
$(SourceRoot)ContactManager.Database\Scripts\Test\AddRoleMemberships.sql
</SqlScript>
<_Cmd>"$(SqlCmdExe)" -S "$(DatabaseServer)"
-d "$(CmTargetDatabase)"
-i "$(SqlScript)"
</_Cmd>
</PropertyGroup>
<Exec Command="$(_Cmd)" ContinueOnError="false" />
</Target>
Diğer hedefler için yararlı olabileceğinden, sqlcmd yürütülebilir dosyasının konumunu statik özellik olarak eklediğinize dikkat edin. Buna karşılık, SQL betiğinizin konumunu ve sqlcmd komutunun söz dizimini hedef içinde dinamik özellikler olarak tanımlarsınız; hedef yürütülmeden önce bunlar gerekli olmayacaktır. Bu durumda DeployTestDBPermissions hedefi yalnızca şu koşullar karşılandığında yürütülür:
- DeployTestDBRoleMemberships özelliği true olarak ayarlanır.
- Kullanıcı bir WhatIf=true bayrağı belirtmedi.
Son olarak, hedefi çağırmayı unutmayın. Publish.proj dosyasında, hedefi varsayılan FullPublish hedefinin bağımlılık listesine ekleyerek bunu yapabilirsiniz. PublishDbPackages hedefi yürütülene kadar DeployTestDBPermissions hedefinin yürütülmediğinden emin olmanız gerekir.
<Project ToolsVersion="4.0"
DefaultTargets="FullPublish"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<PropertyGroup>
<FullPublishDependsOn>
Clean;
BuildProjects;
GatherPackagesForPublishing;
PublishDbPackages;
DeployTestDBPermissions;
PublishWebPackages;
</FullPublishDependsOn>
</PropertyGroup>
<Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />
</Project>
Sonuç
Bu konu başlığında, veritabanı projesini dağıtırken veritabanı kullanıcılarını ve rol üyeliklerini dağıtım sonrası eylem olarak ekleyebileceğiniz yöntem açıklanmıştır. Bu genellikle bir test ortamında veritabanını düzenli olarak yeniden oluşturduğunuzda yararlıdır, ancak genellikle hazırlama veya üretim ortamlarına veritabanı dağıtırken bu işlemden kaçınılmalıdır. Bu nedenle, veritabanı kullanıcılarının ve rol üyeliklerinin yalnızca uygun olduğunda oluşturulması için gerekli koşullu mantığı kullandığınızdan emin olmanız gerekir.
Daha Fazla Bilgi
Veritabanı projelerini dağıtmak için VSDBCMD kullanma hakkında daha fazla bilgi için bkz. Veritabanı Projelerini Dağıtma. Farklı hedef ortamlar için veritabanı dağıtımlarını özelleştirme yönergeleri için bkz. Birden Çok Ortam için Veritabanı Dağıtımlarını Özelleştirme. Dağıtım işlemini denetlemek için özel MSBuild proje dosyalarını kullanma hakkında daha fazla bilgi için bkz. Proje Dosyasını Anlama ve Derleme sürecini anlama. sqlcmd komut satırı seçenekleri hakkında daha fazla bilgi için bkz. sqlcmd Yardımcı Programı.