如何将开发环境数据库的更改移动到生产环境数据库?

24

我一直在做一个项目,并且已经通过了第一阶段。然而,需求最终发生了变化,我必须添加新的表格并重新设置数据库中的一些外键引用。

我的问题是,我缺乏处理这种更改的知识,即在开发数据库上完成开发后,如何将更改迁移到暂存和生产数据库并保留数据库中的数据。

有哪些迁移数据库架构更改的策略,并保持数据库中的数据不受影响?

就我所知,打开SQL Server Management Studio并手动添加表格是一个不好的做法。因此,我正在寻找正确的方法来解决这个问题,同时意识到我可能从一开始就做错了。

9个回答

6

为了维护模式更改,您可以使用ApexSQL Diff,这是一个SQL Server和SQL Azure模式比较和同步工具。为了维护数据库中的数据,您可以使用ApexSQL Data Diff,这是一个SQL Server和SQL Azure数据比较和同步工具。

希望这可以帮助您。

免责声明:我是ApexSQL的支持工程师


5
你需要拥有一个名为“KIT”的东西。显然,如果你正在维护某种源代码控制,那么在开发环境中进行的更改的所有脚本都应该在源代码控制配置工具中进行维护。
一旦你完成了所有你认为可以移动到下一个更高级别环境的脚本/更改,就用文件夹准备好包含所有这些脚本的KIT(最好按照过程、表、函数、引导程序分类)。然后使用OSQL命令行实用程序编写批处理文件,以特定顺序执行KIT中的这些脚本。
为UAT / Staging / Production准备单独的批处理文件,以便你只需双击批处理文件即可在适当的服务器上执行KIT。检查OSQL选项。
这样,你的所有环境就会同步!

这似乎有很高的开销,因为你需要亲自编写所有脚本。 - Buddy Lindsey
没错!我不知道你在使用哪个源代码控制工具。所以我只能给出一个通用答案,适用于任何情况。但是你可以缩小选项范围,使它变得更容易。 - Baaju
@percent20。如果您在使用GUI而不是随时编写脚本,那么编写脚本并不需要太多时间(如果有的话)。您认为这很费时,只是因为您没有练习过,并且试图一次性完成大量工作。而且在某些数据库中(例如SQL Server),GUI不能有效地进行更改,不应该使用。例如,要更改表,它将创建一个新结构的临时表,将所有数据(是的,所有1亿条记录)复制到其中,然后删除旧表并重命名新表,而不是使用更快的ALTER TABLE。 - HLGEM
我明白你的意思。@HLGEM 我能理解你的观点。但是,我必须问一下你是在谈论Sql Server Management Studio还是VS中内置的工具?我这样问是因为VS生成的脚本使用alter table而不是dropping tables。即使如此,我应该花更多时间学习编写和撰写SQL脚本,而不是过度依赖工具。谢谢。 - Buddy Lindsey

3
我通常使用类似于SQL Server发布向导这样的工具来生成更改的SQL脚本。这是一种相当简单和易于操作的方法。但该工具的主要缺点是会删除并重新创建那些未更改但被已更改的存储过程所使用的表(我无法理解为什么),因此需要手动浏览脚本并删除不必要的内容。 请注意,您无需下载和安装此工具;您可以在Visual Studio中启动它。在服务器资源管理器中右键单击连接,然后在上下文菜单中选择“发布到提供程序”。

这似乎是一个不错的选择,因为它允许您进行更多的增量更改,并确保您知道正在发生什么。 - Buddy Lindsey
我将这个标记为答案,因为这是我今天在一个小测试中所做的,似乎是最容易的方法。 - Buddy Lindsey
7
如果已经存在数据,我会担心任何想要在生产环境上删除并重新创建表格的工具。 - HLGEM
你可以使用 IF EXISTS(用于检查表是否存在的查询)来避免删除,然后使用任意数量的 ALTER 语句。 - GayanSanjeewa

3
你可能想要查看类似Liquibase这样的工具:http://liquibase.org/。它可以帮助你管理和追踪数据库中的变化,从而更好地控制你的IT技术项目。

3

Red Gate SQL Compare和SQL Data Compare是非常好用的工具。自从我们公司购买了它,我就可以轻松地将数据库从DEV环境同步到TEST、ACCEPTANCE和PRODUCTION环境中,省去了大量时间。

此外,你还可以将其与脚本文件夹同步,方便地集成到源代码控制系统中。

http://www.red-gate.com


1

有一些可用工具可帮助您完成此操作。

如果您拥有Visual Studio Team版,则可以查看数据库项目(又称DataDude或Visual Studio团队数据库专业版) 在这里这里

它允许您从dev/integration数据库生成模型,然后(对于许多但不是全部情况)自动生成脚本,将您所做的更改更新到prod数据库中。

对于VS 2008,请确保获取GDR2补丁。


这看起来不错,但如果你没有Ultimate或Team Edition,那么一些让它更适合我的东西就不在那里了,比如模式比较,或者我漏掉了什么? - Buddy Lindsey
我相信重要的功能 - Schema Compare - 只在 Team 或 Ultimate 版本中才有。我非常喜欢这个工具。其他供应商 - Redgate - 也有类似的工具。 - ToxicAvenger

1
您可以使用Visual Studio 2015。进入 工具 => SQL Server => 新建模式比较步骤1) 选择 目标 数据库。点击 比较 选项。 步骤2) 比较完成后,您可以点击图标 生成脚本(Shift+alt+G)
这将生成 提交 脚本。 步骤3) 要为数据库更改生成 回滚 脚本,只需从 步骤1交换 数据库即可。

0
一个好的数据库设计工具(如Sybase Powerdesigner)将允许您创建数据模型的设计更改,然后生成实现这些更改的代码。然后,您可以按照自己的选择存储和运行代码。当您继承一个您没有构建的数据库时,此工具还应能够进行反向工程。
即使在组织良好、文档完备的环境中,查找开发和生产之间的所有更改通常也很困难。Idera为SQL Server提供了一种工具,可以检测开发和生产数据库之间的结构差异,另外还有一种工具可以检测数据的更改。事实上,我经常使用这些工具来完成相反的任务,即将开发与生产同步以开始新项目。

0
我们发现推送更改的最佳方式是将数据库更改视为代码。所有更改都在脚本中,它们在源代码控制下,并且它们是版本的一部分。绝不会在任何情况下推送未经脚本化和源代码控制的内容到生产环境。这样,您就不会意外地推送尚未准备好推送到生产环境的开发环境中的更改。此外,您可以将生产数据还原到开发环境中,并重新运行尚未推送的所有脚本,以获取新鲜数据和所有开发工作。当您有需要更改的查找表时,这也非常有效,您不希望在其他事项移动之前将其推送到生产环境中。将插入脚本化并将其与版本的其余代码放在一起非常好用。
使用这些工具进行比较很好,以查看脚本是否遗漏了某些内容,但我永远不会仅依赖于它们。风险太大,可能会将“尚未准备好上线”的内容推送到生产环境中。

我认为我喜欢这些工具的主要原因是它可以完成许多看起来应该完成但我不知道或不会完成的小优化。然而,花时间学习并编写脚本,然后随着时间的推移慢慢研究添加基本功能之外的内容可能从长远来看是一个明智的做法。 - Buddy Lindsey

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