版本管理不会部署到SQL 2014数据库

时间:2015-05-20 18:26:40

标签: sql-server-2014 sql-server-data-tools release-management ms-release-management dacpac

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

采取

步骤

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

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

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,但仍设法安装Transact-SQL ScriptDom和相关dll的12.0.2000.8版本。当我再次运行脚本时,它成功发布了数据库!但是,当我尝试从发布管理构建时,我遇到了一个新错误。

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权限。这会产生一个新的错误,我无法创建新用户,但至少我会越来越近。

最终更新:我还必须授予sysadmin,以便帐户可以创建登录信息。这使得RM中的部署步骤成功。这显然不是我留下它的方式,我将使用发布配置文件或命令标志来防止使用安全对象创建dacpac并让它以最小权限运行。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

  

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

     

“%ProgramFiles(x86)%\ Microsoft Visual Studio   14.0 \ Common7 \ IDE \扩展\微软\ SQLDB \ DAC \ 140 \ SqlPackage.exe“