液碱 'validation only mode'

Liquibase 'validation only mode'

是否可以仅使用Liquibase来检查数据库的一致性?

我们有几个 java 应用程序模块使用同一个数据库。我们决定只有一个模块负责执行数据库迁移,而其他模块(几个批处理作业)将脚本作为依赖项包含在内。对于批处理作业模块,我们希望防止数据库模式的迁移,但我们需要确保代码库使用与数据库相同的版本。

是否可以配置 liquibase 来执行验证而不是迁移?

我们想尝试这种方法,因为同时启动的两个模块的迁移导致应用程序无法启动的冲突。

可以使用 Liquibase 进行数据库模式验证,但它并不是为此而设计的。

因此,例如,如果您想始终检查某些 table 存在与否的天气,您可以执行以下操作:

<changeSet author="author_name" id="changeset_id" runAlways="true">
    <preConditions onFail="HALT">
        <tableExists tableName="foo_bar"/>
    </preConditions>
    <comment>Table "foo_bar" exists.</comment>
</changeSet>

这个 changeSet 除了检查 foo_bar table 是否存在外什么都不做。

runAlways="true" 属性将告诉 Liquibase 在每次应用程序启动时执行 changeSet。

onFail="HALT" 如果 foo_bar table 不存在,则将抛出错误,因此如果不满足前提条件。

您可以使用 liquibase status 命令检查是否已应用变更日志中列出的所有变更集,并向其添加 --verbose 标志以查看哪些变更集尚未应用。

尽管如此,这并不能确保没有发生偏差 - 某些人肯定有可能手动更改数据库并做出导致状态命令不准确的更改。只要您通常确信架构更改始终是通过 liquibase 进行的,status 命令就足够了。