如何使用单个前提条件在变更日志的所有变更集上标记运行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用单个前提条件在变更日志的所有变更集上标记运行?相关的知识,希望对你有一定的参考价值。

我正在将liquibase v3.6.3与PostgreSQL v9.4一起使用。

我有一个包含40多个变更集的变更日志文件。所有这些更改(包括添加表,外键等)都具有一个要运行的条件,即检查是否存在特定表(例如myTable)。如果此条件为假,即myTable已经存在,则需要将所有更改标记为已执行。

我已经对经过测试并且可以正常工作的变更日志文件的每个变更集执行以下操作:

<changeSet>
    <preConditions onFail="MARK_RAN">
        <not>
            <tableExists tableName="myTable" schemaName="public"/>
        </not>
    </preConditions>
    ...my change 1
</changeSet>

<changeSet>
    <preConditions onFail="MARK_RAN">
        <not>
            <tableExists tableName="myTable" schemaName="public"/>
        </not>
    </preConditions>
    ...my change 2
</changeSet>

...

<changeSet>
    <preConditions onFail="MARK_RAN">
        <not>
            <tableExists tableName="myTable" schemaName="public"/>
        </not>
    </preConditions>
    ...my change n
</changeSet>

问题是,我需要为每个更改重复前提条件,而重复的代码几乎不是一个好习惯。

我可以改为在变更日志文件的开头添加以下内容:

<preConditions onFail="HALT">
    <sqlCheck expectedResult="0"> SELECT COUNT(1) FROM pg_tables WHERE TABLENAME = 'myTable' </sqlCheck>
</preConditions>

这将阻止整个变更日志文件被执行,这是我想要的结果之一。但是我还需要将更改标记为已执行,而sqlCheck不会执行。

是否有方法仅将"MARK_RAN"与前置条件相加一次,并将其应用于变更日志文件中的所有变更集?我在liquibase documentation上找不到类似的内容。

欢迎使用其他没有先决条件的解决方案,它们也将更改标记为已执行。

答案

这会有点hack,但可能比将所有前提条件添加到您的变更日志中更好。

首先对干净的数据库运行updateSQL命令。这将生成将应用于数据库以部署所有变更集的所有SQL。在该生成的SQL文件中,将是对DATABASECHANGELOG表的一组插入语句。

将所有这些插入语句提取到一个文件中。将其命名为“ MarkAllMyTableRelatedAsRan.sql”,然后在第一个更改集中使用<sqlFile>标记使用前提条件来运行这些插入。

以上是关于如何使用单个前提条件在变更日志的所有变更集上标记运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个 TFS 标签之间查找变更集(用于发行说明/变更日志)

如何回滚其他上下文的变更集?

没有前置条件的 Liquibase 变更集

mysql5.7主从复制--在线变更复制类型

Paxos成员组变更

TFVC变更集 - 变更集评论的历史 - 在任何地方?