これは私がそれをしなければならない方法です。
1)ダミーの展開後スクリプトを作成します。
2)展開シナリオごとにプロジェクトでビルド構成を作成します。
3)pre-buildイベントを使用して、使用するデプロイメント後の構成を判断します。 設定ごとに別々のスクリプトを作成することも、ビルド前のイベントで展開後スクリプトを動的にビルドすることもできます。どちらの方法でも、ビルド・イベントに常に存在する$(構成)の値に基づいて作業します。
個別の静的スクリプトを使用する場合、ビルドイベントでは、適切な静的ファイルをコピーするだけで、その展開シナリオで有用なスクリプトを使用してダミーのポストデプロイメントを上書きする必要があります。
私の場合、どのスクリプトを含めるかの決定には、デプロイされるデータベースの現在の状態を知る必要があるため、動的生成を使用する必要がありました。そこで、構成変数を使用して、どの環境がどの環境に展開されているかを教えて、SQLCMDスクリプトを使用しました。OUTを自分の配置後スクリプトの場所に設定しました。したがって、私のプリビルドスクリプトは、配布後のスクリプトを動的に記述します。
どちらの方法でも、ビルドが完了し、通常のデプロイプロセスが開始された後、デプロイ後のスクリプトには、私が望むような:rコマンドが含まれていました。
ここでは、プリビルドで呼び出すSQLCMDスクリプトの例を示します。
:OUT .\Script.DynamicPostDeployment.sql
PRINT ' /*';
PRINT ' DO NOT MANUALLY MODIFY THIS SCRIPT. ';
PRINT ' ';
PRINT ' It is overwritten during build. ';
PRINT ' Content IS based on the Configuration variable (Debug, Dev, Sit, UAT, Release...) ';
PRINT ' ';
PRINT ' Modify Script.PostDeployment.sql to effect changes in executable content. ';
PRINT ' */';
PRINT 'PRINT ''PostDeployment script starting at''+CAST(GETDATE() AS nvarchar)+'' with Configuration = $(Configuration)'';';
PRINT 'GO';
IF '$(Configuration)' IN ('Debug','Dev','Sit')
BEGIN
IF (SELECT IsNeeded FROM rESxStage.StageRebuildNeeded)=1
BEGIN
-- These get a GO statement after every file because most are really HUGE
PRINT 'PRINT ''ETL data was needed and started at''+CAST(GETDATE() AS nvarchar);';
PRINT ' ';
PRINT 'EXEC iESxETL.DeleteAllSchemaData ''pExternalETL'';';
PRINT 'GO';
PRINT ':r .\PopulateExternalData.sql ';
....
:Rコマンドと他のすべてのSQLCMDコマンドは、条件ブロック内では機能しません。常に実行されます。この問題を回避するには、Old SystemSqlファイルでIF '$(ImportData)' = 'true'を使用して古いシステムコードをラップすることです。 –
http://stackoverflow.com/a/7189002/623190 –
パフォーマンスについては、 INSERTではなく? –