我们正在使用java和oracle11g为客户开发一个基于web的解决方案。该项目是为客户安装的,但其大部分功能正在开发中。每个月,我们发布一个新的版本,应该安装在客户网站。问题是,在每个版本中,DB (表、视图、SPs、触发器等)都有很多变化。我无法从开发线获得转储,并将其带到客户站点。
问题是如何生成一个SQL脚本来将customer的模式迁移到它的新版本(开发版本)?是否有自动生成脚本的工具?在java中有任何开源代码可以做到这一点吗?在这个问题上有什么最佳做法吗?
编辑
根据答案,最好的做法似乎是禁止开发人员直接更改DB方案,他们应该为每个DB更新编写和提交一个更改脚本。但是使用这种方法,过一段时间后,会出现大量的更改脚本,每个脚本都在DB中保存一个特定的更新。然后,我如何管理这些大量脚本?
发布于 2012-08-23 20:12:41
简单的回答是,考虑到您描述的情况,您需要进行大量的工作,以便在以前的版本和下一个版本之间找到一个点到点的迁移脚本。
数据库差异工具确实存在,但是在这个博客文章中最好描述的概念中存在一个普遍的缺陷:
http://blog.liquibase.org/2007/06/the-problem-with-database-diffs.html
TL;DR: diff工具无法确定特定更改的上下文。例如,如果在开发过程中更正了列名中的拼写错误,则需要在现有数据库上使用重命名列命令,以保留表中已经保存的任何数据。数据库diff工具只能看到新模式中不存在的旧列,也只能看到旧模式中不存在的新列。因此,该工具将删除旧列,并添加新列,但结果是,原来在该列中的所有数据现在都消失了。
作为最佳实践,我建议您主动跟踪数据库更改。像Django和Rails这样的较新的web框架支持迁移跟踪,但是像Liquibase (上面的链接)这样的开源解决方案也存在于Java世界。我们在我目前的公司使用Liquibase,到目前为止我们已经成功地将这些迁移成本降到最低。我们在经历了您现在所面临的这种迁移之后,进行了转换。
祝好运!
https://stackoverflow.com/questions/12096083
复制相似问题