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

标签 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 变更集,但这会使回滚变得困难。

我意识到变更集的变更条件运行使回滚变得困难,但在这种情况下我唯一关心的回滚是往返于空数据库,尽管也欢迎使用易于回滚到先前版本的模式。

最佳答案

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

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

另见 Liquibase Documentation .

关于liquibase - 如果 liquibase 已经存在,如何重新创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32984784/

相关文章:

maven - 在 Maven 中使用 Liquibase 扩展

java - Liquibase:组织变更日志的最佳实践

java - H2 - Oracle - liquibase - org.h2.jdbc.JdbcSQLException : Table "all_sequences" not found;

liquibase - "Waiting for change log lock..."在 liquibase 中,而 databasechangeloglock 为空

postgresql - Liquibase 无法使用 @ 和 ! 对用户进行身份验证在密码中

mysql - 是否有 JDBC w/liquibase 和 MySQL session 变量和客户端 SQL 指令的解决方法

postgresql - 以liquibase格式从数据库导出数据

spring-boot - Spring Boot 3升级后找不到changelog目录

grails - grails数据库迁移插件-如何有条件地插入行

postgresql - 添加主键更改列类型