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 您在个人资料中使用的选项是什么? FalseFalseTrue 参数似乎与我的命令行参数相同。我将尝试使用个人资料并稍后与您联系 【参考方案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生成重命名表的脚本?

sqlpackage.exe 忽略 DevOps 发布管道中的特定架构

Azure Devops 无法从计算机上的注册表中找到 Dac Framework (SqlPackage.exe) 的位置

部署 DacPac 时如何在 SqlPackage.exe 中使用多个 SQLCMD 变量?

由于缺少对象,DACPAC 无法部署