2012-12-12 51 views
0

我最近開始研究一個由一個離開組織的開發者正在開發的分支,他看起來像是把相關的測試環境模式置於一個糟糕的狀態。liquibase可以處理部分更新的模式嗎?

有一個Liquibase更改文件,它使得代碼可以運行所需的一些更改,但看起來像關聯的模式有一些應用的更改。

我儘量不要手動更新任何模式,特別是當不是我個人的開發環境時,所以我希望能夠使現有的(相當複雜的)更改工作。

,我得到的錯誤是這樣的:

嚴重12年12月12日12:15 PM:liquibase:改變設定DB /更新日誌/ linechanges.xml :: 14 ::極限失敗。錯誤:錯誤執行SQL ALTER TABLE限制ADD ID系列:ERROR:關係 「lineitem_limitgroup」 列 「ID」 已經存在 liquibase.exception.DatabaseException:執行SQL ALTER TABLE限制ADD ID序列錯誤:錯誤:列關係的 「身份證」 「limit」已存在 at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:62) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:104) at liquibase.database.AbstractDatabase.execute (AbstractDatabase.java:1075) at liquibase.database.AbstractDatabase.executeStatements(AbstractDatabase.java:1059) at liquibase.changelog.ChangeSet.execute(ChangeSet.java:317) at liquibase.changelog.visitor.UpdateVisitor.visit (UpdateVisitor.java:27) at liquibase.changelog.Change LogIterator.run(ChangeLogIterator.java:58) 在liquibase.Liquibase.update(Liquibase.java:113) 在org.liquibase.maven.plugins.LiquibaseUpdate.doUpdate(LiquibaseUpdate.java:31) 在org.liquibase。 maven.plugins.AbstractLiquibaseUpdateMojo.performLiquibaseTask(AbstractLiquibaseUpdateMojo.java:24) 在org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute(AbstractLiquibaseMojo.java:302) 在org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager。 java:101) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)

請注意,此更改文件包含多個changeSets。當我檢查模式時,它看起來已經應用了一些changeSets的更改,但其他一些沒有應用更改。

那麼,有沒有辦法告訴liquibase(最好通過Maven插件)忽略失敗的changeSets並繼續?

或(不太有用)有沒有辦法告訴liquibase應用一些changeSets而不是其他的?

謝謝!

回答

0

Liquibase不會應用兩次更改。但是其他分支中的不同變更集可能會有一些相同(或不兼容)的更改。我認爲你別無選擇,只能手動編輯這個分支的變更集,以便它們適用於整潔。

0

我的事情你最好的選擇是使用Liquibase前提來告訴它在錯誤運行chanset但僅在列doen't存在。你將不得不使用標籤columnExists這樣的:

<preConditions> 
    <not> 
    <columnExists columnName="id" tableName="limit" schemaName="yourSchemaNameHere" /> 
    </not> 
</preConditions> 

這將標誌着該腳本運行而無需實際運行任何更新,如果你已經在極限表中的id列。

您還有其他兩種選擇:

第一個選項。您可以在觸發錯誤的變更集上將屬性failOnError設置爲false。容易出錯的變更集將運行到它們引發錯誤的程度。下一個更改集將正常運行。

請小心使用它,因爲它不會在錯誤時回滾更改集,也不會將更改集標記爲運行。還要注意,如果你已經擁有一個設置爲false的變更集,這可以解釋爲什麼你有一個部分更新。

第二個選項,在表DATABASECHANGELOG中插入一行以指示Liquibase它不必運行特定的變更集。實際上,這意味着變更集能夠成功運行,但結果是Liquibase無論如何都不會再嘗試運行它。

1

看起來您的更改集已無意中更新,因此您正在看到此問題。爲已創建的實體的模式等更改創建新的變更集,而不是更新現有的變更集,這是一種很好的做法。

說了:

在你的日誌,檢查,如果一些其它的變化集已經並稱column.Yes有辦法告訴liquibase應用一些變化,而不是其他。

一種解決方法是:由於您的文件已出現問題,因此您可以使所有以前的更改在任何正確運行的更改集下進行。由於變更集的唯一標識基於 - 作者,變更,changeSetID。由於該變更集已經運行一次,無論其內部的SQL如何,它都不會再運行。

+0

我完全同意... awesomeeee ... :) – Gyandeep

相關問題