SSDT 如何:在不丢失自定义客户端数据库对象的情况下部署 .dacpac?

SSDT How to: Deploy .dacpac without losing custom client database objects?

我在 Visual Studio 中使用数据库项目。

在我的场景中,我的客户直观地自定义了我为他们提供的数据库。

例如,客户与第三方签约为其创建定制系统,然后第三方在我的数据库中创建一些表。

我知道我永远不应该允许第三方访问我的数据库,但我工作的公司允许这样做。

在部署 .dacpac 时,如何使这些不属于我的架构的对象不被排除?我认为这可能是不可能的,在这种情况下我该怎么办?

这是可能的,而且通常非常有用。您的目标中可能有您不想丢弃的对象。我们总是使用单独的删除脚本以受控方式(不是自动)将我们的对象删除到我们的生产数据库中。

有一个 msbuild 参数不删除在目标中找到但在源中找不到的对象。 只需使用参数 "Drop objects in target but not in Project" 为 false。此设置将使这些对象保持不变。从 VS 中发布时也有该选项。

DropObjectsNotInSource=假

你很幸运,因为我刚刚发布了一个部署过滤器,它可以完全满足你的要求!

https://github.com/GoEddie/DeploymentContributorFilterer

这样做的目的是让您忽略或者如果您想要部署更新,只要对象存在就不要删除它们。

如果您使用 sqlpackage.exe 部署 dacpac,请添加以下命令行:

/p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor
/p:AdditionalDeploymentContributorArguments="SqlPackageFilter=IgnoreName(.*RegexThatMatchesYourObjectsOrUseASchemaMatchAndPutThemInTheirOwnSchema.*)"

如果您在 SSDT 中使用发布选项(在 visual studio 内),则将它们添加到发布 profile.xml

从技术上讲,它的作用是,当您 运行 部署时,每个操作(创建、删除、更改)都会调用过滤器,如果我们匹配正则表达式,我们只需将其从脚本中删除,以便这种情况下的下降从未真正执行过。