3

正如我们可以使用SqlPackage.exeVisual Studio 2012 中的 Microsoft SSDT 来同步数据库,如此所述,我正在使用它来同步目标数据库,称为TargetDb,以与存储在 SQL Server 数据库项目中的源数据库对象匹配,称为DbProject.

/a:Publishcommand的操作SqlPackage.exe允许我们将 DbProject 的 .dacpac 文件同步到 TargetDb,但默认参数不会删除 TargetDb 中不存在的 DbProject 对象

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

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

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

有什么更好的标志可以让我到达那里?

4

4 回答 4

1

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

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

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

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

于 2014-01-16T17:09:43.110 回答
1

您应该尝试使用/p:DoNotDropObjectType允许您指定要删除的不在源中的类型的参数,即何时DropObjectsNotInSource为真

于 2016-09-02T12:18:35.220 回答
0

用于ExcludeObjectTypes忽略用户/登录。

/p:DropObjectsNotInSource=true /p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions;Credentials;DatabaseScopedCredentials

/p:BlockOnPossibleDataLoss=true时没有效果/p:DropObjectsNotInSource=true,所以不要费心勾选它。

于 2021-08-01T18:58:50.083 回答
0

请注意,“防止数据丢失”也必须在项目文件中设置:

在此处输入图像描述

于 2019-04-03T10:52:09.813 回答