Msbuild DacPac中的部署后参数

Msbuild DacPac中的部署后参数,msbuild,teamcity,octopus-deploy,dacpac,sqlpackage,Msbuild,Teamcity,Octopus Deploy,Dacpac,Sqlpackage,我通过构建一个sql项目在TeamCity中创建了一个DacPac。生成的DacPac有一个部署后脚本,我希望在部署时或使用版本号创建该脚本之前对其进行更新。是否可以在TeamCity或部署DacPac时设置此参数 sqlpackage.exe命令行如下所示 C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /Action:Publish /Sourcefile:#{SourceFolder} /Ta

我通过构建一个sql项目在TeamCity中创建了一个DacPac。生成的DacPac有一个部署后脚本,我希望在部署时或使用版本号创建该脚本之前对其进行更新。是否可以在TeamCity或部署DacPac时设置此参数

sqlpackage.exe命令行如下所示

 C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /Action:Publish /Sourcefile:#{SourceFolder} /TargetDatabaseName:DBName /TargetServerName:#{SqlServer} 
其中{}是octopus部署服务器上的参数。SQL项目中的部署后脚本如下所示:

 declare @version varchar(10)
set @version = 'z'
IF EXISTS (SELECT * FROM tVersion)
UPDATE VersionTable SET Version = @version
ELSE
INSERT INTO VersionTable VALUES (@version)

我一直在使用teamcity上的file content replacer将“z”替换为版本号,但这种方法并不理想。如果其他开发人员使用不同的参数签入文件,而该参数与“文件内容替换程序”构建功能中使用的正则表达式不匹配,这可能会在将来导致错误。

您可以采取几种不同的方法,第一个是最简单的,因为您在项目的.sqlproj属性、SqlCmd变量选项卡中定义了一个SqlCmd变量,并引用它作为部署后脚本。部署时,可以使用/v:variable\u name=覆盖变量。如果不使用sqlpackage.exe进行部署,则使用什么?章鱼部署

第二种方法更难,但非常简单,可以使用.net打包api读取和写入dacpac,有一个名为postdeploy.sql的流文件,将其作为zip文件打开,很明显哪一个是部署后文件,您可以读取它,更改特定值,然后再次写入

有关dacpac的更多手动编辑,请参阅:


Ed

您可以采取两种不同的方法,第一种方法最简单,因为您可以在项目的.sqlproj属性、SqlCmd变量选项卡中定义一个SqlCmd变量,并引用它作为部署后脚本。部署时,可以使用/v:variable\u name=覆盖变量。如果不使用sqlpackage.exe进行部署,则使用什么?章鱼部署

第二种方法更难,但非常简单,可以使用.net打包api读取和写入dacpac,有一个名为postdeploy.sql的流文件,将其作为zip文件打开,很明显哪一个是部署后文件,您可以读取它,更改特定值,然后再次写入

有关dacpac的更多手动编辑,请参阅:


Ed

Hi Ed,谢谢你的建议,我正在使用问题中提到的sqlpackage.exe。我将尝试使用SQLCMD变量路由,因为第二个选项的最大问题是如何打开dacpac和编辑部署后文件。手动将文件编辑为.zip,然后编辑postdeploy.sql非常简单,但使用octopus deploy似乎会有点困难。为了澄清:v:variable_name=如果我把它放在我的sqlpackage、exe命令行中,它会在部署时更改变量吗?再次感谢!AdamHi Ed,谢谢你的建议,我正在使用问题中提到的sqlpackage.exe。我将尝试使用SQLCMD变量路由,因为第二个选项的最大问题是如何打开dacpac和编辑部署后文件。手动将文件编辑为.zip,然后编辑postdeploy.sql非常简单,但使用octopus deploy似乎会有点困难。为了澄清:v:variable_name=如果我把它放在我的sqlpackage、exe命令行中,它会在部署时更改变量吗?再次感谢!亚当