使用 Microsoft 的 Team Foundation Server 2013 v12.0.31101.0 版本管理服务器,我不断收到错误消息(稍后包含)。但是,我可以从本地计算机、构建服务器和目标 SQL Server 成功运行 sqlpackage 命令。
采取的步骤:
- 我从中取出 dll 和 sqlpackage.exe
C:\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 服务器是并行的,但嵌套在同一个回滚下。