1

我们正在为使用 java 和 oracle 11g 的客户开发基于 Web 的解决方案。该项目是为客户安装的,但其大部分功能正在开发中。每个月,我们都会发布一个新版本,应该在客户现场安装。问题是在每个版本中,数据库中都有很多变化(表、视图、SP、触发器等)。我无法从开发线上获取转储并将其带到客户站点。

问题是如何生成可以将客户数据库架构迁移到其新版本(开发版本)的 SQL 脚本?是否有用于生成此脚本的自动化工具?java中是否有任何开源代码可以做到这一点?这个问题的任何最佳实践?

编辑

根据答案,似乎最好的做法是禁止开发人员直接更改数据库方案,他们应该为每个数据库更新编写并提交一个更改脚本。但是使用这种方法,一段时间后,会出现大量的更改脚本,每个脚本都在数据库中保存一个特定的更新。那么我该如何管理这些大量的脚本呢?

4

2 回答 2

5

简短的回答是,鉴于您所描述的事态,您需要做大量工作才能在先前版本和下一个版本之间提出一个点对点迁移脚本。

数据库差异工具确实存在,但在这篇博文中最能描述的概念中存在一个普遍的缺陷:

http://blog.liquibase.org/2007/06/the-problem-with-database-diffs.html

TL;DR:差异工具无法确定特定更改的上下文。例如,如果在您的开发过程中,您更正了列名中的拼写错误,您可能希望在现有数据库上使用 RENAME COLUMN 命令,以保留表中已保存的所有数据。数据库差异工具只能看到新模式中不存在的旧列,以及旧模式中不存在的新列。因此该工具会删除旧列并添加新列,但结果是,该列中原来的所有数据现在都消失了。

作为最佳实践,我建议您在进行时主动跟踪数据库更改。较新的 Web 框架(例如 Django 和 Ruby on Rails)支持开箱即用的迁移跟踪,但 Java 世界也存在 Liquibase(上面的链接)等开源解决方案。我们在我现在的公司使用 Liquibase,到目前为止,我们已经取得了巨大的成功,最大限度地降低了这些迁移成本。在经历了您现在面临的这种迁移之后,我们做出了转换。

祝你好运!

于 2012-08-23T20:12:41.953 回答
2

数据库更改只能通过您放入源代码控制的脚本进行。如果你这样做了,那么你就不会遇到很多问题,知道将什么转移到 Qa 然后再进行刺激。另外,该脚本已经过测试,这与在最后创建脚本并在产品上首次运行它不同。此外,如果某些更改是针对不同项目的,则在它们未准备好时不会意外将它们放在 prod 上,因为它们将位于源代码控制的不同分支中。SQL 代码就是代码,就源代码控制而言,它应该与所有其他代码一样对待。

于 2012-08-23T20:23:28.403 回答