SSDT(dacpac)项目中的动态数据库引用

时间:2017-10-31 09:19:42

标签: sql-server-data-tools database-project dacpac

是否可以在运行时派生SQL Server数据库项目(Dacpac)中的数据库引用?

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

我们的产品实施团队还通过向产品Dacpac文件添加数据库引用,然后将其自己的附加对象添加到项目中来使用Dacpac项目。

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

是否有任何方法可以在运行时使用变量或参数或类似的东西派生数据库项目中的数据库引用(* .dacpac)?

2 个答案:

答案 0 :(得分:1)

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

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

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

enter image description here

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

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

SELECT [SomeData] FROM [AnotherDb_MJE].[dbo].[AnotherTable]

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

SELECT [SomeData] FROM [AnotherDb_MJE2].[dbo].[AnotherTable]

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

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

需要考虑的其他事项

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

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

希望这有帮助,

迈克尔

答案 1 :(得分:0)

感谢您的后续评论,我认为您尝试做的是当您编写和部署代码时能够根据项目使用不同的dacpac?

每个实施团队可能部署了不同版本的共享dacpac,因此您不能将文件放在共享位置并调用dacpac“Product_Latest.dacpac”或其他内容,因此每个人都会获得最新版本。< / p>

“。sqlproj”文件是标准的msbuild脚本,可以使用msbuild属性管理引用,因此您可以在技术上更改运行时的引用。如果您编辑.sqlproj文件并在第一个<PropertyGroup>标记中添加属性,我使用了:

<ProdDacpacVersion Condition="'$(ProdDacpacVersion)' == ''">v1</ProdDacpacVersion>

v1是版本文件夹的唯一名称 - 您只需要一些东西来识别您想要的dacpac。

我把属性放在TargetDatabaseSet和IncludeCompositeObjects之后。

如果您找到对dacpac的引用而不是

<ArtifactReference Include="..\..\..\..\..\Desktop\prod\v1\Database2.dacpac"> <HintPath>..\..\..\..\..\Desktop\prod\v1\Database2.dacpac</HintPath> <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors> </ArtifactReference>

使用上面的属性:

<ArtifactReference Include="..\..\..\..\..\Desktop\prod\$(ProdDacpacVersion)\Database2.dacpac"> <HintPath>..\..\..\..\..\Desktop\prod\$(ProdDacpacVersion)\Database2.dacpac</HintPath> <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors> </ArtifactReference>

然后引用将使用该属性来获取dacpac的路径。有几种方法可以设置属性,你可以编辑.sqlproj文件,当你想从文件或环境变量或其他东西(我将留下msbuild乐趣给你的新版本)读取属性时()

作为标准,每次更改引用时,我都会重新加载项目或重新启动visual studio - 它不会花费很长时间,它会节省大量的诅咒:)

部署dacpac时,部署首先在同一文件夹中查找引用,因此请确保在部署时将正确的文件复制到bin文件夹中。