dacpac と sqlpackage.exe、SSRS レポート、および Web サイトを使用して、データベースの変更を展開する自動展開スクリプトがあります。
コマンド ラインでスクリプトを実行すると、sqlpackage は次のメッセージを出力します。
オブジェクト [オブジェクト名] は、別の定義でデータベースに既に存在するため、変更されません。
出力はコンソールに黄色で表示され、警告であることを示します。デプロイは続行され、期待どおりに完了します。
ただし、TFS ビルドを介して同じスクリプトをトリガーすると、同じメッセージがビルド エクスプローラーに記録されますが、その横にエラー アイコンが表示されます。デプロイは引き続き続行され、自動テストが実行されますが、ビルド ステータスがチェックマークとバツ印の付いたアイコンに変わります。これは、ビルドが正常に完了したが、他のタスクが失敗したことを示します。
sqlpackage UnmodifiableObjectWarnings に提供できるパラメーターがあり、この種の警告を抑制するはずですが、このパラメーターにバグがあることを示す msdn の投稿があり、機能しません。
この警告が原因でビルド/デプロイが失敗することを望まないため、Powershell でこの種の警告をトラップして抑制するにはどうすればよいか考えています。ただし、他の完全に有効なエラーがある可能性があるため、sqlpackage の呼び出しからのすべてのエラー出力を抑制することはできません。
アップデート
ここの提案に従ってみました: https://serverfault.com/questions/340711/redirect-stderr-to-variable-in-powershell 、次のようなコードを使用してみました:
try {
$test = & "C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /SourceFile:"$dacpac" /Profile:"$dbProfile" /p:UnmodifiableObjectWarnings=True /Action:Publish 2>&1
$errMsg = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
$normMsg = $test | ?{$_.gettype().Name -ne "ErrorRecord"}
}
catch {
Write-Host "Caught Exception $_"
}
ただし、exe によって警告メッセージが返されるとすぐに、例外がスローされ、呼び出し元の関数によって処理され、展開は行われません。
ただし、次のように呼び出す場合:
try {
& "C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /SourceFile:"$dacpac" /Profile:"$dbProfile" /p:UnmodifiableObjectWarnings=True /Action:Publish 2>&1
}
catch {
Write-Host "Caught Exception $_"
}
つまり、出力をキャプチャする変数 $test がなければ、デプロイは正常に完了しますが、catch は引き続き同じ例外をキャッチします。変数の出力をキャプチャするとすぐに例外がスローされるのに、キャプチャしないと正常に完了した後に例外がキャッチされるのはなぜですか?