我們已經使用了多年的顛覆,但現在正在轉向mercurial。自動數據庫版本控制和Mercurial(也可能是git)
我們使用的TeamCity和腳本一個漂亮的自動化數據庫版本系統。 (它是.net和msbuild和powershell,但這是無關緊要的)。 ]
我們有一個數據庫目錄,例如:
/database/
/database/functions
/database/migration
/database/storedprocedures
/database/views
的migration
文件夾中包含的東西DDL和數據修改。
源/編譯系統的工作原理是這樣:
- 開發者進行了更改存儲過程
- 開發者提交修改使用svn
- TeamCity的簽出代碼,並建立
- 數據庫遷移代腳本運行得到啓動構建版本的svn修訂版
- 腳本在數據庫目錄中執行最後一次已知版本與此版本之間的差異。對於那些在差異中的所有文件,它連接它們與文件名的文件%buildnumber%_%版本%的.sql
- 腳本把最後的「更新databaseinfo setversion =‘%buildnumber%’到FIEL
- 腳本,然後提交新的文件回顛覆
- 構建打包
然後在發佈時,或開發時間,它是物質的運行,以便瞧的SQL遷移文件,數據庫升級和遷移。
這是一個很好的系統,因爲這意味着你做了你的工作,不必擔心寫入遷移,或者注意到你的改變,沒有「對測試環境感到抱歉,我忘了寫存儲過程的遷移,等待30分鐘,我會給你一個新的版本「
但是,隨着移動到mercurial,步驟7. Script then commits this new file back into subversion
不能正常工作。
顛覆它不是一個大問題,因爲你只是犯回,從來沒有被構建系統之外修改數據庫目錄。
隨着善變(我有點新手在這裏),我們需要提交和推送這需要做一個拉和更新的變化。我可以讓這個工作沒有問題,但是它的代價是將源代碼置於無效狀態,並且只是覺得這是錯誤的做法。
我正在考慮使用mercurial內部的提交/預提交鉤子,但是隨後我們失去了構建編號版本控制,並在尋找命名約定來爲該版本的數據庫版本尋找問題,然後再次運行時我們有一個分支。
我想知道其他人在這附近做些什麼?
您是否考慮過使用liquibase?或者任何其他解決方案,如dbdeploy,這意味着您存儲*更改*而不是最實際的狀態。 – zerkms
liquibase等人致力於爲您的數據庫定義更改。從架構的角度來看,這很好,因爲您需要在某個時刻定義它們,但問題在於,如果我修改存儲過程並在本地使用它,則必須爲該存儲過程編寫遷移,然後這是我(以及我曾經工作過的每一位開發者)不斷忘記去做的事情,並且很容易陷入你的源與生產中的不匹配的情況。 – Lachmania
「我可以得到這個工作沒有問題,但它的代價是將源代碼置於無效狀態」 - 請詳細說明,我無法看到與SVN工作流程有任何區別**(其中提交額外提交意味着在開發人員的工作場所上還有'svn up') –