Visual Studio数据库项目中的版本控制更新

Jez*_*Jez 9 database sql-server visual-studio-2012 sql-server-data-tools

我的公司使用Visual Studio数据库项目来部署对数据库的更新.据我所知,它提供了比较项目架构和目标数据库的状态,并生成代码以将后者的架构更新为前者的功能.它还提供了一个预部署脚本和一个部署后脚本,但仅此而已.

缺少的是版本控制和/或排序的任何概念.例如,如果我想将一个不可为空的FK列添加到表中,我需要分两步完成 - 首先,将其添加为具有部署后脚本的可空列,以更新行以获得有意义的值第二,使列不可为空.这些必须按顺序发生.

据我所知,无法通过部署Visual Studio数据库项目来确保部署前和部署后脚本的顺序排序.我在这儿吗?这有两个含义:首先,一旦创建了表,你就无法真正地将一个不可为空的FK列添加到表中;其次,你的部署前和部署后的脚本将继续增长和增长并包含多年前就是因为它们都是在每次部署数据库都运行的.

有没有办法使用Visual Studio数据库项目进行版本更新,如果没有,是否有允许这种版本控制的项目类型?

Ed *_*ott 4

首先,您已将其标记为 Visual Studio 2012 - 如果您使用该版本,请务必升级到 vs 2013 或 2015,并获取最新版本的 SSDT,因为每 3 个月就会发布一次新功能和修复,所以这很好值得获得更新的版本 - 我下面讨论的部分是当前的行为,我不知道这一切是否在 Visual Studio 2012 的原始 ssdt 中可用。

有几件事要说,首先,您可以通过使用 /p:BlockWhenDriftDetected 结合将数据库注册为数据层应用程序 (/p:RegisterDataTierApplication) 来强制执行有序部署。这将允许您执行以下操作:

  1. 构建 dacpac 1
  2. 部署 dacpac 1
  3. 构建 dacpac 2
  4. 部署 dacpac 2
  5. 构建 dacpac 3

它会阻止您在部署 dacpac 1 之前部署 dacpac 2,但这并不理想,因为如果您在部署 dacpac 2 之前构建了 dacpac 3,那么您将无法在不重建 dacpac 3 的情况下进行部署,因此它并不理想。

当您处理数据库(任何 RDBMS,而不仅仅是 SQL Server)的更改时,有时我们需要分阶段发布更改,对我来说,这更多是一个流程问题,而不是技术问题。我所做的是:

  1. 创建变更的第一部分
  2. 在待办事项中创建票证以完成更改
  3. 部署变更
  4. 在部署后的未来迭代中,领取票证以完成更改
  5. 部署最终确定

对此需要注意的一些事项:

  • 需要纪律来确保你整理并完成工作,以敏捷的方式工作并不意味着马虎:)
  • 您编写的任何脚本都应该是幂等的,因此,如果您想设置一些静态数据等,请使用诸如“是否存在”检查或合并语句之类的东西,如果您修改任何模式对象,请将它们包装在“如果存在”等中。如果这样做,您会发现部署更简单的体验

如果您遵循此过程而不是依赖策略的版本控制类型,那么您不必担心部署 dacpac 的顺序,如果脚本很重要,请将其保留在部署后脚本中并检查脚本是否应该执行任何工作在做之前。如果您的脚本变得太大,您可以使用 :r sqlcmd 导入将它们分成不同的文件。我还听说有人使用部署存储过程并从部署后脚本中调用这些过程。

我更喜欢只部署最新(或特定版本)的 dacpac 的过程,因为这意味着无论您是要进行较晚的构建还是要回退到较早的构建,您始终可以部署到该版本。

最后,通过添加不可为空的 fk 列的示例,可以通过 dacpac 的单次部署来完成此操作。为此,您需要:

  1. 创建新的表定义(包括非空和外键约束)
  2. 在部署后脚本中对表进行更新,以便正确设置数据(显然使其具有幂等性,以便在需要时可以永远保留)
  3. 部署时启用 /p:GenerateSmartDefaults

生成部署脚本时会发生什么,您会得到一个如下所示的脚本:

  • 预部署脚本(如果有)
  • 使用临时默认约束创建非空列
  • 删除临时约束
  • 使用 nocheck 创建外键,因此实际上并未强制执行
  • 运行部署后脚本
  • 使用“with check check”启用外键约束

我提到的 /p: 参数是传递给 sqlpackage.exe 的参数。如果您不使用它而是使用其他方式进行部署,您通常可以将它们作为参数传递,如果您让我知道如果您遇到困难如何部署,我可以帮助您。有关参数的说明,请参阅https://msdn.microsoft.com/en-us/library/hh550080.aspx(sqlpackage.exe命令行语法)。

如果您有任何疑问,请告诉我,还有一些额外的事情需要考虑,但是检查您的模式定义并自动生成部署脚本可以大大减少部署更改的工作,这意味着您可以专注于更有用的事情 - 编写单元测试对于一个:)。

埃德