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



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

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

例如,客户端与第三方签订合同,为他们创建一个自定义系统,然后第三方在我的数据库中创建一些表。

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

在部署.dacpac时,我如何使这些不属于我的架构的对象不被排除在外?我想这可能是不可能的,在这种情况下我能做什么?

这是可能的,而且通常非常有用。目标中可能有您不想丢弃的对象。我们总是使用单独的放置脚本,以可控的方式(而不是自动)将对象放置在生产dbs中。

存在一个msbuild参数,用于不删除在目标中但在源中未找到的对象。只需使用参数"在目标中放置对象,但不在项目中"为false。此设置将保持这些对象不变。从VS中发布时也有此选项。

DropObjectsNotInSource=FALSE

你很幸运,因为我刚刚发布了一个部署过滤器,它可以做你想要的事情!

https://github.com/GoEddie/DeploymentContributorFilterer

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

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

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

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

从技术上讲,这是因为当你运行部署时,每个操作(创建、删除、更改)都会调用过滤器,如果我们匹配正则表达式,我们只需将其从脚本中删除,这样在这种情况下,删除就永远不会实际执行。

最新更新