sqlpackage执行Publish操作异常:alter语句误修改全库而非目标表如何解决
sqlpackage发布时意外修改数据库级对象的原因及解决方案
sqlpackage默认的Publish操作逻辑是全量对比源dacpac文件与目标数据库的所有层级对象Schema,而非仅执行predeploy脚本中的内容。即使predeploy脚本只有单条表级ALTER语句,只要dacpac中定义的数据库级属性与目标库存在差异,工具就会自动生成数据库级修改语句,这是其默认的schema同步机制导致的。
常见触发原因
- dacpac对应的数据库项目中配置了与目标库不一致的数据库级属性,包括但不限于兼容级别、默认排序规则、恢复模式、包含数据库状态、用户/角色权限配置等,比对到差异后工具会自动生成对应的修改语句
- 未配置Publish操作的专属限制参数,工具默认会同步所有层级的对象差异,不会自动限制仅修改表级对象
解决方案
你可以通过添加Publish专属参数限制同步范围,解决该问题,常用参数如下:
/p:ScriptDatabaseOptions=False:禁止生成修改数据库级选项的语句,绝大多数场景下添加该参数即可阻止工具修改数据库级配置/p:DoNotAlterReplicatedObjects=True:如果目标库存在复制配置,添加该参数可避免工具修改库级复制相关对象/p:TreatVerificationErrorsAsWarnings=True(可选):如果遇到库级对象验证报错阻断发布,可添加该参数将验证错误降级为警告
如果需要先确认工具会执行的所有操作,可先将动作改为Script生成待执行的SQL脚本自行校验,示例命令如下:
sqlpackage /action:Script /SourceFile:"Database Services\bin\Release\Database Services.dacpac" /TargetConnectionString:"Data Source=${Env};Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False;Initial catalog=${Target}" /OutputPath:check_publish.sql
生成脚本后可直接查看其中的数据库级修改语句来源,确认差异项后也可以针对性调整dacpac项目的配置。
内容的提问来源于stack exchange,提问作者arielma
相关产品推荐
相关产品推荐

