2012-06-06 34 views
6

我正嘗試在liquibase中執行以下changeSet,它應該創建一個索引。如果指數不存在,它應該默默地失敗:Liquibase changeSet with failOnError =「false」總是會跑?

<changeSet failOnError="false" author="sys" id="1"> 
    <createIndex unique="true" indexName="key1" tableName="Table1"> 
     <column name="name" /> 
    </createIndex> 
</changeSet> 

到目前爲止,這麼好。問題是,這個changeSet沒有登錄到DATABASECHANGELOG表中,因此每次運行liquibase時都會執行它。根據液體文獻和例如來自Nathen Voxland的this answer我認爲變更集應該標記爲在DATABASECHANGELOG表中運行。相反,它根本沒有記錄,正如我之前說過的,每次liquibase運行時(每次都會失敗)。

我錯過了什麼?

(我使用MySQL作爲數據庫管理系統)

回答

3

在由Nathen Voxland給出的answer,他建議使用precondition檢查數據庫的狀態,運行變更前的更正確的做法。

在我看來,忽略失敗是一個壞主意....意味着你不能完全控制數據庫配置....「failOnError」參數允許liquibase繼續。如果實際上它不是因爲發生了錯誤,那麼構建是否會記錄一個被執行的changset不是一個壞主意?

+0

我完全和你在一起,使用前提條件在我看來也是正確的做法。畢竟,這就是我對「changeSet」所做的事情(雖然uniqueConstraintExists前提條件已經丟失,但這是另一個事實)。我只是偶然發現了我對'failOnError =「false」'屬性的期望,我問自己是否描述的行爲是一個錯誤或一個特性;) – ebi

+1

不幸的是,Oracle非空的先決條件對我不起作用,因爲檢查liquibase不支持不可空列。 –

+0

我發佈此代表[dev-null](https://stackoverflow.com/users/1436741/dev-null)發佈此評論作爲答案; _這與前面的回答中的st_jeff的評論有關(但我沒有50的評論聲望): failOnError的另一個用例:如果在oracle中刪除一個唯一約束,那麼相關索引只會被刪除它比約束更新。因此,在刪除約束之後,刪除索引語句可能會導致錯誤,具體取決於索引的年齡._ – Bugs

相關問題