我们可以使用Visual Studio 2012中Microsoft SSDT的SqlPackage.exe
来讨论here同步数据库,我使用它来同步目标数据库,称为TargetDb
,以匹配存储在SQL Server数据库项目中的源数据库对象,称为DbProject
。
/a:Publish
命令的动作SqlPackage.exe
允许我们将DbProject的.dacpac文件同步到TargetDb,但默认参数不会丢弃DbProject中不存在的TargetDb对象。
打开旗帜/p:DropObjectsNotInSource=true
将解决这个问题,但也会产生奇怪的行为
/p:DropObjectsNotInSource=true
将删除TargetDb上的用户/登录对象,这绝对不是预期的!我能找到的最接近的是/p:DropRoleMembersNotInSource=false /p:DropPermissionsNotInSource=false
,但那些没有多大帮助。/p:DropObjectsNotInSource=true
将打破标志/p:BlockOnPossibleDataLoss=true
,这意味着如果发生数据丢失,更新操作将不会被阻止;这根本不是我想要的。目前我必须接受TargetDb上的'垃圾'/冗余对象:(
什么是更好的标志用于让我在那里?
我问了一个类似的问题here并最终编写了用户脚本作为部署后脚本,以便在部署数据库升级后重新创建它们。
DropPermissionsNotInSource
属性仅适用于GRANT
/ DENY
权限。 DropRoleMembersNotInSource
仅适用于角色会员。
遗憾的是,当DropObjectsNotInSource
属性设置为true时,没有选项可以将用户从被删除的对象中排除。
我们还在预部署脚本中进行了某些更改(例如更改列类型),因为即使更改不会导致数据丢失,BlockOnPossibleDataLoss
也可以阻止部署。我觉得它过于谨慎而不是不够谨慎是好的。
您应该尝试使用/p:DoNotDropObjectType
参数,该参数允许您指定要放弃的不属于源的类型,即当DropObjectsNotInSource
为真时