ssdt:使用 dacpac 对参考数据进行版本控制

ssdt: versioning reference data with dacpac

Dacpac 是一个很好的版本控制方案解决方案,我们必须使用 pre/post 部署来修改参考数据。

有更好的解决方案吗?

我见过的最好的方法是使用合并语句,每个文件一个 table,然后使用 :r imports 将它们导入到您的 post-deploy 脚本中。

您可以获得版本历史记录和易于比较的数据,使用 sp_generate_merge 使它变得非常简单。

埃德

如果您正在 SSDT 中寻找一种解决方案来处理不涉及使用 pre/post-deployment 脚本的引用,遗憾的是目前没有。

但目前是 one of the most requested features in SSDT,所以也许它有可能在未来某个时间实施。

我是 Ed 提到的 sp_generate_merge OSS 实用程序的维护者,在 Redgate,我们向我们的客户推荐这种以 离线 方式处理参考数据的方法,在以下情况下:

  • 如果 table 中的数据变化非常频繁,因为每个文件一个文件table 方法允许 branching/merging 来自多个开发人员的并发更改
  • 如果 table 中的数据包含特定于环境的值,如应用程序设置,因为此方法允许您使用 SQLCMD 变量和 feed the values in from a deployment tool

离线方法可能存在问题:

  • MERGE 声明的不确定性:在实际 运行 针对您的目标环境进行部署之前,可能很难知道将应用哪些更改(如果有)。最坏的情况,您可能会遇到 documented issues in MERGE
  • 之一
  • 工作流程不一定是最自然的数据编辑方式,因为它需要 运行 实用程序并将输出复制粘贴回原始文件。直接编辑文件是一种替代方法,但这并不是最人性化的体验,尤其是在有大量参考数据的情况下
  • 在参考 table 中协调对架构和数据的更改可能是一个挑战,因为 SSDT 仍然负责应用架构更改。例如,如果您想添加一个没有默认值的新 NOT NULL 列。

另一种解决方案涉及遵循 在线 方法,我们的 SSDT 替代方案 ReadyRoll 数据库项目支持该方法。它允许直接在数据库中编辑数据,然后使用同步脚本将数据导入到项目中(即包含 INSERTUPDATEDELETE 语句而不是 MERGE ) 由其数据比较工具生成,以及任何架构更改。

您可以在 ReadyRoll documentation.

中阅读有关离线和在线方法有何不同的更多信息