5

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 は引き続き同じ例外をキャッチします。変数の出力をキャプチャするとすぐに例外がスローされるのに、キャプチャしないと正常に完了した後に例外がキャッチされるのはなぜですか?

4

2 に答える 2

2

SqlPackage の最新バージョンを使用することをお勧めします。パスを見ると、古いバージョンのように見えます。ずっと前に、警告が stdout ではなく stderr に書き込まれるというバグがありました。アップグレードすれば問題は解決するはずです。アップグレードしない場合は、powershell を使用して新しい .net プロセスを開始し、エラー出力をリダイレクトすることができます。

于 2016-09-15T12:31:56.397 に答える
0

まず、出力ではなく、exe (SQLPackage) の終了コードを取得する必要があります。example1example2が役立つ場合があります

次に、標準エラーと出力をキャプチャする必要があります。これは例です

出力をログに記録し (必要な場合)、終了コードがゼロでないかどうかを確認してから、例外を発生させる必要があります。

于 2013-05-07T14:04:55.360 に答える