没有前提条件的 Liquibase 变更集

Liquibase Changeset without precondition

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

<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>

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


当您第一次执行您的 changeSet 时,Liquibase 在 databasechangelog table 中记录了 ID 为 "xxx" 的 changeSet 已成功 运行。

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

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

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