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

时间:2015-02-05 12:29:14

标签: sql-server visual-studio deployment version-control sql-server-data-tools

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

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

例如,客户收缩第三方为他们创建自定义系统,然后第三方在我的数据库中创建一些表。

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

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

2 个答案:

答案 0 :(得分:5)

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

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

DropObjectsNotInSource = FALSE

答案 1 :(得分:4)

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

https://github.com/GoEddie/DeploymentContributorFilterer

这样做会让你忽略或者如果你想部署更新,就不要丢弃它们。

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

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

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

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