2009-12-22 97 views
19

我工作的软件系统是医疗记帐系统,大量数据和数据表以及存储过程。什么是使用SQL Server部署数据库更改的简单方法?

我正在阅读文章“12 Steps to Better Code”,并在乔尔测试#2中说:你可以在一个步骤中进行构建?

现在我想知道,这是否意味着部署构建(以便客户可以更新其部署)。

现在我遇到的主要问题是你如何做一步数据库更新?

当前,当我们对数据库进行更改时,所有更改都会被记录并添加到数据库更新脚本中,在创建部署到客户构建时获取版本号。

有没有更简单的方法来做到这一点?一些脚本或应用程序需要在“之前和之后”查看数据库模式并创建一个更新脚本,就像我提到的那样?或者这正是每个人都这样做的方式,我很难相信这一点,但似乎是合理的。

一个自动化的系统可以减少错误,并大大加快部署构建时间,并且我会很感兴趣知道如何去做。

回答

14

有各种层次的复杂性,你可以去通过:如果您有手动创建,并且只是在寻找一种方式来轻松地将那些不同的服务器更新脚本

  • ,检查出由SSW Consulting提供的SSW SQL Deploy。它可以很好地处理这种情况

  • 如果你倾向于做更多的数据库比较方法,那么红门的SQL Compare(已经提到)和SQL Packager是一个很好的组合。您可以在新旧版本之间区分数据库,然后将这些更改应用到一个很好的包中 - 作为EXE或C#项目

  • 如果您想要一个真正的,端到端,深思熟虑的方法(带有一个学习曲线的位),检查出Innovartis' DBGhost的方法。这是一个如何处理数据库开发和增量更新的整个方法论/技术。这是非常强大的,看起来非常有前途的 - 但它是一个有点要么全有要么全无的方法的:要么你购买到它,并用它结束到终端,或者你没有

希望这有助于一点点!

+2

我已经使用了DbGhost 10年了,它一直在运行。他们提供的支持是首屈一指的。 – penderi 2010-02-21 10:41:13

+0

现在是2013年。这个领域的任何更新? – ysrb 2013-10-05 14:28:04

+1

@ysrb:好的,有[SQL Server数据工具](http://msdn.microsoft.com/zh-cn/data/tools。aspx)在Visual Studio 2012/2013中似乎自动化了很多这些开箱即用的任务(如果您使用的是Visual Studio,那就是) – 2013-10-05 16:10:09

2

看看这篇博文。我已经使用这种类型的单个更新脚本从任何数据库版本的几个项目,它工作得很好。

http://blogs.msdn.com/danhardan/archive/2007/03/30/database-change-scripts-mambo-style.aspx

您可能需要调整工作流程中的位,以适应您的工作流程和/或更新模板.sql文件,但总体来说我发现这个想法是一个非常坚实的方法DB部署。

编辑:只是阐述我如何使用这种技术。基本上,我所有的数据库修订脚本都被放入源代码控制。然后,作为构建框的构建后步骤,此Mambo工具在脚本目录上运行,以便将脚本滚动到由事务包含的单个脚本中,以便在发生任何错误时允许回滚。然后,安装程序非常聪明,可以查找.sql脚本以针对现有数据库运行。

这个原因起作用的原因是因为卷起的脚本检查以查看作为单个脚本的每个片段已经针对期望的数据库运行。结果,只有最新的脚本才能运行。需要注意的是,一旦将脚本签入源代码管理并已部署,您将无法编辑脚本,因为跟踪表已经认为脚本已经运行。对于我所从事的项目来说,这很好,因为我们只是将其他脚本添加到脚本文件夹中。

希望我解释的过程足够理解。如果这种方法适用于您的项目,它并不那么复杂,而且可能非常有用。

1

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

我相信乔尔测试#2不是用于部署移动prod,而是在开发过程中连续性集成。

对于prod中的数据库更改,它们都应通过脚本作为事务处理卷展栏的一部分或在数据库备份后完成。如果部署失败,您总是希望能够回溯。

+0

(+1)很好的答案。要实现这一点,您需要数据库状态的版本号,基本状态以及要执行的脚本并撤消对数据库对象的更改。 – 2009-12-22 18:31:49

+0

虽然它们并不完美,但rails迁移很好地完成了这一工作 – 2009-12-22 18:34:17

0

有一些应用程序可以同步数据库,但我认为你最好做你正在做的事情。通过编写脚本来更新数据库,您可以处理错误并运行事务。这被认为是最佳实践。

2

redgate有一个工具SQL Compare来比较数据库并生成一个脚本进行同步。我们过去使用它,但最近使用您描述的相同过程切换到手动脚本。使用具有唯一版本号的手动,细粒度脚本已经很好地实现了。

我们将我们的升级脚本集成到单元测试中,以便它们作为持续集成的一部分与代码一起进行测试。我认为这是“一步到位”的重要组成部分。

1

将数据库开发为一组相互依赖的修补程序。然后使用像https://github.com/LuvDaSun/sqlpatch这样的工具(由我)构建一个用于部署的sql文件。

sqlpatch将按正确的顺序对补丁进行排序,并确保每个补丁都只执行一次,即使相同的脚本运行两次。

此策略可用于在ci/cd环境中部署数据库。这使得部署与推送到分支一样简单。

0

Microsoft本身在SQL 2012中引入Data-tier applications作为部署和升级数据库的免费选项。

我使用和这个工具一样,包括用于生产部署。

相关问题