2

使用 Microsoft 的 Team Foundation Server 2013 v12.0.31101.0 版本管理服务器,我不断收到错误消息(稍后包含)。但是,我可以从本地计算机、构建服务器和目标 SQL Server 成功运行 sqlpackage 命令。

采取的步骤

  • 我从中取出 dll 和 sqlpackage.exeC:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin并将它们复制到我桌面上的文件夹中
  • 在发布管理中,我使用以下命令创建了一个新工具:sqlpackage.exe /Action:Publish /SourceFile:__FileName__ /TargetDatabaseName:__DatabaseName__ /TargetServerName:__ServerName__
  • 然后,我从之前创建的文件夹中添加了 dll 和 SqlPackage.exe
  • 保存并关闭
  • 然后我创建了一个新组件,它基本上只是包装了这个工具(构建放置位置是一个反斜杠,表示 dacpac 位于构建文件夹的根目录)
  • 然后我选择了我创建的工具并填写了所有内容。我更新了我的发布模板以包含和使用该组件

将我创建的文件夹放在任何桌面上,我可以运行以下命令,它运行得非常完美

sqlpackage.exe /Action:Publish /SourceFile:MyDatabase.dacpac /TargetDatabaseName:MyDatabase /TargetServerName:MyDatabaseServer

我从本地 PC、Build Server 和 SQL Server 本身执行此操作,但是当我使用 Release Management 时,我得到了错误。

错误

An unexpected failure occurred: The type initializer for 'Microsoft.SqlServer.Dac.DacPackage' threw an exception..

Unhandled Exception: System.TypeInitializationException: The type initializer for 'Microsoft.SqlServer.Dac.DacPackage' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Microsoft.SqlServer.Dac.DacServices' threw an exception. ---> System.TypeInitializationException: The type initializer for 'SqlSchemaModelStaticState' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.SqlServer.TransactSql.ScriptDom, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.

更新 1:我在来自发布管理的错误电子邮件中注意到目标服务器是我的 Web 服务器而不是 SQL Server,即使 SQL Server 在命令中被正确命名。我检查了 Web 服务器上的日志并发现了错误。我将我的 dll 文件夹复制到桌面并运行脚本,瞧,我能够重新创建错误。我在控制面板中检查了已安装的程序,发现已安装的 Transact-SQL ScriptDom 版本是 2012 版,版本 11.0.2100.60。所以我在这里安装了SSDT。安装失败,因为我没有安装 Visual Studio,但它仍然设法安装了 12.0.2000.8 版本的 Transact-SQL ScriptDom 和相关 dll。当我再次运行脚本时,它成功发布了数据库!但是,当我尝试从 Release Management 构建时,我遇到了一个新错误。

Publishing to database 'Logging' on server 'BYDWVCMNSQ01'.
Initializing deployment (Start)
Initializing deployment (Failed)
*** Could not deploy package.
Unable to connect to target server.

更新 2:所以,我已经确认它此时失败的原因是因为构建服务器使用的帐户没有 SQL Server 的登录帐户。我添加了该帐户,然后在我的目标数据库中授予它 ddladmin 和 securityadmin 权限。这会产生一个新错误,我无法创建新用户,但至少我越来越近了。

最终更新:我还必须授予系统管理员权限,以便该帐户可以创建登录名。这使得 RM 中的部署步骤能够成功。这显然不是我要离开的方式,我将使用发布配置文件或命令标志来防止使用安全对象创建 dacpac 并让它以最低权限运行。

让 RM 部署到 SQL 2014 的问题已经解决。主要问题是在我的发布模板中,我将 DACPAC 组件与我的 Web 服务器构建的其余部分内联。这会导致 DACPAC 命令从 Web 服务器运行,为此我必须在 Web 服务器上安装 SSDT。我不喜欢这样,我可能会重新排列我的发布模板,以便 web 服务器和 sql 服务器是并行的,但嵌套在同一个回滚下。

4

2 回答 2

0

在运行部署的服务器上,运行带有缺失 dll 过滤器的 procmon,然后将其复制到它正在查找的文件夹之一中。

正确的方法是安装 ssdt 和 scriptdom 位(搜索创建无头 ssdt 构建机器)

于 2015-05-20T19:20:55.833 回答
0

我对这个答案很幸运,从旧的“SqlPackage”切换到新的,我认为这是相关 dll 的某种混淆:

要解决此问题,请将 sqlpackage.exe 的路径更改为新的“140”版本。sqlpackage.exe 的新路径应该是:

“%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\SqlPackage.exe”

于 2017-12-14T21:27:57.057 回答