使用SQL Server部署数据库变更的简易方法是什么?

22
我所工作的软件系统是一个医疗账单系统,包含大量数据和数据表以及存储过程。
我正在阅读文章"12步走向更好的代码",在Joel测试#2中提到:你能否一步完成构建?
现在我想知道,这是否意味着部署构建(以便客户可以更新其部署)。
现在我遇到的主要问题是如何进行一步数据库更新?
当前,当我们对数据库进行更改时,所有更改都会被记录并添加到数据库更新脚本中,并在创建部署到客户端的构建时附加版本号。
是否有更简单的方法来做到这一点?是否存在某些脚本或应用程序,可以对数据库模式进行“前后”比较,并创建像我提到的更新脚本?
还是这就是每个人都这样做的方式,虽然我觉得难以置信,但也有可能。
自动化系统将减少错误,并显著加快部署构建时间,我很想知道如何做到这一点。
7个回答

17

有不同的复杂度可供选择:

  • 如果你手动创建更新脚本,只是想要一种简单地将其应用于各个服务器的方式,请查看 SSW Consulting 的 SSW SQL Deploy。它可以非常好地处理这种情况。

  • 如果您更倾向于进行数据库差异比较,则 Red Gate 的 SQL Compare(已经提到)和 SQL Packager 是一个很好的组合。您可以对旧版和新版数据库进行差异比较,然后以良好打包形式(EXE 或 C# 项目)应用更改。

  • 如果您想要一个真正的、端到端的、深思熟虑的方法(需要一些学习曲线),请查看 Innovartis 的 DBGhost 方法。这是一个完整的方法论/技术,如何处理数据库开发和增量更新。它非常强大,看起来非常有前途-但它是一个全球或不做的方法:要么您全面采用并端到端使用它,要么不使用。

希望这能有所帮助!


2
我已经使用DbGhost十年了,它一直很可靠。他们提供的支持是首屈一指的。 - penderi
1
@ysrb:嗯,如果你正在使用Visual Studio,那么在Visual Studio 2012/2013中有SQL Server数据工具,似乎可以自动化许多这些任务。 - marc_s

3
红门软件有一个名为SQL Compare的工具可用于比较数据库并生成同步脚本。我们曾经使用它,但最近转而使用您描述的相同过程手动编写脚本。使用细粒度唯一版本号的手动脚本效果很好。
我们将升级脚本集成到单元测试中,因此它们与代码一起作为持续集成的一部分进行测试。我认为这是“一步构建”的重要组成部分。

2
请查看这篇博客文章。我在几个项目中使用了这种类型的单个更新脚本,效果非常好。 http://blogs.msdn.com/danhardan/archive/2007/03/30/database-change-scripts-mambo-style.aspx 您可能需要调整工作流程以适应您的工作流程和/或更新模板.sql文件,但总体上我发现这种方法是数据库部署的一个相当可靠的方法。
编辑:为了详细说明我如何使用这种技术。基本上,我所有的数据库修订脚本都被放入源代码控制中。然后,在构建服务器上的后置生成步骤中,这个Mambo工具会在脚本目录上运行,将脚本合并成一个由事务包含的脚本,以便在出现任何问题时进行回滚。然后,安装程序足够智能,可以查找.sql脚本来针对现有数据库运行。
这种方法之所以有效,是因为合并的脚本检查每个独立脚本已经针对所需的数据库运行。因此,只有最新的脚本才会被运行。这个方法的一个注意点是,一旦一个脚本被检入源代码控制并被部署,您就不能编辑它,因为跟踪表已经认为该脚本已经运行。对于我工作的项目来说,这是可以接受的,因为我们只需将另一个脚本添加到脚本文件夹中。
希望我能解释得足够清楚。这并不复杂,如果这种方法适用于您的项目,它可以非常有用。

1

微软在SQL 2012中推出数据层应用程序作为免费选项,用于部署和升级数据库。

我使用并喜欢这个工具,包括生产部署。


1

回答“现在我想知道,这是否意味着部署构建(以便客户可以更新其部署)的第一个问题?”

我认为Joel测试#2不是针对将部署移动到生产环境,而是针对开发过程中的持续集成。

至于生产环境中的数据库更改,它们都应该通过脚本完成,作为事务发布或在备份数据库后完成。如果发布过程中出现故障,您始终希望能够返回之前的状态。


(+1) 好答案。要实现这个,您需要数据库状态的版本号、基本状态以及执行和撤销对数据库对象进行更改的脚本。 - Hassan Syed
虽然它们并不完美,但 Rails 迁移做得相当不错。 - Jeff Paquette

1
将您的数据库开发为一组相互依赖的补丁,然后使用 https://github.com/LuvDaSun/sqlpatch(由我创建)等工具构建用于部署的 SQL 文件。
sqlpatch 将按正确顺序对补丁进行排序,并确保每个补丁仅被执行一次,即使同一脚本运行两次也是如此。
这种策略可用于在 CI/CD 环境中部署数据库。这使得部署就像推送到一个分支一样简单。

0

有一些应用程序可以同步数据库,但我认为最好还是像你现在这样做。编写一个更新数据库的脚本可以让你处理错误并运行事务。这被认为是最佳实践。


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