Liquibase:如何 运行 始终将变更集作为最后更新操作

Liquibase: how to run always a changeset as the last update operation

我在我的项目中使用 Liquibase,每次 Liquibase 更新后都需要执行一个过程...

目前,changeSet 看起来像这样:

<changeSet id="liquibase-0" author="liquibase" runAlways="true">
   <sqlFile relativeToChangelogFile="true" path="procedure/owner-changer.sql"/>
</changeSet>

如何确保此 changeSet 将 运行 作为最后一次更新操作?

感谢

我会通过将变更集分成两个文件来做到这一点:一个包含您的 "regular" 变更集,另一个仅包含一个变更集。然后创建一个新的 "master" 变更集,以正确的顺序包含两者:

<databaseChangeLog>

  <include file="standard_changes.xml" relativeToChangelogFile="true"/>
  <include file="change_owner.xml" relativeToChangelogFile="true"/>

</databaseChangeLog>

change_owner.xml 仅包含您在问题中显示的单个变更集。

这并不保证它总是运行最后,因为您仍然可以运行以不同的顺序手动更改设置,但是如果您总是 运行 master.xml 然后你可以确定 "change owner" 最后执行。

理论上,您可以为 "master" 更新日志指定与当前文件相同的名称。但是由于文件名是变更集 "signature" 的一部分,如果您已经通过现有文件部署了变更,我不会这样做。

从 Liquibase 3.5.0 开始,有新的 runOrder 属性可用,有两个可能的值:firstlast。 运行 更改设置为最后一个的示例:

<changeSet id="123" author="author0" runAlways="true" runOrder="last">
    <sql> ... </sql>
</changeSet>

文档中尚未对其进行描述。发行说明:http://www.liquibase.org/2016/04/liquibase-3-5-0-released.html

我正在尝试将 runOrder="last"tagDatabase 和 liquibase updateToTag[=27= 一起使用] 命令,但我无法让它工作。

我有类似的东西:

    <changeSet id="0" author="XX" runAlways="true" runOrder="last">

    <changeSet id="1" ...
    <changeSet id="X.X" author="XX">
        <tagDatabase tag="1.0.0"/>
    </changeSet>

    <changeSet id="2" ...
    <changeSet id="X.X" author="XX">
        <tagDatabase tag="2.0.0"/>
    </changeSet>

    <changeSet id="3" ...
    <changeSet id="X.X" author="XX">
        <tagDatabase tag="3.0.0"/>
    </changeSet>

当我使用 updateToTag 命令时,永远不会执行 changeSet 0,我认为 runOrder 属性毕竟是 tagDatabase 所以它永远不会被执行。 拆分更改日志和使用 include 时是一样的。

我的需求是始终在所有更新结束时执行脚本。

我不知道怎么可能。