如果 liquibase 已经存在索引,如何重新创建索引
how to recreate an index if it already exists with 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>?
理想情况下,如果现有索引存在则删除一个先决条件,以便可以重新创建它,但我认为这是不可能的。
处理这种情况的最佳方法是什么?
我想到的替代解决方案是有一个单独的变更集 "if index v1 exists, drop it" 然后有一个单独的 v2 变更集,但那样会使回滚变得困难。
我意识到 运行 变更集的变更条件使回滚变得困难,但在这种情况下我唯一关心的回滚是进出空数据库,尽管这种模式很容易适应也欢迎回滚到以前的版本。
您可以根据先决条件执行变更集。您的变更集可能如下所示:
<changeSet>
<preConditions onFail="MARK_RAN">
<indexExists indexName="NC-U-y" />
</preConditions>
<dropIndex indexName="NC-U-y" />
</changeSet>
我有一个变更集来创建索引。
<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>?
理想情况下,如果现有索引存在则删除一个先决条件,以便可以重新创建它,但我认为这是不可能的。
处理这种情况的最佳方法是什么?
我想到的替代解决方案是有一个单独的变更集 "if index v1 exists, drop it" 然后有一个单独的 v2 变更集,但那样会使回滚变得困难。
我意识到 运行 变更集的变更条件使回滚变得困难,但在这种情况下我唯一关心的回滚是进出空数据库,尽管这种模式很容易适应也欢迎回滚到以前的版本。
您可以根据先决条件执行变更集。您的变更集可能如下所示:
<changeSet>
<preConditions onFail="MARK_RAN">
<indexExists indexName="NC-U-y" />
</preConditions>
<dropIndex indexName="NC-U-y" />
</changeSet>