从测试部署SQL Server数据库到现场

我想知道你们如何管理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数据库从测试到现场?

0
额外 编辑
意见: 1

14 答案

我使用的是Subsonic的迁移机制,所以我只是按照顺序排列有两个方法的上下dll。有一个连续的集成/构建脚本钩入nant,以便我可以自动升级数据库。

它不是世界上最好的thign,但它跳动写DDL。

0
额外

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

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

0
额外

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

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

0
额外

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

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

如果你正在从测试转移到生产的一部分是数据,但是如果你想管理结构并且不支付一个漂亮但昂贵的数据库管理包,那么这不会做的一件事就是帮助,这实际上并不困难。我也发现这是保持你的数据库心智跟踪的一个很好的方法。

0
额外

For my projects I alternate between SQL Compare from REd Gate and the Database Publishing Wizard from Microsoft which you can download free here.

该向导不像SQL比较或SQL数据比较那么光滑,但它确实有效。一个问题是它生成的脚本可能需要重新排列和/或编辑才能一次流动。

另一方面,它可以移动你的架构和数据,这对于一个免费的工具来说并不坏。

0
额外

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

一般来说,我采用“Script It”方法,但您可能需要考虑以下内容:

  • 区分开发和分期,这样您就可以开发数据的一个子集......这样我就可以创建一个工具来简单地下拉一些生产数据,或者在涉及安全的情况下生成假数据。
  • 对于团队开发,每个数据库更改都必须在您的团队成员中进行协调。模式和数据更改可以混合在一起,但单个脚本应启用给定的功能。一旦你的所有功能都准备好了,你就可以将它们捆绑在一个单独的SQL文件中,并在生产恢复的情况下运行。
  • 分段验收通过后,您再次在生产计算机上运行单个SQL文件。

我已经使用了红门工具,它们都是很好的工具,但如果你负担不起,那么构建工具并以这种方式工作并不太理想。

0
额外

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

您在UI做任何事情,只是不会转化(特别是对于改变......没有那么多第一次部署),并最终将需要的工具像什么展鹏提供。

0
额外

我已经开始手动编写所有的DDL(创建/更改/删除)语句,将它们作为文本文件添加到我的.sln中,并且使用普通版本(使用Subversion,但任何版本控制都应该可以)。这样,我不仅可以获得版本控制的好处,而且可以从开发/阶段进行实时更新,这与代码和数据库的相同流程 - 标签,分支等工作完全相同。

否则,我同意如果你没有一家公司为你购买,redgate的价格很高。如果你可以让一家公司为你购买它,它确实是值得的!

0
额外
+1我使用SSMS中的设计GUI(或SQL2000中的企业管理器)进行更改,但使用“生成更改脚本”图标生成脚本,该脚本存储在下一发行版的更改脚本中。有一个复选框“自动更改脚本”复选框,以防万一你忘记了一天!
额外 作者 Kristen,

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

我不喜欢自动化模式更改的应用程序,例如新表,新列等。在执行产品发布时,我喜欢通过命令执行更改脚本命令,以确保每个脚本按预期工作。没有什么比在生产中运行一个大的变更脚本和获取错误更糟的了,因为你忘记了一些没有出现在开发中的细节。

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

你应该有超过2个数据库 - dev和live。你应该有一个每个人都用于日常开发任务的开发数据库。然后是一个模拟生产的临时数据库,用于进行集成测试。然后,如果可行的话,也许是一个完整的生产副本(从完整备份中恢复),所以上一轮安装测试与尽可能接近真实情况的东西相反。

0
额外

RedGate SqlCompare is a way to go in my opinion. We do DB deployment on a regular basis and since I started using that tool I have never looked back. Very intuitive interface and saves a lot of time in the end.

Pro版本也将负责源代码控制集成的脚本。

0
额外

我将所有数据库创建为DDL,然后将该DDL包装到模式维护类中。我可能会首先做各种事情来创建DDL,但从根本上讲,我会在代码中完成所有的架构维护。这也意味着如果你需要做非DDL的东西,那么你可以编写程序逻辑并在DDL / DML之间运行它。

然后我的dbs有一张表格,它定义了当前的版本,所以可以编写一套相对简单的测试:

  1. 数据库是否存在?如果没有创建它。
  2. DB是当前版本吗?如果没有,则依次运行这些方法,以使模式保持最新(您可能希望提示用户确认,并且 - 理想情况下 - 在此时进行备份)。

对于单个用户应用程序,我只是在适当的位置运行此应用程序,对于我们目前用于锁定用户的Web应用程序,如果版本不匹配并且有我们运行的独立架构维护应用程序。对于多用户,它将取决于特定的环境。

优势?那么我有很高的信心,即使用这种方法的应用程序的架构在这些应用程序的所有实例中都是一致的。它不完美,有问题,但它的作品...

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

墨菲

0
额外

不要忘记微软解决这个问题的办法: Visual Studio 2008数据库版。包括用于部署数据库更改的工具,在用于模式和/或数据更改的数据库之间产生差异,单元测试和测试数据生成。

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

0
额外

I'm currently working the same thing to you. Not only deploying SQL Server databases from test to live but also include the whole process from Local -> Integration -> Test -> Production. So what can make me easily everyday is I do NAnt task with Red-Gate SQL Compare. I'm not working for RedGate but I have to say it is good choice.

0
额外
答案中的链接已经死亡。
额外 作者 Pang,

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

0
额外