30

我想知道你们如何管理 2 个 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 数据库从 Test 部署到 Live?

4

14 回答 14

19

我已经开始手动编码我的所有 DDL(创建/更改/删除)语句,将它们作为文本文件添加到我的 .sln 中,并使用普通版本控制(使用颠覆,但任何修订控制都应该工作)。这样,我不仅获得了版本控制的好处,而且从开发/阶段实时更新对于代码和数据库来说是相同的过程——标签、分支等都是一样的。

否则,如果您没有公司为您购买,我同意 redgate 价格昂贵。如果你可以让一家公司为你购买它,那真的很值得!

于 2008-08-02T23:51:09.410 回答
13

对于我的项目,我交替使用 REd Gate 的 SQL Compare 和 Microsoft 的 Database Publishing Wizard,您可以 在此处免费下载。

该向导不像 SQL 比较或 SQL 数据比较那样灵巧,但它可以解决问题。一个问题是它生成的脚本可能需要重新排列和/或编辑才能一次完成。

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

于 2008-08-02T23:40:04.733 回答
7

不要忘记微软的解决方案:Visual Studio 2008 数据库版。包括用于将更改部署到数据库、为模式和/或数据更改生成数据库之间的差异、单元测试、测试数据生成的工具。

它相当昂贵,但我使用了试用版一段时间,并认为它很棒。它使数据库与任何其他代码一样易于使用。

于 2008-08-18T10:47:50.613 回答
5

像 Rob Allen 一样,我使用 Redgate 的 SQL Compare / Data Compare。我还使用 Microsoft 的数据库发布向导。我还有一个我用 C# 编写的控制台应用程序,它接受一个 sql 脚本并在服务器上运行它。这样,您可以从命令行或批处理脚本中运行带有“GO”命令的大型脚本。

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

于 2008-08-04T18:00:50.893 回答
3

我的工作方式与 Karl 相同,将用于创建和更改表的所有 SQL 脚本保存在我保存在源代码控制中的文本文件中。事实上,为了避免必须让脚本检查实时数据库以确定要运行的 ALTER 的问题,我通常这样工作:

  • 在第一个版本中,我将测试期间的所有内容都放在一个 SQL 脚本中,并将所有表视为 CREATE。这意味着我最终会在测试过程中大量删除和读取表格,但这在项目的早期并不是什么大问题(因为我通常在那个时候破解我正在使用的数据)。
  • 在所有后续版本中,我做了两件事:我制作了一个新的文本文件来保存升级 SQL 脚本,其中只包含该版本的 ALTER。我对原始文件进行了更改,还创建了一个新的数据库脚本。这种方式升级只运行升级脚本,但如果我们必须重新创建数据库,我们不需要运行 100 个脚本即可到达那里。
  • 根据我部署数据库更改的方式,我通常还会在保存数据库版本的数据库中放置一个版本表。然后,与其对运行哪些脚本做出任何人工决定,我运行创建/升级脚本的任何代码都使用版本来确定运行什么。

如果您从测试转移到生产的部分内容是数据,那么这不会做的一件事是有帮助,但是如果您想管理结构而不是为一个漂亮但昂贵的数据库管理包付费,那真的不是很困难。我还发现这是一种很好的方式来保持你的数据库的心理轨迹。

于 2008-08-03T00:37:03.903 回答
2

如果您有一家公司购买它,Quest Software 的 Toad 内置了这种管理功能。它基本上是一个两次单击操作来比较两个模式并生成一个从一个到另一个的同步脚本。

他们有适用于大多数流行数据库的版本,当然包括 Sql Server。

于 2008-08-03T00:22:03.997 回答
2

我同意编写一切脚本是最好的方法,也是我在工作中提倡的。您应该编写从数据库和对象创建到填充查找表的所有内容。

您在 UI 中所做的任何事情都不会翻译(尤其是对于更改......对于第一次部署来说不是那么多),并且最终需要像 Redgate 提供的工具。

于 2008-08-03T01:38:02.640 回答
2

使用 SMO/DMO,生成模式的脚本并不难。数据更有趣,但仍然可行。

一般来说,我采用“编写脚本”的方法,但您可能需要考虑以下方面的内容:

  • 区分开发和暂存,以便您可以使用数据子集进行开发......我将创建一个工具来简单地拉下一些生产数据,或者在涉及安全性的情况下生成假数据。
  • 对于团队开发,对数据库的每次更改都必须在团队成员之间进行协调。架构和数据更改可以混合使用,但单个脚本应启用给定功能。一旦您的所有功能都准备就绪,您可以将它们捆绑在一个 SQL 文件中,并针对生产恢复运行该文件。
  • 一旦您的登台被接受,您就可以在生产机器上再次运行单个 SQL 文件。

我使用过 Red Gate 工具,它们是很棒的工具,但如果你买不起,那么构建工具并以这种方式工作也离理想不远。

于 2008-08-04T17:38:59.753 回答
2

我正在使用 Subsonic 的迁移机制,所以我只有一个 dll,其中的类按顺序排列,有 2 个方法,向上和向下。有一个持续集成/构建脚本挂钩到 nant,这样我就可以自动升级我的数据库。

它不是世界上最好的东西,但它胜过编写 DDL。

于 2008-08-26T17:39:20.960 回答
2

RedGate SqlCompare在我看来是一种方法。我们定期进行数据库部署,自从我开始使用该工具以来,我从未回头。非常直观的界面,最终节省了大量时间。

专业版还将负责源代码控制集成的脚本。

于 2008-08-28T00:22:08.193 回答
2

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

于 2010-06-08T21:33:36.510 回答
1

我同意将所有内容保存在源代码管理中并手动编写所有更改的脚本。对单个版本的架构的更改会进入专门为该版本创建的脚本文件。所有存储的过程、视图等都应该放入单独的文件中,就源代码控制而言,应该像 .cs 或 .aspx 一样对待。我使用一个 powershell 脚本来生成一个大的 .sql 文件来更新可编程性的东西。

我不喜欢自动应用架构更改,例如新表、新列等。在进行生产发布时,我喜欢逐个命令执行更改脚本,以确保每个命令都按预期工作。没有什么比在生产环境中运行一个大的更改脚本并出现错误更糟糕的了,因为您忘记了一些在开发过程中没有出现的小细节。

我还了解到,索引需要像代码文件一样对待,并放入源代码控制中。

而且您绝对应该拥有超过 2 个数据库 - 开发和实时数据库。您应该有一个每个人都用于日常开发任务的开发数据库。然后是一个模拟生产的暂存数据库,用于进行集成测试。如果可行,那么可能是最近的完整生产副本(从完整备份中恢复),因此您的最后一轮安装测试与尽可能接近真实的东西背道而驰。

于 2008-08-13T15:41:44.627 回答
1

我将所有数据库创建作为 DDL,然后将该 DDL 包装到模式维护类中。首先,我可能会做各种事情来创建 DDL,但基本上我会在代码中维护所有模式。这也意味着,如果需要执行不能很好地映射到 SQL 的非 DDL 事情,您可以编写过程逻辑并在 DDL/DML 块之间运行它。

然后我的 dbs 有一个定义当前版本的表,因此可以编写一组相对简单的测试:

  1. 数据库存在吗?如果不创建它。
  2. 数据库是当前版本吗?如果没有,则按顺序运行使架构更新的方法(您可能希望提示用户确认并 - 理想情况下 - 此时进行备份)。

对于单用户应用程序,我只是在适当的位置运行它,对于网络应用程序,如果版本不匹配并且我们运行独立的模式维护应用程序,我们目前将用户锁定在外。对于多用户,这将取决于特定的环境。

优势?好吧,我非常有信心使用这种方法的应用程序的架构在这些应用程序的所有实例中都是一致的。它并不完美,有问题,但它有效......

在团队环境中开发时存在一些问题,但无论如何这或多或少是给定的!

墨菲

于 2008-08-26T15:38:22.000 回答
1

我目前正在为你做同样的事情。不仅部署SQL Server数据库从测试到上线,还包括从本地->集成->测试->生产的全过程。所以每天可以让我轻松的是我使用 Red-Gate SQL Compare 执行 NAnt 任务。我不为 RedGate 工作,但我不得不说这是一个不错的选择。

于 2008-11-27T03:15:45.337 回答