从测试环境到生产环境部署SQL Server数据库

30
我想知道你们如何在两个 SQL Server 之间部署数据库,特别是 SQL Server 2005。现在有一份开发版和一份生产版。由于这应该是构建脚本的一部分(标准的 Windows 批处理,即使当前这些脚本的复杂程度可能会转换到 PowerShell 或类似工具),所以 Enterprise Manager/Management Studio Express 不算。
你只是复制 .mdf 文件并附加它吗?当使用二进制数据时,我总是有点小心翼翼,因为这似乎是一个兼容性问题(尽管开发版和生产版应该始终同时运行相同版本的服务器)。
或者 - 鉴于 T-SQL 中缺少 "EXPLAIN CREATE TABLE" - 你是不是做一些将现有数据库导出为 SQL 脚本的事情,然后可以在目标服务器上运行这些脚本?如果是这样,是否有一个可以自动将给定的数据库转储为 SQL 查询并在命令行下运行的工具?(同样,Enterprise Manager/Management Studio Express 不算。)
最后 - 鉴于生产数据库已经包含数据,部署可能不涉及创建所有表,而是检查结构差异并 ALTER TABLE 生产版,而当现有字段更改时也可能需要数据验证/转换。
我听说 Red Gate 产品很棒,但对于业余项目来说,价格有点高。
那么,你们使用什么工具自动从测试环境部署 SQL Server 数据库到生产环境?
14个回答

19

我已经开始手写所有DDL(创建/修改/删除)语句,将它们作为文本文件添加到我的.sln中,并使用正常的版本控制(使用Subversion,但任何版本控制都应该可以)。这样一来,我不仅可以获得版本控制的好处,而且从开发/预发布环境实时更新数据库与代码的过程相同 - 标签,分支等工作方式都是一样的。

如果没有公司为你购买Redgate的话,我同意它很昂贵。但是如果你可以让公司为你购买,那么它真的是很值得的!


1
+1 我使用SSMS中的Design GUI(或SQL2000中的Enterprise Manager)进行更改,但使用“生成更改脚本”图标生成脚本,并将其存储以制作下一个版本的更改脚本。如果有一天你忘记了,还有一个“自动制作更改脚本”的复选框! - Kristen

13

对于我的项目,我在SQL Compare(来自RedGate)和Database Publishing Wizard(来自Microsoft,可以免费下载这里)之间交替使用。

虽然Wizard不像SQL Compare或SQL Data Compare那样流畅,但它能够胜任。一个问题是它生成的脚本可能需要进行一些重新排列和/或编辑,以便连贯执行。

好的一面是,它可以移动您的架构和数据,这对于一个免费工具来说还不错。


7
不要忘记微软提供的解决方案:Visual Studio 2008 数据库版。该版本包括部署数据库更改的工具,生成模式和/或数据更改的数据库差异,单元测试,测试数据生成等功能。
虽然价格相对较高,但我曾使用试用版并认为它非常出色。它使得数据库像其他代码一样易于使用。

5

和Rob Allen一样,我使用Redgate的SQL Compare/Data Compare。我还使用Microsoft的Database publishing wizard。我还编写了一个用C#编写的控制台应用程序,可以将一个SQL脚本在服务器上运行。这样你就可以从命令行或批处理脚本中运行带有"GO"命令的大型脚本。

我在控制台应用程序中使用了Microsoft.SqlServer.BatchParser.dll和Microsoft.SqlServer.ConnectionInfo.dll库。


3
我和Karl一样,通过将创建和修改表的所有SQL脚本保存在源代码控制中的文本文件中工作。事实上,为了避免必须让脚本检查实时数据库以确定要运行的ALTER,我通常会像这样工作:
1. 在第一个版本中,我将所有内容放入一个SQL脚本进行测试,并将所有表视为CREATE。这意味着在测试期间我经常需要删除和重新添加表格,但在项目早期这并不是什么大问题(因为此时我通常正在破解使用的数据)。
2. 在所有后续版本中,我会做两件事:我会创建一个新的文本文件来保存升级SQL脚本,其中包含该版本的ALTER。我对原始文件进行更改时也会创建一个新的、新鲜的数据库脚本。这样,升级只需运行升级脚本,但如果我们需要重新创建数据库,则无需运行100个脚本才能完成。
3. 根据我如何部署数据库更改,我通常还会在数据库中放置一个版本表,用于保存数据库的版本。然后,无论是创建还是升级脚本,都可以使用版本号来确定要运行的内容,而不需要人工决定运行哪些脚本。
唯一不能做的是帮助迁移测试到生产环境的数据,但如果你想管理结构并不想花费大量资金购买昂贵的数据库管理包,这真的不是非常困难。我发现这也是一种很好的跟踪数据库的方法。

2
我还维护我所有对象和数据的脚本。为了部署,我编写了这个免费实用工具 - http://www.sqldart.com。它可以让你重新排列脚本文件并在事务中运行整个脚本。

2
如果你的公司购买了Quest Software的Toad,它就内置了这种管理功能。基本上只需两次点击即可比较两个模式并从一个模式生成同步脚本到另一个模式。他们有适用于大多数流行数据库的版本,当然包括Sql Server。

2

我认为将所有事情都脚本化是最好的方式,这也是我在工作中所倡导的。你应该将从数据库和对象创建到填充查找表的所有内容都脚本化。

仅在用户界面上进行的任何操作都无法转换(特别是对于更改……对于首次部署不太需要),最终会需要像Redgate提供的工具一样。


2

使用 SMO/DMO,生成模式脚本并不太困难。数据有点麻烦,但还是可行的。

一般来说,我采用“脚本化”方法,但您可能考虑以下方法:

  • 区分开发和暂存,这样您就可以使用数据子集进行开发... 我会创建一个工具,以便在涉及安全性时,简单地提取一些生产数据或生成仿冒数据。
  • 对于团队开发,数据库的每个更改都必须在团队成员之间协调。架构和数据更改可以交错进行,但单个脚本应启用特定功能。一旦所有功能都准备好了,您将它们捆绑在单个 SQL 文件中,并针对恢复生产运行该文件。
  • 一旦您的暂存已经通过验收,您可以再次在生产机器上运行单个 SQL 文件。

我曾使用过 Red Gate 工具,它们是 非常好的 工具,但如果您负担不起,构建工具并按此方式工作与理想状态相差不远。


2
我正在使用Subsonic的迁移机制,所以我只需要一个包含按顺序排列的类的dll,这些类有两个方法:up和down。有一个与nant集成的持续集成/构建脚本钩子,使我可以自动升级数据库。
虽然不是最好的方法,但它比编写DDL要好。

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