2015-10-07 152 views
2

我有一個變更集來創建索引。如何重新創建一個索引,如果它已經與liquibase存在

<changeSet author="hilland" id="x-NC-U-y" runOnChange="true"> 
    <createIndex indexName="NC-U-y" tableName="x" unique="true"> 
     <column name="y"/> 
    </createIndex>  

    <rollback> 
     <dropIndex .../> 
    </rollback> 

    <modifySql> 
     <append value=" INCLUDE ([a],[b]) WITH (DATA_COMPRESSION=page)"/> 
    </modifySql> 
</changeSet> 

的問題是,該指數威力的舊版本存在(它會在某些目標(dev的服務器,使用老版本的指數;沒有包括),不會對他人(如新鮮部署到一個空數據庫)。

有沒有解決這個使腳本變得普遍,而不是包含一個前綴它說

<sql>IF select {sys.indexes.stuff} is not null {drop the index}</sql>? 

理想情況下,將滴的前提條件更好的辦法如果存在e xisting索引,以便它可以被重新創建,但我不認爲這是可以做到的。

處理這種情況的最佳方法是什麼?

我想到的另一種解決方案是將單獨的變化「如果索引v1存在,放下它」,然後有一個單獨的v2變更集,但那麼這將使回滾困難。

我意識到changeset的更改條件的運行會使回滾變得困難,但是在這種情況下,我唯一關心的回滾是從一個空數據庫開始並從一個空數據庫開始,儘管可輕鬆適應先前版本的回滾模式也歡迎。

回答

1

您可以根據先決條件執行變更集。您的變更集可能如下所示:

<changeSet> 
    <preConditions onFail="MARK_RAN"> 
     <indexExists name="NC-U-y" /> 
    </preConditions> 
    <dropIndex name="NC-U-y" /> 
</changeSet> 

另請參閱Liquibase Documentation

+0

2個問題在這裏; 1)如果沒有這個和已經部署的索引,我必須非常小心地從我當前的結構轉換到新的更新日誌,因爲簡單地添加這個更改集會導致它執行和刪除索引,而沒有後續的執行變更集以創建它再次執行。第二個問題,如果我想改變已經部署的索引,那麼這個變更集怎麼知道再次執行?我當前的自定義sql執行下降,如果,並且只有(如果索引存在,我即將創建它的新版本) –

相關問題