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

9
我的公司使用Visual Studio数据库项目来部署我们的DB更新。据我所知,它提供了比较项目模式和目标数据库状态的功能,并生成代码以将后者的模式更新为前者。它还提供一个预部署脚本和一个后部署脚本,但没有更多。

这里缺少的是任何版本控制和/或排序的概念。如果我想要在表中添加一个非空的FK列,我需要分两步完成 - 首先,将其作为可空列添加,并使用后置部署脚本更新行以具有有意义的值。其次,使该列为非空。这些必须按顺序发生。

据我所知,在使用Visual Studio数据库项目部署时,没有办法确保预部署和后部署脚本的顺序。我在这里是对的吗?这有两个含义:首先,一旦创建了表,您就无法真正添加非空的FK列;其次,您的预部署和后部署脚本将不断增长并包含多年前的垃圾,因为它们每次部署数据库时都会运行。

是否有任何方法可以使用Visual Studio数据库项目进行版本控制,如果没有,是否有一种项目类型可以允许此类版本控制?


既然你询问了其他项目类型,不妨看一下带有迁移的Entity Framework 7 - Jared Dykstra
你看过Ready-Roll吗?http://www.ready-roll.com/ 这是RedGate的一个工具,可以与Visual Studio集成。我认为这正是你想要的。 - Karl Gjertsen
1个回答

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. 部署最终版本
需要注意以下几点:
1.这需要纪律性,以确保您整理和完成工作,以敏捷的方式工作并不意味着要草率 :) 2.您编写的任何脚本都应该是幂等的,因此如果要设置一些静态数据等,请使用if exists检查或合并语句,如果修改任何模式对象,则包装在if exists中等。如果您这样做,将发现部署更简单。
如果您采用此流程而不是依赖版本控制类型的策略,则无需担心部署dacpac的顺序,如果脚本很重要,请将其保留在发布后的脚本中,并检查脚本是否需要执行任何操作。如果您的脚本变得太大,则可以使用:r sqlcmd导入将它们分成不同的文件。我还听说过有人使用部署存储过程并从发布后的脚本中调用它们。
我更喜欢一种流程,您只需部署最新版本(或特定版本)的dacpac,这意味着您始终可以部署到该版本,无论您是要进行较新的构建还是回退到较旧的构建。
最后,对于您添加非空fk列的示例,可以通过单个dacpac的部署来完成此操作。要做到这一点,您需要执行以下操作:
  1. 创建新的表定义(包括非空和外键约束)
  2. 在您的发布后脚本中,对表进行更新,以便正确设置数据(显然使其幂等,以便需要时可以永久保留)
  3. 当您部署启用 /p:GenerateSmartDefaults 时

生成部署脚本时会生成以下脚本:

  • 预发布脚本(如果有)
  • 创建具有临时默认约束的非空列
  • 删除临时约束
  • 创建没有检查的外键,因此实际上未被执行
  • 运行发布后脚本
  • 使用“with check check”启用外键约束

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

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

Ed


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接