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
属性可用,有两个可能的值:first
和 last
。 运行 更改设置为最后一个的示例:
<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 时是一样的。
我的需求是始终在所有更新结束时执行脚本。
我不知道怎么可能。
我在我的项目中使用 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
属性可用,有两个可能的值:first
和 last
。 运行 更改设置为最后一个的示例:
<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 时是一样的。
我的需求是始终在所有更新结束时执行脚本。
我不知道怎么可能。