2017-01-11 104 views
0

我不明白使用Liquibase回滾時的詳細步驟。Liquibase在回滾時所遵循的步驟是什麼?

我有像6個變更集的情況,並且對於一個changeset回滾未定義 - 也就是變更集中只有<rollback/>

使用deployIT執行後,我可以在Databasechangelog表中看到7個條目,添加了6個條目,其中一個用於由於使用deployIT而創建標籤。

回滾之後,我看到了刪除所有新添加的6個變更集的行爲,即使六個變更集中的一個具有空的回滾標記。

請高手告訴我爲什麼?回滾的確切行爲是什麼?

總想知道何時從Databasechangelog中刪除記錄?

+0

如果一個變更集不包含<回滾標記>,則liquibase回滾的預期行爲將失敗。 這個你評論的deployIT是一個使用liquibase的工具嗎?您是否嘗試使用liquibase命令執行回滾:liquibase rollbackCount 3 – kothvandir

回答

2

運行回滾時,liquibase發現changeSets回滾,然後檢查<rollback>標籤,每個標籤描述如何將changeSet回滾。

如果沒有<rollback>標籤,那麼Liquibase會檢查changeSet中的更改是否具有關於如何回滾自身的內置邏輯。就像gile指出的那樣,如果更改中有足夠的信息來撤消它(比如createTable更改具有刪除表所需的表名),它仍然可以將它們回滾。

但是,如果更改中沒有足夠的信息(如dropTable沒有重新創建表所需的信息),那麼回滾命令將失敗,並顯示「無法回滾」錯誤。

所以回滾的邏輯是:

  1. 使用什麼是塊
  2. 如果沒有回滾塊定義,試圖推斷出所需要的
  3. 如果沒有足夠的信息來回滾,如果你指定一個空的回滾塊回滾

離開前,你告訴Liquibase「滾回去此需要的邏輯是什麼都不做」,所以Liquibase順利地執行你的任何操作回滾合作命令並將changeSet標記爲回滾。

+0

如果在執行回滾後,Liquibase從databasechangeLog表中除去具有空回滾標記的變更集,不需要嚇唬儀式?它只是從表中刪除changesets條目,而不是執行任何不作爲回滾行動的腳本?儀式?非常感謝你的時間。 –

+0

是的,如果你有一個可以自動回滾的東西如createTable的空回滾,那麼數據庫更新日誌條目將被刪除,並且沒有其他更改。 –

0

根據您的變更集,可能是你在自動生成具有回滾命令語句的情況下回落,爲Liquibase Rollback documentation

許多重構,如「創建表」,「重命名列」和「添加 列「可以自動創建回滾語句。如果您的更改 日誌僅包含適合此類別的語句,則會自動生成您的 回滾命令。

其他重構如「drop table」和「insert data」沒有 對應的回滾命令可以自動生成。 在這些情況下,以及想要覆蓋默認的 生成的回滾命令的情況下,可以通過changeSet標記中的標記指定回滾命令。如果您不想在 撤消回滾模式中的任何更改,請使用空標記。

http://forum.liquibase.org/topic/understanding-rollback你可以找到更多的細節和其他鏈接。

相關問題