【问题标题】:Liquibase: how to run always a changeset as the last update operationLiquibase:如何始终将变更集作为最后一次更新操作运行
【发布时间】:2021-07-02 19:59:41
【问题描述】:

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

目前,changeSet 看起来像这样:

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

我怎样才能确保这个 changeSet 将作为最后一次更新操作运行?

感谢

【问题讨论】:

    标签: liquibase


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 这是我认为的解决方案,但正如您所说,不能保证最后运行...
      • @gudepier 这是最接近自动化的方法。毕竟,无论如何您都无法阻止任何人手动运行 SQL 脚本。但是使用包含机制,您至少可以确保您的标准部署过程以正确的顺序执行所有操作
      【解决方案3】:

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

      我有类似的东西:

          <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 所以它永远不会被执行。 拆分更改日志和使用包含时也是如此。

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

      我不知道怎么可能。

      【讨论】:

        猜你喜欢
        • 2021-11-19
        • 1970-01-01
        • 2017-09-17
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多