将SQL Server数据库从测试部署到Live

Translate

我想知道你们如何管理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实时表之间的差异,当现有字段更改时,还可能需要数据验证/转换。

现在,我听到了很多关于红门产品,但对于爱好项目,价格有点高。

因此,您使用什么来自动将SQL Server数据库从Test部署到Live?

This question and all comments follow the "Attribution Required."

所有的回答

Translate

我已经开始对所有DDL(创建/更改/删除)语句进行手工编码,将它们作为文本文件添加到我的.sln中,并使用常规版本控制(使用Subversion,但任何版本控制都可以使用)。这样,我不仅获得了版本控制的好处,而且从dev / stage进行实时更新对于代码和数据库来说是相同的过程-标签,分支等的工作都相同。

否则,我同意,如果您没有公司为您购买,则redgate的成本很高。如果您能找到一家公司为您购买,那确实值得!

来源
Translate

对于我的项目,我在REd Gate的SQL比较和Microsoft的数据库发布向导之间进行选择,您可以免费下载这里.

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

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

来源
Translate

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

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

来源
Translate

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

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

来源
Translate

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

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

如果您要从测试转移到生产的一部分是数据,那么这将不会做任何事情,但是如果您想要管理结构而不是花钱买一个不错的但昂贵的数据库管理包,那真的不是很困难。我还发现这是保持您的数据库思维状态的一种很好的方法。

来源
Translate

如果您有公司购买,则Quest Software的Toad会内置这种管理功能。基本上,这是单击两次即可比较两个模式并生成一个彼此的同步脚本的操作。

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

来源
Translate

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

您在UI中所做的任何事情都不会翻译(尤其是对于更改……对于首次部署而言,不会那么多),最终将需要使用Redgate提供的工具。

来源
Translate

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

通常,我采用“ Script It”方法,但是您可能需要考虑以下方面:

  • 在开发和暂存之间进行区分,以便您可以使用数据的子集进行开发……我将创建一个工具来简单地提取一些生产数据,或在涉及安全性的情况下生成伪造数据。
  • 对于团队开发,对数据库的每次更改都必须在团队成员之间进行协调。模式和数据更改可以混合在一起,但是一个脚本应该启用给定功能。一旦准备好所有功能,就可以将这些功能捆绑在一个SQL文件中,并在恢复生产时运行。
  • 一旦分阶段清除了接受状态,就可以在生产计算机上再次运行单个SQL文件。

我用过红门工具,它们是工具,但如果您负担不起,则以理想的方式构建工具并以这种方式工作也不会太遥远。

来源
Translate

我正在使用Subsonic的迁移机制,所以我只有一个dll,其中包含按类顺序的类,该类具有上下两个方法。 nant中有一个连续的集成/构建脚本挂钩,因此我可以自动升级数据库。

它不是世界上最好的工具,但是比编写DDL更好。

来源
Translate

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

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

来源
Translate

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

来源
Translate

我同意将所有内容保留在源代码管理中,并手动编写所有更改的脚本。对单个发行版的模式所做的更改将进入为该发行版专门创建的脚本文件。所有存储的proc,视图等都应放入单个文件中,并且就源代码管理而言,它们应与.cs或.aspx一样对待。我使用powershell脚本生成一个大的.sql文件来更新可编程性。

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

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

而且,您肯定应该有两个以上的数据库-开发人员和生活人员。您应该拥有每个人都用于日常开发任务的开发数据库。然后创建一个模拟生产的暂存数据库,并用于进行集成测试。然后,如果可能的话,也许是生产的完整的近期副本(从完整备份中还原),如果可行的话,那么您的最后一轮安装测试将与实际情况尽可能接近。

来源
Translate

我将所有数据库创建都作为DDL完成,然后将该DDL包装到架构维护类中。首先,我可能会做各种事情来创建DDL,但从根本上讲,我是在代码中进行所有架构维护的。这也意味着,如果需要执行非DDL且无法很好地映射到SQL的事情,则可以编写过程逻辑并在DDL / DML块之间运行它。

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

  1. 数据库是否存在?如果没有创建。
  2. 数据库是当前版本吗?如果没有,则依次运行使模式更新的方法(您可能希望提示用户进行确认,并且-最好在此时进行备份)。

对于单个用户应用程序,我只是就地运行它;对于网络应用程序,如果当前版本不匹配,我们当前会将用户锁定,并运行一个独立的架构维护应用程序。对于多用户,这将取决于特定的环境。

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

在团队环境中进行开发时会遇到一些问题,但无论如何都差不多!

墨菲

来源
Translate

我目前正在为您做同样的事情。不仅将SQL Server数据库从测试部署到实时运行,还包括从本地->集成->测试->生产的整个过程。所以每天能让我轻松的是带有Red-Gate SQL的NAnt任务比较。我不是在RedGate工作,但我不得不说这是个不错的选择。

来源