SqlPackage.exe 发布可以删除目标数据库上不存在的对象的 .dacpac 文件的正确参数是啥?
Posted
技术标签:
【中文标题】SqlPackage.exe 发布可以删除目标数据库上不存在的对象的 .dacpac 文件的正确参数是啥?【英文标题】:What is the right parameter for SqlPackage.exe to publish a .dacpac file that can drop the absent objects on target database?SqlPackage.exe 发布可以删除目标数据库上不存在的对象的 .dacpac 文件的正确参数是什么? 【发布时间】:2013-12-27 10:17:53 【问题描述】:由于我们可以在 Visual Studio 2012 中使用来自 Microsoft SSDT 的 SqlPackage.exe
来同步数据库,如 here 所讨论的那样,我正在使用它来同步目标数据库,称为 TargetDb
,以匹配存储在一个名为 DbProject
的 SQL Server 数据库项目。
SqlPackage.exe
命令的操作/a:Publish
允许我们将 DbProject 的 .dacpac 文件同步到 TargetDb,但默认参数不会删除 TargetDb 中不存在于 DbProject 中的对象。
打开标志/p:DropObjectsNotInSource=true
会解决这个问题,但也会产生奇怪的行为
/p:DropObjectsNotInSource=true
标志将删除 TargetDb 上的用户/登录对象,这绝对不是预期的!我能找到的最接近的是/p:DropRoleMembersNotInSource=false /p:DropPermissionsNotInSource=false
,但这些并没有多大帮助。
/p:DropObjectsNotInSource=true
标志将破坏/p:BlockOnPossibleDataLoss=true
标志,这意味着如果发生数据丢失,更新操作将不会被阻止;这根本不是我想要的。
目前我必须接受 TargetDb 上的“垃圾”/冗余对象 :(
有什么更好的标志可以让我到达那里?
【问题讨论】:
#1 - 我认为您可以通过一个选项忽略用户/权限。我已经在我的高级发布配置文件中设置了这些设置,以避免影响用户。它似乎工作。 #2 - 还没打到这个。您是否尝试过生成自定义脚本来帮助您入门或使用预部署脚本来避免与潜在数据丢失有关的一些问题? @PeterSchott @1 您在个人资料中使用的选项是什么?我问了一个类似的问题here 并最终将用户编写为部署后脚本,以便在部署数据库升级后重新创建它们。
DropPermissionsNotInSource
属性仅适用于 GRANT
/ DENY
权限。
DropRoleMembersNotInSource
仅用于角色成员资格。
遗憾的是,当 DropObjectsNotInSource
属性设置为 true 时,没有将用户排除在删除对象之外的选项。
我们还在预部署脚本中进行了某些更改(例如更改列类型),因为即使更改不会导致数据丢失,BlockOnPossibleDataLoss
也会阻止部署。我想最好是过度谨慎而不是不够谨慎。
【讨论】:
【参考方案2】:您应该尝试使用/p:DoNotDropObjectType
参数,该参数允许您指定要删除的不在源中的类型,即当DropObjectsNotInSource
为真时
【讨论】:
【参考方案3】:请注意,“防止数据丢失”也必须在项目文件中设置:
【讨论】:
这仅在您调试时适用。我认为OP想要做的是使用开关手动运行SqlPackage.exe。【参考方案4】:使用ExcludeObjectTypes
忽略用户/登录。
/p:DropObjectsNotInSource=true /p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions;Credentials;DatabaseScopedCredentials
/p:BlockOnPossibleDataLoss=true
在/p:DropObjectsNotInSource=true
时无效,所以不要打勾。
【讨论】:
如果你只想排除一种类型,那就是 /p:ExcludeObjectType=Users以上是关于SqlPackage.exe 发布可以删除目标数据库上不存在的对象的 .dacpac 文件的正确参数是啥?的主要内容,如果未能解决你的问题,请参考以下文章
升级数据库时是不是有导致 SqlPackage.exe 执行数据移动(表重新创建)的完整列表?
sqlpackage.exe 忽略 DevOps 发布管道中的特定架构
Azure Devops 无法从计算机上的注册表中找到 Dac Framework (SqlPackage.exe) 的位置