SSDT如何:部署.dacpac而不丢失自定义客户端数据库对象?

问题描述 投票:2回答:2

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

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

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

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

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

sql-server visual-studio deployment version-control sql-server-data-tools
2个回答
5
投票

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

有一个msbuild参数不会丢弃在目标中找到但在源中没有的对象。只需使用参数“将对象放在目标中但不在项目中”将其设置为false。此设置将保持这些对象不变。从VS内部发布时,该选项也存在。

DropObjectsNotInSource = FALSE


4
投票

你很幸运,因为我刚刚发布了一个完全符合你想要的部署过滤器!

https://github.com/GoEddie/DeploymentContributorFilterer

这样做会让你忽略或者如果你想部署更新,就不要删除对象(如果它们存在)。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.