如何在 dacpac 中打包部署贡献者?

How to package a deployment contributor in a dacpac?

我找不到任何关于如何在 dacpac 中打包部署贡献者的参考资料。

  1. 我们正在使用 DacServices.Deploy Method 将我们的数据库作为 dacpacs 部署到 SQL 服务器。
  2. 该方法的参数有一个 属性 DacDeployOptions.AdditionalDeploymentContributors,其描述为 "Specifies additional deployment contributors which should run - in addition to those specified in the dacpac [emphasis added]."

所以我的问题是如何在 dacpac 中指定这些部署贡献者

我尝试将部署贡献者 class 放入 Visual Studio 的 SSDT 项目中,但这会干扰加载到 SQL 服务器中的 CLR 程序集(即,它被加载到 SQL 服务器,如果它的依赖项也没有设置为加载,则会抛出错误。

请指教。谢谢。

要将特定贡献者加载到 dacpac 中,您需要手动编辑 .sqlproj 文件并添加:

<PropertyGroup>
    <DeploymentContributors>$(DeploymentContributors);AgileSqlClub.DeploymentPlanLogger</DeploymentContributors>
</PropertyGroup>

之后

<Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" />

"AgileSqlClub.DeploymentPlanLogger" 更改为您的贡献者将其名称导出为(即 [ExportDeploymentPlanModifier("AgileSqlClub.DeploymentPlanLogger", "0.1.0.0")]

添加此 xml 将导致您的 dacpac 中的 "Origin.xml" 具有以下内容:

<RequiredContributors>
  <DeploymentContributor Name="AgileSqlClub.DeploymentPlanLogger" Version="0.1.0.0" />
</RequiredContributors>

您可能是唯一使用过此功能的人之一,所以谁知道它是否有效?让大家知道!

您还需要将贡献者部署到您构建 dacpac 的机器以及您部署或生成部署脚本的机器。在您将从以下位置部署的机器上:

dacfx 查找部署贡献者的路径是 hard-coded 到:

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), @"Microsoft SQL Server0\DAC\bin\Extensions")

所以在我的系统上它是 "c:\program files(x86)\Microsoft SQL Server0\DAC\bin\Extensions"。

在您编译 dacpac 时将使用的机器上,您需要它位于 link:

中的 visual studio 路径中

http://agilesqlclub.codeplex.com/wikipage?title=Deploying&referringTitle=Documentation

参见 "If you publish in SSDT" 部分:

(在我的 vs 2015 系统上是 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC0\Extensions)

另一件事是,当您将您的贡献者复制到扩展目录时,您可以将它们放在另一个文件夹中,这样您就可以保留您的扩展和任何与任何其他贡献者分开的依赖项,这些贡献者将拥有自己的一组依赖项(dll 地狱死于 .net 哈哈)

出于兴趣,您的贡献者做什么?

如果是OSS请考虑分享:

https://github.com/DacFxDeploymentContributors/Contributors

埃德