如果已经存在liquibase,如何重新创建索引

时间:2015-10-07 05:58:12

标签: 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>

问题是索引的旧版本可能存在(它将存在于某些目标上(开发服务器,具有该索引的旧版本;不包括),不会存在于其他目标上(例如重新部署到空数据库。)

是否有更好的方法来解决这个问题,使脚本变得通用,而不是包含一个前缀

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

理想情况下,如果存在现有索引,则会有一个先决条件,以便可以重新创建,但我认为不能这样做。

处理这种情况的最佳方法是什么?

我想到的一个替代解决方案是单独更改“如果索引v1存在,删除它”然后有一个单独的v2更改集,但那会使回滚变得困难。

我意识到变更集的更改条件运行会使回滚变得困难,但在这种情况下我唯一关注的回滚是来自空数据库,尽管可以轻松容纳回滚到先前版本的模式将是也欢迎。

1 个答案:

答案 0 :(得分:1)

您可以根据前提条件执行更改集。您的变更集可能如下所示:

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

另请参阅Liquibase Documentation