3

这个问题与这里的问题有关:

使用 TFS 构建触发时抑制 Powershell 中的 sqlpackage.exe 警告/错误

但是,我正在开发的解决方法有问题,如下所示

    try {
    & "C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /SourceFile:"$dacpac" /Profile:"$dbProfile" /p:UnmodifiableObjectWarnings=false /Action:Publish 2>&1
}
catch {
    Write-Host "Exception: $_"
    if($_.TargetObject -like $Pattern) {
        Write-Host "Known exception - treat as warning"
    }
    if($LastExitCode -ne 0) {
        throw "An error occurred deploying database. Please examine the log to determine the nature of the error"
    }
}

如果我不将 stderr 重定向到 stdout,则当 sqlpackage 记录警告时,该过程指示失败。

如果我在上一个命令中将 stderr 重定向到 stdout,则当 sqlpackage.exe 引发警告时,进程能够完成,但一旦完成,就会引发异常。然后我可以检查异常文本,它与我已知的异常相同,我可以放心地忽略它。

但是,sqlpackage 会记录除警告之外的某些内容-即实际的失败错误,我无法确定异常的附加文本。在 catch 里面,我能看到的只是警告信息。如果我删除 stderr 重定向,则会记录完整的输出,这是与权限相关的错误。

因此,我的脚本在它应该成功的时候成功了,并且忽略了我不关心它的警告。当我想要它时它也会失败,但是我不能输出适当的日志消息。然后我需要编辑我的部署脚本,重新运行部署等等,所有这些都非常繁琐,而且不可重复。

任何提示将不胜感激。

4

1 回答 1

3

此问题已在最新的 SqlPackage.exe 版本中得到修复 - 这是 2014 年 6 月的 DacFramework.msi 版本,它捆绑到 Visual Studio 的 2014 年 7 月 SQL Server 工具更新中。警告现在指向 StdOut 而不是 StdErr。

请注意,截至 2014 年 4 月,SqlPackage.exe 的位置已更改 - 如果通过 SSMS 或 DacFramework.msi 安装,它位于“C:\Program Files (x86)\Microsoft SQL Server\120\DAC\Bin”中。如果在 VS 中作为 SQL Server 工具的一部分安装,它位于“C:\Program Files (x86)\Microsoft Visual Studio\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120”下,其中 VisualStudioVersion 为“11.0” VS2012 和 VS2013 的“12.0”。

于 2014-09-02T22:55:07.963 回答