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

时间:2015-02-05 15:32:56

标签: liquibase

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

目前, changeSet 如下所示:

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

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

THKS

3 个答案:

答案 0 :(得分:3)

我会通过将变更集拆分为两个文件来完成此操作:一个包含“常规”变更集,另一个包含此单个变更集。然后创建一个新的“主”变更集,其中包含两个,顺序正确:

<databaseChangeLog>

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

</databaseChangeLog>

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

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

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

答案 1 :(得分:2)

自Liquibase 3.5.0以来,新的first属性提供了两个可能的值:last<changeSet id="123" author="author0" runAlways="true" runOrder="last"> <sql> ... </sql> </changeSet> 。将changeSet作为最后一个运行的示例:

App::call('App\Http\Controllers\SomeController@method');

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

答案 2 :(得分:0)

我正在尝试将 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 之后,所以它永远不会被执行。 拆分变更日志和使用includes也是一样。

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

我不知道这怎么可能。