SqlPackage.exe发布可以删除目标数据库中缺席对象的.dacpac文件的正确参数是什么?

问题描述 投票:2回答:3

我们可以使用Visual Studio 2012中Microsoft SSDT的SqlPackage.exe来讨论here同步数据库,我使用它来同步目标数据库,称为TargetDb,以匹配存储在SQL Server数据库项目中的源数据库对象,称为DbProject

/a:Publish命令的动作SqlPackage.exe允许我们将DbProject的.dacpac文件同步到TargetDb,但默认参数不会丢弃DbProject中不存在的TargetDb对象。

打开旗帜/p:DropObjectsNotInSource=true将解决这个问题,但也会产生奇怪的行为

  1. 标志/p:DropObjectsNotInSource=true将删除TargetDb上的用户/登录对象,这绝对不是预期的!我能找到的最接近的是/p:DropRoleMembersNotInSource=false /p:DropPermissionsNotInSource=false,但那些没有多大帮助。
  2. 标志/p:DropObjectsNotInSource=true将打破标志/p:BlockOnPossibleDataLoss=true,这意味着如果发生数据丢失,更新操作将不会被阻止;这根本不是我想要的。

目前我必须接受TargetDb上的'垃圾'/冗余对象:(

什么是更好的标志用于让我在那里?

synchronization command-line-arguments database-project sql-server-data-tools sqlpackage
3个回答
1
投票

我问了一个类似的问题here并最终编写了用户脚本作为部署后脚本,以便在部署数据库升级后重新创建它们。

DropPermissionsNotInSource属性仅适用于GRANT / DENY权限。 DropRoleMembersNotInSource仅适用于角色会员。

遗憾的是,当DropObjectsNotInSource属性设置为true时,没有选项可以将用户从被删除的对象中排除。

我们还在预部署脚本中进行了某些更改(例如更改列类型),因为即使更改不会导致数据丢失,BlockOnPossibleDataLoss也可以阻止部署。我觉得它过于谨慎而不是不够谨慎是好的。


1
投票

您应该尝试使用/p:DoNotDropObjectType参数,该参数允许您指定要放弃的不属于源的类型,即当DropObjectsNotInSource为真时


0
投票

请注意,还可以在项目文件中设置“防止数据丢失”:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.