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

gud*_*ier 6 liquibase

我在项目上使用Liquibase,并且每次更新Liquibase后都需要始终执行一个过程...

当前,changeSet如下所示:

<changeSet id="liquibase-0" author="liquibase" runAlways="true">
   <sqlFile relativeToChangelogFile="true" path="procedure/owner-changer.sql"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

小智 9

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

<changeSet id="123" author="author0" runAlways="true" runOrder="last">
    <sql> ... </sql>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

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


a_h*_*ame 5

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

<databaseChangeLog>

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

</databaseChangeLog>
Run Code Online (Sandbox Code Playgroud)

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

这并不能保证它总是最后运行,因为您仍然可以以不同的顺序手动运行两个变更集,但是如果您总是运行master.xml那么您可以确保“变更所有者”最后执行。

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