これを実現する方法はいくつかあります。最初の方法は、デプロイ後のスクリプトで環境を確認することです。..
if @@servername = 'dev_server'
begin
insert data here
end
少しきれいなバージョンは、環境ごとに異なるスクリプト ファイルを用意し、:r import sqlcmd スクリプトを介してそれらをインポートすることです。
- PostDeploy.sql
- DevServer.sql
- QAServer.sql
それから
if @@servername = 'dev_server'
begin
:r DevServer.sql
end
if @@servername = 'qa_server'
begin
:r QAServer.sql
end
.sql ファイルへのパスが正しいことを確認し、それらを dacpac でコピーする必要があります。
@@servername を使用する必要はありません。sqlcmd 変数を使用して環境ごとに渡すことができます。これは、ハードコードされたサーバー名よりも少しきれいです。
2 番目のアプローチは、dacpac を変更して、ポスト delpoy スクリプトを環境固有のものに変更することです。これは私の好みであり、CI ビルドの一部として最適に機能します。私のプロセスは次のとおりです。
- チェックインの変更
- ビルド サーバーは dacpac をビルドします
- ビルドには dacpac が必要で、dev、qa、prod などの env フォルダーにコピーします
- ビルドは、それぞれのデプロイ後のスクリプトを環境固有のスクリプトに置き換えます
スクリプト PostDeploy.dev.sql、PostDeploy.Qa.sql などを呼び出し、ビルド アクションを「なし」に設定するか、「スクリプト、ビルドではありません」として追加します。
デプロイ後のスクリプトを置き換えるには、.net Packaging API を使用するだけです。いくつかの例については、それを行う Dir2Dac デモをご覧ください。
https://github.com/GoEddie/Dir2Dac
すなわち:
https://github.com/GoEddie/Dir2Dac/blob/master/src/Dir2Dac/DacCreator.cs
var part = package.CreatePart(new Uri("/postdeploy.sql", UriKind.Relative), "text/plain");
using (var reader = new StreamReader(_postDeployScript))
{
reader.BaseStream.CopyTo(part.GetStream(FileMode.OpenOrCreate, FileAccess.ReadWrite));
}