Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Jason Lee
Topik ini menjelaskan cara menambahkan akun pengguna ke peran database sebagai bagian dari penyebaran solusi ke lingkungan pengujian.
Saat Anda menyebarkan solusi yang berisi proyek database ke lingkungan penahapan atau produksi, Anda biasanya tidak ingin pengembang mengotomatiskan penambahan akun pengguna ke peran database. Dalam kebanyakan kasus, pengembang tidak akan tahu akun pengguna mana yang perlu ditambahkan ke peran database mana, dan persyaratan ini dapat berubah kapan saja. Namun, ketika Anda menyebarkan solusi yang berisi proyek database ke lingkungan pengembangan atau pengujian, situasinya biasanya agak berbeda:
- Pengembang biasanya menyebarkan ulang solusi secara teratur, seringkali beberapa kali sehari.
- Database biasanya dibuat ulang pada setiap penyebaran, yang berarti bahwa pengguna database harus dibuat dan ditambahkan ke peran setelah setiap penyebaran.
- Pengembang biasanya memiliki kontrol penuh atas lingkungan pengembangan atau pengujian target.
Dalam skenario ini, seringkali bermanfaat untuk secara otomatis membuat pengguna database dan menetapkan keanggotaan peran database sebagai bagian dari proses penyebaran.
Faktor utamanya adalah bahwa operasi ini perlu bersyarah berdasarkan lingkungan target. Jika Anda menyebarkan ke penahapan atau lingkungan produksi, Anda ingin melewati operasi. Jika Anda menyebarkan ke lingkungan pengembang atau pengujian, Anda ingin menyebarkan keanggotaan peran tanpa intervensi lebih lanjut. Topik ini menjelaskan satu pendekatan yang dapat Anda gunakan untuk mengatasi tantangan ini.
Topik ini merupakan bagian dari serangkaian tutorial berdasarkan persyaratan penyebaran perusahaan dari perusahaan fiktif bernama Fabrikam, Inc. Seri tutorial ini menggunakan solusi sampel— solusi Contact Manager—untuk mewakili aplikasi web dengan tingkat kompleksitas yang realistis, termasuk aplikasi ASP.NET MVC 3, layanan Windows Communication Foundation (WCF), dan proyek database.
Metode penyebaran di jantung tutorial ini didasarkan pada pendekatan file proyek terpisah yang dijelaskan dalam Memahami File Proyek, di mana proses build dikendalikan oleh dua file proyek—satu berisi instruksi build yang berlaku untuk setiap lingkungan tujuan, dan satu berisi pengaturan build dan penyebaran khusus lingkungan. Pada waktu build, file proyek khusus lingkungan digabungkan ke dalam file proyek agnostik lingkungan untuk membentuk serangkaian instruksi build lengkap.
Gambaran Umum Tugas
Topik ini mengasumsikan bahwa:
- Anda menggunakan pendekatan file proyek terpisah untuk penyebaran solusi, seperti yang dijelaskan dalam Memahami File Proyek.
- Anda memanggil VSDBCMD dari file proyek untuk menyebarkan proyek database Anda, seperti yang dijelaskan dalam Memahami Proses Build.
Untuk membuat pengguna database dan menetapkan keanggotaan peran saat Anda menyebarkan proyek database ke lingkungan pengujian, Anda harus:
- Buat skrip Transact Bahasa Permintaan Terstruktur (Transact-SQL) yang membuat perubahan database yang diperlukan.
- Buat target Microsoft Build Engine (MSBuild) yang menggunakan utilitas sqlcmd.exe untuk menjalankan skrip SQL.
- Konfigurasikan file proyek Anda untuk memanggil target saat Anda menyebarkan solusi ke lingkungan pengujian.
Topik ini akan menunjukkan kepada Anda cara melakukan masing-masing prosedur ini.
Membuat skrip Keanggotaan Peran Database
Anda dapat membuat skrip Transact-SQL dengan berbagai cara, dan di lokasi mana pun yang Anda pilih. Pendekatan termampu adalah membuat skrip dalam solusi Anda di Visual Studio 2010.
Untuk membuat skrip SQL
Di jendela Penjelajah Solusi , perluas simpul proyek database Anda.
Klik kanan folder Skrip , arahkan ke Tambahkan, lalu klik Folder Baru.
Ketik Uji sebagai nama folder, lalu tekan Enter.
Klik kanan folder Uji , arahkan ke Tambahkan, lalu klik Skrip.
Dalam kotak dialog Tambahkan Item Baru , beri skrip Anda nama yang bermakna (misalnya, AddRoleMemberships.sql), lalu klik Tambahkan.
Dalam file AddRoleMemberships.sql , tambahkan pernyataan Transact-SQL yang:
- Buat pengguna database untuk login SQL Server yang akan mengakses database Anda.
- Tambahkan pengguna database ke peran database yang diperlukan.
File harus menyerupai ini:
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
Simpan file.
Menjalankan Skrip pada Database Target
Idealnya, Anda akan menjalankan skrip Transact-SQL yang diperlukan sebagai bagian dari skrip pasca-penyebaran saat Anda menyebarkan proyek database Anda. Namun, skrip pasca-penyebaran tidak memungkinkan Anda untuk menjalankan logika secara kondisional berdasarkan konfigurasi solusi atau properti build. Alternatifnya adalah menjalankan skrip SQL Anda langsung dari file proyek MSBuild, dengan membuat elemen Target yang menjalankan perintah sqlcmd.exe. Anda dapat menggunakan perintah ini untuk menjalankan skrip Anda pada database target:
sqlcmd.exe –S [Database server] –d [Database name] –i [SQL script]
Catatan
Untuk informasi selengkapnya tentang opsi baris perintah sqlcmd, lihat Utilitas sqlcmd.
Sebelum Anda menyematkan perintah ini di target MSBuild, Anda perlu mempertimbangkan dalam kondisi apa Anda ingin skrip berjalan:
- Database target harus ada sebelum Anda mengubah keanggotaan perannya. Dengan demikian, Anda perlu menjalankan skrip ini setelah penyebaran database.
- Anda perlu menyertakan kondisi sehingga skrip hanya dijalankan untuk lingkungan pengujian.
- Jika Anda menjalankan penyebaran "bagaimana jika"—dengan kata lain, jika Anda membuat skrip penyebaran tetapi tidak benar-benar menjalankannya—Anda tidak boleh menjalankan skrip SQL.
Jika Anda menggunakan pendekatan file proyek terpisah yang dijelaskan dalam Memahami File Proyek, seperti yang ditunjukkan oleh solusi sampel Contact Manager, Anda dapat membagi instruksi build untuk skrip SQL Anda seperti ini:
- Setiap properti khusus lingkungan yang diperlukan, bersama dengan properti yang menentukan apakah akan menyebarkan izin, harus masuk ke file proyek khusus lingkungan (misalnya, Env-Dev.proj).
- Target MSBuild itu sendiri, bersama dengan properti apa pun yang tidak akan berubah antar lingkungan tujuan, harus masuk ke file proyek universal (misalnya, Publish.proj).
Dalam file proyek khusus lingkungan, Anda perlu menentukan nama server database, nama database target, dan properti Boolean yang memungkinkan pengguna menentukan apakah akan menyebarkan keanggotaan peran.
<PropertyGroup>
<CmTargetDatabase Condition=" '$(CmTargetDatabase)'=='' ">
ContactManager
</CmTargetDatabase>
<DatabaseServer Condition=" '$(DatabaseServer)'=='' ">
TESTDB1
</DatabaseServer>
<DeployTestDBRoleMemberships Condition="'$(DeployTestDBRoleMemberships)'==''">
true
</DeployTestDBRoleMemberships>
</PropertyGroup>
Dalam file proyek universal, Anda perlu menyediakan lokasi executable sqlcmd dan lokasi skrip SQL yang ingin Anda jalankan. Properti ini akan tetap sama terlepas dari lingkungan tujuan. Anda juga perlu membuat target MSBuild untuk menjalankan perintah sqlcmd.
<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>
Perhatikan bahwa Anda menambahkan lokasi executable sqlcmd sebagai properti statis, karena ini dapat berguna untuk target lain. Sebaliknya, Anda menentukan lokasi skrip SQL Anda dan sintaks perintah sqlcmd sebagai properti dinamis dalam target, karena tidak akan diperlukan sebelum target dijalankan. Dalam hal ini, target DeployTestDBPermissions hanya akan dijalankan jika kondisi ini terpenuhi:
- Properti DeployTestDBRoleMemberships diatur ke true.
- Pengguna belum menentukan bendera WhatIf=true .
Akhirnya, jangan lupa untuk memanggil target. Dalam file Publish.proj , Anda dapat melakukan ini dengan menambahkan target ke daftar dependensi untuk target FullPublish default. Anda perlu memastikan bahwa target DeployTestDBPermissions tidak dijalankan sampai target PublishDbPackages telah dijalankan.
<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>
Kesimpulan
Topik ini menjelaskan salah satu cara di mana Anda dapat menambahkan pengguna database dan keanggotaan peran sebagai tindakan pasca-penyebaran saat Anda menyebarkan proyek database. Ini biasanya berguna ketika Anda secara teratur membuat ulang database di lingkungan pengujian, tetapi biasanya harus dihindari saat Anda menyebarkan database ke lingkungan penahapan atau produksi. Dengan demikian, Anda harus memastikan bahwa Anda menggunakan logika bersyarat yang diperlukan sehingga pengguna database dan keanggotaan peran hanya dibuat jika sesuai untuk melakukannya.
Bacaan lebih lanjut
Untuk informasi selengkapnya tentang menggunakan VSDBCMD untuk menyebarkan proyek database, lihat Menyebarkan Proyek Database. Untuk panduan tentang menyesuaikan penyebaran database untuk lingkungan target yang berbeda, lihat Menyesuaikan Penyebaran Database untuk Beberapa Lingkungan. Untuk informasi selengkapnya tentang menggunakan file proyek MSBuild kustom untuk mengontrol proses penyebaran, lihat Memahami File Proyek dan Memahami Proses Build. Untuk informasi selengkapnya tentang opsi baris perintah sqlcmd, lihat Utilitas sqlcmd.