SQL Server数据库更改工作流最佳实践

时间:2010-05-18 18:52:33

标签: sql sql-server database

背景

我的群组有4个SQL Server数据库:

  • 生产
  • UAT
  • 测试
  • 开发

我在Dev环境中工作。当需要推广我一直在处理的对象(表格,视图,函数,存储过程)时,我向我的经理提出请求,他提升了测试。在测试之后,她向促进UAT的管理员提交请求。用户测试成功后,同一个Admin会升级到Production。

问题

由于一些原因,整个过程很尴尬。

  1. 每个人都必须手动跟踪他们的更改。如果我更新,添加,删除我需要跟踪它们的任何对象,以便我的促销请求包含我所做的一切。从理论上讲,如果我错过了一些测试或UAT应该抓住它,但这不确定,无论如何都浪费了测试人员的时间。
  2. 我做的很多改变都是迭代的,在GUI中完成,这意味着没有记录我做了什么改变,只记录了最终结果(至少据我所知)。
  3. 我们正处于构建数据集市的相当早期阶段,因此大多数变更(至少是计数方式)都是次要的:更改列的数据类型,将表的名称更改为我们明确了它们将用于什么,调整函数和存储过程等等。
  4. 问题

    人们几十年来一直在做这种工作,所以我想有一个更好的方法来管理这个过程。我想要的是,如果我可以在两个数据库之间运行差异以查看结构是如何不同的,使用该差异生成更改脚本,使用该更改脚本作为我的促销请求。这可能吗?如果没有,有没有其他方法来组织这个过程?

    为了记录,我们是100%的Microsoft商店,刚刚将所有内容更新到SQL Server 2008,因此该软件包中可用的任何工具都是合理的游戏。


    我应该澄清一下,我不一定要寻找差异工具。如果这是同步我们环境的最佳方式,那么它很好,但如果有更好的方式我正在寻找它。

    做我想要的事情的一个例子是Ruby on Rails中的迁移。死的简单语法,所有更改都会自动记录,默认情况下,确定需要运行的迁移几乎非常简单。我很高兴,如果SQL Server有类似的东西。

    我理想的解决方案是1)容易和2)很难搞砸。 Rails迁移都是;到目前为止我在SQL Server上所做的一切都不是。

9 个答案:

答案 0 :(得分:3)

在我们的团队中,我们处理数据库更改,如下所示:

  • 我们(重新)生成脚本,用于创建完整数据库,并将其与其他更改一起检入版本控制。我们有4个文件:表,用户定义的函数和视图,存储过程和权限。这是完全自动化的 - 只需双击即可生成脚本。
  • 如果开发人员必须对数据库进行更改,则她会在本地数据库上进行更改。
  • 对于每次更改,我们都会创建更新脚本<​​/ strong>。这些很容易创建:开发人员重新生成其本地数据库的db脚本。由于版本控制,现在可以轻松识别所有更改。大多数更改(新表,新视图等)可以简单地复制到更新脚本,其他更改(例如添加列)需要手动创建。
  • 更新脚本在我们的公共开发数据库上进行测试,或者将本地数据库回滚到最后一次备份 - 这是在开始更改数据库之前创建的。如果它通过,则是时候提交更改。
  • 更新脚本遵循命名约定,因此每个人都知道执行它们的顺序。

这对我们来说效果很好,但是如果几个开发人员大量修改相同的表和视图,仍然需要一些协调。但这并不经常发生。

重点是:

  • 除了本地开发人员的数据库之外,数据库结构仅由脚本修改。这很重要。
  • 源代码控制对SQL脚本进行了版本化 - 可以像过去任何时候那样创建数据库
  • 数据库备份会定期创建 - 至少在对数据库进行更改之前
  • 可以快速完成对数据库的更改 - 因为这些更改的脚本相对容易创建。

但是,如果您的项目有很多持久的开发分支,这可能效果不佳。

到目前为止还不是一个完美的解决方案,需要采取一些特殊的预防措施。例如,如果根据数据库中存在的数据存在可能失败的更新,则应在生产数据库的副本上测试更新。

与rails迁移相比,我们不会创建脚本来反转更新的更改。但无论如何,这并不总是可行的,至少在数据方面(即使重新创建列,丢弃的列的内容也会丢失)。

答案 1 :(得分:3)

Version Control and your Database

邪恶的一切根源是在UI中进行更改。 SSMS是一个DBA工具,而不是开发人员。开发人员必须使用脚本对数据库模型/架构进行任何类型的更改。对元数据进行版本控制并将升级脚本从每个版本N升级到版本N + 1,这是唯一方式,已被证明可靠地运行。它是SQL Server自身部署的解决方案,用于跟踪元数据更改(资源数据库更改)。

来自VS数据库项目的SQL Compare或vsdbcmd和.dbschema文件等比较工具只是未能采用正确版本化方法的商店的最后一站。他们在简单的场景中工作,但我发现他们在严肃的部署中都失败了。如果工具试图复制数据,那么只是不相信一个工具来更改+ 5TB表...

答案 2 :(得分:2)

RedGate销售SQL Compare,这是生成更改脚本的绝佳工具。

Visual Studio也有支持数据库比较的版本。这之前称为Database Edition

在我工作的地方,我们很久以前废除了Dev / Test / UAT / Prod分离,转而支持very quick release cycle。如果我们在生产中放置一些东西,我们会很快修复它。我们的客户当然更开心,但在避免企业风险的情况下,这可能很难卖。

答案 3 :(得分:2)

有几种工具可供您使用。一个来自红门,名为SQL Compare。太棒了,强烈推荐。 SQL Compare将允许您在两个数据库之间的模式中执行diff,甚至为您构建sql更改脚本。

请注意,他们现在也在使用SQL Server源代码控制产品。

另一个(如果你是一个视觉工作室商店)是Visual Studio的一部分的架构和数据比较功能(不确定哪个版本)。

答案 4 :(得分:2)

同意SQL Compare是一个了不起的工具。

但是,我们不会像所有其他代码一样对数据库结构或未编写脚本并保存在源代码管理中的对象进行任何更改。然后,您确切地知道您正在推广的版本中包含哪些内容,因为您拥有该特定版本的脚本。

无论如何,通过GUI进行结构更改是一个坏主意。如果你有很多数据,那么至少在SQL Server中使用alter table要慢得多。您只想使用经过测试的脚本来对prod进行更改。

答案 5 :(得分:1)

我同意marapet的意见,其中每个更改都必须编写脚本 但是,您可能遇到的问题是创建,测试和跟踪这些脚本 看看DBSourceTools中使用的修补引擎 http://dbsourcetools.codeplex.com

它专门用于帮助开发人员在源代码控制下获得SQL服务器数据库。

此工具允许您在特定点建立数据库基线,并创建命名版本(v1) 然后,创建部署目标 - 并将命名版本增加到v2 将补丁脚本添加到Patches目录,以获取对架构或数据的任何更改 最后,检查数据库和所有补丁到源代码控制,与devs分发。

这给您带来了一个可重复的过程来测试从v1到v2应用的所有补丁 DBSourceTools还具有帮助您创建这些脚本的功能,即模式比较或脚本数据工具。

完成后,只需将patch目录中的所有文件发送到DBA即可从v1升级到v2。

玩得开心。

答案 6 :(得分:0)

数据库的另一个“Diff”工具:

http://www.xsqlsoftware.com/Product/Sql_Data_Compare.aspx

答案 7 :(得分:0)

  1. 将数据库版本保留在版本控制表中
  2. 保留已成功应用的脚本文件名
  3. 保留已应用的每个sql脚本的md5总和。计算md5 sum时应忽略空格。必须有效。
  4. 保留有关谁应用脚本的信息保留有关何时应用脚本的信息
  5. 应在启动应用程序时验证数据库
  6. 应自动应用新的sql脚本
  7. 如果更改了已应用的脚本的md5总和,则应抛出错误(在生产模式下)
  8. 脚本发布后,不得更改。肯定是 在生产环境中不可变。
  9. 脚本应该以某种方式编写,因此它可以应用于不同类型的数据库(参见liquibase)
  10. 由于大多数ddl语句都是在大多数数据库上自动提交,因此每个SQL脚本最好只有一个ddl语句。
  11. DDL sql语句应该以某种方式运行,因此可以多次执行而不会出错。当您可以多次编辑脚本时,真的有助于开发模式。例如,创建一个新表,只有它不存在,甚至在创建新表之前删除表。它将以开发模式帮助您,使用尚未发布的脚本,更改它,清除此脚本的md5总和,然后重新运行。
  12. 每个sql脚本都应该在自己的事务中运行。
  13. 应在每个数据库之后删除并创建触发器/过程 更新
  14. Sql脚本保存在svn
  15. 等版本控制系统中
  16. 脚本名称包含提交日期,现有(jira)问题ID,小描述
  17. 避免在脚本中添加回滚功能(liquibase允许这样做)。这使得编写和支持变得更加复杂。如果每个脚本只使用一个ddl语句,则dml语句在a中运行 交易,即使是失败的脚本也不会是一大麻烦 解决它

答案 8 :(得分:0)

这是我们一直成功使用的工作流程:

  • 开发实例:使用MSSQL Studio在DB中创建/更新/删除SQL对象,并将所有操作保存到我们在每个版本的代码中包含的脚本中。
  • 投入生产:我们使用Microsoft Visual Studio中的SQL Schema Compare在dev和prod db之间比较架构。我们使用相同的工具更新产品。