我们正在使用java和oracle 11g为客户开发基于Web的解决方案。该项目是为客户安装的,但其大部分功能正在开发中。每个月,我们都会发布一个应该在客户站点安装的新版本。问题是在每个版本中,DB中有很多变化(表,视图,SP,触发器等)。我无法从开发线获取转储并将其转移到客户站点。
问题是如何生成可以将客户数据库架构迁移到新版本(开发版本)的SQL脚本?是否有用于生成此脚本的自动化工具? java中是否有任何开源代码可以做到这一点?这个问题的最佳做法是什么?
修改
根据答案,似乎最好的做法是禁止开发人员直接更改DB Scheme,他们应该为每个数据库更新编写并提交更改脚本。但是使用这种方法,过了一段时间,会有很多变更脚本,每个变更脚本都在DB中保存一个特定的更新。我怎样才能管理这些大量的脚本?
答案 0 :(得分: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,并且迄今为止最大限度地降低了这些迁移成本。我们现在面临这样的迁移之后,我们进行了转换。
祝你好运!答案 1 :(得分:2)
只能通过放在源代码管理中的脚本进行数据库更改。如果你这样做,那么你就不会有很多问题知道要搬到Qa然后去生产什么。此外,该脚本已经过测试,不像在最后创建脚本并在prod上第一次运行它。此外,如果对不同的项目进行了一些更改,那么当它们没有准备好时它们将不会被意外地生成,因为它们将位于源控件的不同分支中。 SQL代码是代码,它应该与源代码控制方面的所有其他代码完全一样。