我正在通过构建一个sql项目在TeamCity中创建DacPac。生成的 DacPac 有一个部署后脚本,我想在部署时或使用版本号创建之前更新该脚本。是否可以在团队城市或部署 DacPac 时设置此参数?
sqlpackage.exe命令行看起来像
C:Program Files (x86)Microsoft SQL Server110DACbinSqlPackage.exe" /Action:Publish /Sourcefile:#{SourceFolder} /TargetDatabaseName:DBName /TargetServerName:#{SqlServer}
其中"#{}"是章鱼部署服务器上的参数。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 上使用文件内容替换器将"z"替换为版本号,但这种方法并不理想。如果另一个开发人员使用不适合文件内容替换程序生成功能中使用的正则表达式的不同参数签入文件,则可能会导致将来出现错误。
您可以采用几种不同的方法,第一种是最简单的,因为您可以在 .sqlproj(项目的属性,SQLCMD 变量选项卡)中定义一个 SqlCmd 变量,并引用它作为部署后脚本。部署时,可以使用/v:variable_name=(如果不使用 sqlpackage.exe 来覆盖变量进行部署,则使用什么?章鱼部署?
第二种方法更难,但非常简单,可以使用 .net 打包 API 读取和写入 dacpac,有一个名为 postdeploy 的流(文件.sql(将其作为 zip 文件打开,很明显哪一个是部署后文件),您可以读取它,更改您的特定值,然后再次写回它。
有关 dacpac 的更多手动编辑,请参阅:
https://github.com/GoEddie/Dacpac-References
艾德