没有前置条件的 Liquibase 变更集

Posted

技术标签:

【中文标题】没有前置条件的 Liquibase 变更集【英文标题】:Liquibase Changeset without precondition 【发布时间】:2020-05-04 07:25:21 【问题描述】:

如果我们没有在变更集中添加前置条件并运行两次会发生什么? 它会被标记为默认运行吗? 例如,这是变更集:

<changeSet id="xxx" author="kurkesh">

    <createProcedure>DO $$ BEGIN
        CREATE TYPE enum_mobile AS ENUM('android', 'ios', 'WINDOWS');
        EXCEPTION
        WHEN duplicate_object THEN null;
        END $$;
    </createProcedure>
</changeset>

【问题讨论】:

【参考方案1】:

是的,您的 changeSet 将被标记为 EXECUTED,并且不会再次执行。


当你第一次执行你的 changeSet 时,Liquibase 会在 databasechangelog 表中记下 id 为 "xxx" 的 changeSet 已成功运行。

当您第二次尝试执行此 exact 更改集时,Liquibase 将检查 databasechangelog 表。如果有changeSet“xxx”的记录(执行成功),那么这个changeSet会被忽略,不会第二次执行。

但忽略前置条件不是一个好主意。有一天,有人会编写另一个基本相同的 changeSet,而您的应用程序将失败,因为您不能两次创建相同的枚举。

有关 Liquibase 如何存储有关已执行变更集的数据的更多信息,请查看question。

【讨论】:

以上是关于没有前置条件的 Liquibase 变更集的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase Java,变更集不适用

liquibase - 变更集的执行顺序

使用带有 liquibase 变更集上下文属性的 Spring Boot 配置文件来管理变更集范围

如何从数据库中删除最后执行的 liquibase 变更集

如何为 liquibase 变更集设置超时?

Liquibase 前置条件的 Groovy 语法是啥?