这似乎是一个被忽视的领域,可以真正使用一些洞察力。您的最佳做法是什么:
等...
答案 0 :(得分:8)
liquibase.org:
答案 1 :(得分:6)
<强>看来强>
应用程序永远不会处理架构更新。这是一场等待发生的灾难。数据比应用程序更长,一旦多个应用程序尝试使用相同的数据(例如生产应用程序+报告应用程序),他们就有可能使用相同的基础公司库......然后两个程序都决定做他们自己的数据库升级...玩 混乱。
答案 2 :(得分:4)
一般来说,我的规则是:“应用程序应该管理它自己的架构。”
这意味着架构升级脚本是应用程序的任何升级包的一部分,并在应用程序启动时自动运行。如果出现错误,应用程序将无法启动,并且未提交升级脚本事务。这样做的缺点是应用程序必须具有对模式的完全修改访问权限(这会使DBA烦恼)。
我使用Hibernates SchemaUpdate功能管理表结构取得了巨大成功。保留升级脚本只处理实际数据初始化和偶尔删除列(SchemaUpdate不这样做)。
关于测试,由于升级是应用程序的一部分,因此测试它们将成为应用程序测试周期的一部分。
事后的想法:在这里接受其他帖子中的一些批评,注意规则说“它是自己的”。它仅适用于应用程序拥有模式的情况,通常是作为产品销售的软件的情况。如果您的软件与其他软件共享数据库,请使用其他方法。
答案 3 :(得分:4)
我是Red Gate产品的忠实粉丝,帮助创建SQL包以更新数据库模式。可以将数据库脚本添加到源代码管理中,以帮助进行版本控制和回滚。
答案 4 :(得分:3)
答案 5 :(得分:2)
这些都是重要的主题,但这是我的更新建议。
您没有指定您的平台,但对于NANT构建环境,我使用Tarantino。对于您准备提交的每个数据库更新,您可以创建更改脚本(使用RedGate或其他工具)。当您构建到生产环境时,Tarantino会检查脚本是否已在数据库上运行(它会向您的数据库添加一个表以便跟踪)。如果没有,则运行脚本。它不需要管理数据库版本的所有手动工作(读取:人为错误)。
答案 6 :(得分:1)
我听说过有关iBATIS 3 Schema Migrations System的好消息:
用户指南:http://svn.apache.org/repos/asf/ibatis/java/ibatis-3/trunk/doc/en/iBATIS-3-Migrations.pdf
答案 7 :(得分:0)
Pat说,使用liquibase。特别是当你有几个开发人员拥有自己的开发数据库时 进行更改将成为生产数据库的一部分。
如果只有一个开发人员,就像我现在正在进行的一个项目(ha),我只是将架构更改作为SQL文本文件提交到CVS仓库中,我在生产服务器上批量检查代码变化进入。
但liquibase比那更有条理!