2012-08-23 131 views
1

我们正在为使用java和oracle 11g的客户开发基于Web的解决方案。该项目是为客户安装的,但其大部分功能正在开发中。每个月,我们都会发布一个应该安装在客户现场的新版本。问题在于,在每个版本中,数据库中有很多更改(表,视图,SP,触发器等)。我无法从开发线获得转储,并将其转移到客户现场。如何生成从旧数据库迁移到新数据库的SQL脚本?

的问题是我怎么能生成SQL脚本,可以在客户数据库的架构迁移到新的版本(开发版)?是否有任何自动生成此脚本的工具?有什么可以做到这一点在Java中的开源代码?这个问题的任何最佳实践?

编辑

根据答案,似乎是最好的做法就是从DB计划的直接变化禁止开发者,他们应该编写和提交修改脚本,每个数据库的更新。但是使用这种方法,过了一段时间后,会存在很多更改脚本,每个脚本都会在数据库中进行特定的更新。那我如何管理这些大量的脚本呢?

+0

我认为工具存在,但我不知道任何名称。但是,管理它的方式通常是使用VCS来保存SQL脚本的历史记录,这些脚本将在给定版本的软件之间轻松管理修改。例如一个从头开始构建数据库的creation.sql脚本。另一个涉及修改。因此,当您第一次提交projet时,客户端将使用creation.sql文件,否则将使用update-1.2.1.sql(例如:)希望这将有助于下次使用。问候。 – 2012-08-23 16:40:09

回答

4

简短的回答是,鉴于事务的你所描述的状态,你在是拿出你的以前的版本,你的下一个版本之间的一个点,以点迁移脚本以良好的工作位。

数据库差异工具确实存在,但有一个在概念的一般缺陷本博客文章最好的描述:

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

TL; DR:一个diff工具无法确定具体的变化的背景下。例如,如果在你的发展过程中,你在列名称更正拼写错误,你想在现有的数据库上使用重列命令,为了保持该表已经持有的任何数据。数据库比较工具只能看到新模式中不存在的旧列,以及旧模式中不存在的新列。因此,该工具会删除旧列,然后添加新列,但因此原来在该列中的所有数据现在都消失了。

我会建议积极跟踪数据库的变化,当您去作为最佳实践。较新的Web框架(如Django和Ruby on Rails)支持开箱即用的迁移跟踪,但Java世界中也存在开源解决方案,如Liquibase(上面的链接)。我现在的公司使用Liquibase,到目前为止,这些迁移成本已经大大降低。我们在通过您现在面对的这种迁移之后进行了切换。

祝你好运!

+0

好点。谢谢。 : - ) – hsalimi

+0

+1为Liquibase –

2

数据库更改只能通过你把源代码控制脚本进行。如果你这样做,那么你就不会有很多问题知道要转移到Qa然后再转向。此外,脚本已经过测试,与最终创建脚本并在产品上首次运行脚本不同。此外,如果某些更改适用于不同的项目,那么当它们未准备就绪时,它们将不会意外投入生产,因为它们将位于源控件的不同分支中。 SQL代码是代码,应该像源代码控制一样对待所有其他代码。

+0

但使用你的方法,过了一段时间,会有很多更改脚本,每个脚本都在我的数据库中进行特定更新。我怎么才能管理这些大量的脚本? – hsalimi

相关问题