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

问题描述 投票:0回答:1

我正在将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上找不到类似的内容。

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

xml liquibase postgresql-9.4 preconditions
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.