2015-08-31 46 views
1

我們一直在我們的webapp中使用liquibase 3.0.8一段時間,數據庫更新由Spring-liquibase bean在應用程序啓動時應用。 我們決定通過3.1,3.1.1,3.2.0和3.2.3逐步更新我們的開發數據庫,​​此時更新失敗並出現校驗和驗證錯誤。我們嘗試恢復到3.2.0,但得到一組不同的校驗和錯誤。 我也試過(在寫作時當前版本)從3.0.8直接去3.4.1,並得到同樣的校驗和錯誤,liquibase changeset onupdating 3.2.3

我明白從liquibase發行說明,有一個錯誤在3.2 .0計算出的校驗和不正確,但我沒有選擇在生產數據庫中將受影響的校驗和設置爲NULL,因爲我們的webapp部署在我們無權訪問的客戶服務器上。

下面是一個更改集的示例,其校驗和在將liquibase更新爲晚於3.2.0的任何版本時失敗。

<changeSet author="xxxxx" id="16042015"> 
<preConditions onFail="MARK_RAN"> 
<sqlCheck expectedResult="0">select count(*) from Organisation</sqlCheck> 
</preConditions> 
<comment>Add Organisation table</comment> 
<loadData tableName="Organisation" file="sqlUpdates/data/organisations.csv"> 
      <column name="id" type="NUMERIC" /> 
      <column name="title" type="STRING"/> 
      <column name="approved" type="NUMERIC"/> 
</loadData> 

會在這裏欣賞到解決這個問題的最好辦法的任何建議。這裏是我們目前的想法,所有這些都有明顯的缺點:

1)我們可以創建一個新的變更集文件,在任何其他文件之前運行,包含一個變更集,在更新開始之前將所有校驗和設置爲null,以停止錯誤首先發生。這遠非理想,因爲我們不再能夠確定真的已被改變。

2)告訴客戶執行一些SQL語句,以將相關的變更集校驗和設置爲空 - 這還遠非理想,因爲我們的許多客戶不擅長MySQL,可能會搞砸了。

3)不要在所有更新liquibase,並與最新的堅持3.1版本 - 同樣不理想

謝謝! Richard

+0

什麼說的SQL:與OPTION updateSQL –

回答

2

最簡單的選擇是在問題changeSet中使用<validCheckSum>標記。這可以讓你列出基於先前版本邏輯的確定的校驗和。

+0

這聽起來很完美!謝謝。我現在就試試這個。 – otter606

+1

是的,這解決了這個問題,並且比我的任何原創想法都要好得多。 Liquibase非常棒,似乎總有一種乾淨利落的做事方式! – otter606