2012-08-23 84 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