Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何使用一个前提条件在变更日志的所有变更集上标记“已运行”?_Xml_Liquibase_Postgresql 9.4_Preconditions - Fatal编程技术网

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

Xml 如何使用一个前提条件在变更日志的所有变更集上标记“已运行”?,xml,liquibase,postgresql-9.4,preconditions,Xml,Liquibase,Postgresql 9.4,Preconditions,我正在使用liquibase v3.6.3和postgresql v9.4 我有一个包含40多个变更集的变更日志文件。所有这些更改(包括添加表、外键等)都有一个要运行的条件,即检查特定表是否存在(例如,myTable)。如果此条件为false,即myTable已存在,则需要将所有更改标记为已执行 我可以对changelog文件的每个更改集执行以下操作,我已经测试并运行了这些更改集: <changeSet> <preConditions onFail="MARK_RAN"

我正在使用liquibase v3.6.3和postgresql v9.4

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

我可以对changelog文件的每个更改集执行以下操作,我已经测试并运行了这些更改集:

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

…找我的钱1
…找我的钱2
...
…找我的钱
问题是,我需要为每一个更改重复前提条件,重复代码很难是一种好的实践

我可以在changelog文件的末尾添加以下内容:

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

从pg_表中选择计数(1),其中TABLENAME='myTable'
这将阻止执行整个changelog文件,这是我想要的结果之一。但我还需要将更改标记为已执行,而sqlCheck不会这样做

有没有办法只添加一次带有“MARK_RAN”的前置条件,并将其应用于changelog文件中的所有更改集? 我在网上找不到这样的东西


欢迎使用其他类型的不带前置条件的解决方案,这些解决方案也会将更改标记为已执行。

这可能有点困难,但可能比将所有前置条件添加到更改日志中要好

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

将所有这些insert语句提取到单个文件中。将其称为“MarkAllMyTableRelatedAsRan.sql”,然后在第一个变更集中使用
标记运行这些插入,使用前提条件