【问题标题】:Database Project Over Multiple Environments?跨多个环境的数据库项目?
【发布时间】:2026-01-21 11:00:02
【问题描述】:

如何在您的数据库项目中拥有特定于环境的表值,并确保它们仅部署到您使用 Release Management 部署到的环境中?一段时间以来,我们一直在使用发布管理,但仅适用于 .NET 代码。我们对 DACPAC 领域有些陌生,但发现通过发布管理可以轻松设置和使用。但是,现在我们希望将此功能扩展到每个环境都有配置变量的表。我们如何使这部分成为我们数据库项目的一部分,并确保每个环境都有自己独特的数据版本?

【问题讨论】:

    标签: database database-schema release-management ms-release-management dacpac


    【解决方案1】:

    使用 SSDT 发布数据库架构和参考数据;不要用它来管理环境设置。

    就个人而言,我会(并且已经)在部署后运行配置特定环境值的辅助脚本。这与在部署后的 Web 应用程序的 web.config 文件中放置正确的值没有什么不同。这是您在部署工具中管理的东西。

    【讨论】:

    • 感谢您的反馈。在我们的实例中,我们的数据库中有特定字段指向环境特定位置(UNC 路径)和/或从 TEST 到 PROD 不同的客户特定信息;不受我们系统控制的网址和/或 ID。所以我们的挑战是如何运行特定于每个环境的部署后脚本。正如您将在另一个答案中看到的那样,我们最终发现 SQL 命令变量与发布配置文件相结合,以帮助我们确定要运行的脚本。
    • 我们遇到的问题是 SSDT 想要“修复”所有不在您的项目中的用户/角色分配。我们不希望这些在项目中,因为它们不应该在生产中。
    【解决方案2】:

    忽略问题的发布管理部分(因为它取决于您使用的模式以及是否将配置变量存储在 RM 等中)您当然可以将特定于环境的值传递到您的 dacpac 执行中(用于“postdeploy”数据脚本) 使用标记化发布文件中定义的 sqlcmd 变量。 大致的过程是:

    • 在部署后脚本中使用标准 sqlcmdvar 语法,例如插入表值“$(my_env_var)”

    • 更新数据库项目属性(sqlcmd 选项卡)以包含您的新变量,以确保您的 dacpac 在执行时期望一个值

    • 生成一个 publish.xml 文件(现在应该包含一个节点)

    • 创建一个包含转换指令的 publish.release.xml 文件,以更新节点的值以引入令牌,例如##my_env_var##

    • 更新您的数据库项目文件 (.sqlproj) 以包含使用 publish.release.xml 的内容在构建时转换 publish.xml 的说明

    它相当冗长,但你从上面得到的是你的构建输出中的一个 dacapac + 标记化发布文件,准备好被你的部署过程去标记化和执行..是那个 RM 或任何其他工具。

    【讨论】:

    • 谢谢。这基本上是我昨天发布后最终弄清楚的。关键是弄清楚如何使用可以与发布文件结合设置的 SQL 命令变量。我已经给你投了赞成票,但对 Stack Overflow 来说太新了,无法公开显示。