SSDT (dacpac) 项目中的动态数据库参考

Ash*_*Ash 5 database-project dacpac sql-server-data-tools

有没有一种方法可以在运行时导出 SQL Server 数据库项目 (Dacpac) 中的数据库引用?

我们正在构建一个使用 Dacpac 来部署数据库对象的产品。

我们的产品实施团队还使用 Dacpac 项目,方法是将数据库引用添加到产品 Dacpac 文件,然后将他们自己的附加对象添加到项目中。

我们面临的问题是 - 每次实现需要指向较新的产品发布版本时,必须手动更改实现 dacpac 中的父 dacpac 引用以引用新产品 dacpac 的新文件路径(在新版本)。我们在每个实施中都有多个实施团队和多个数据库项目。

有没有什么方法可以在运行时使用变量或参数或类似的东西导出数据库项目中的数据库引用(*.dacpac)?

Mic*_*eck 2

我对你的问题的理解如下:

您有一个 SSDT 数据库项目(请参见下面的示例图),该项目具有数据库引用(类似于下面的#1)以及访问引用数据库的存储过程和其他数据库对象(类似于文件#2 和代码#3)。您已经“构建”了生成 DACPac 的解决方案,现在您想要使用此 DACPac 并在部署时引用其他数据库。希望我正确理解你的问题。

如果是这样,那么您可以使用“发布配置文件”功能来实现此目的(类似于下面的#4)。

在此输入图像描述

相关代码可以在我的SSDT talk github 项目的笔记中看到。如果您专门查看demo04解决方案文件,您将看到我有一个DEV_MJE.deploy.ps1 PowerShell 文件和一个DEV_MJE2.deploy.ps1文件。这些脚本运行 MSBuild 来构建 DACPac,然后使用 SqlPackage 分别发布DEV_MJE.publish.xml或DEV_MJE2.publish.xml。请注意,如果您在计算机上运行此示例,则需要将MSBuild.exe和添加SqlPackage.exe到您的路径,并将TargetConnectionStringxml 文件中的 修改为现有的开发数据库。

作为其工作原理的示例...当我使用 Publish Profile 时DEV_MJE.publish.xml,生成的 GetDataFromAnotherTable.sql 文件包含:

SELECT [SomeData] FROM [AnotherDb_MJE].[dbo].[AnotherTable]
Run Code Online (Sandbox Code Playgroud)

而当我使用DEV_MJE2.publish.xml生成的 GetDataFromAnotherTable.sql 文件时包含:

SELECT [SomeData] FROM [AnotherDb_MJE2].[dbo].[AnotherTable]
Run Code Online (Sandbox Code Playgroud)

请注意,第二个中的数据库引用已更改为 AnotherDb_MJE 2。

有关发布配置文件如何与 DACPac 和 SSDT 数据库项目相关的详细说明,请参阅此网页。它还包含有关部署之外的替代方法的信息SqlPackage.exe。

其他需要考虑的事情

请注意,使用文件路径对 DACPac 进行版本控制并不是真正的最佳实践。将 DACPac 工件视为类似于 .Net DLL。它是构建的副产品。

因此,更好的方法是使用 NuGet 和 Octopus Deploy 等工具来存储、跟踪和部署 DACPac。有关其工作原理的详细描述,请参阅stackoverflow 答案。

希望这有帮助,

迈克尔