我在我的项目中使用Liquibase,并且需要在每次Liquibase更新后始终执行一个程序......
目前, changeSet 如下所示:
<changeSet id="liquibase-0" author="liquibase" runAlways="true">
<sqlFile relativeToChangelogFile="true" path="procedure/owner-changer.sql"/>
</changeSet>
如何确保此 changeSet 将作为上次更新操作运行?
THKS
答案 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也是一样。
我的需要是始终在所有更新结束时始终执行一个脚本。
我不知道这怎么可能。