【问题标题】:How to change between two mutually exclusive changelogs?如何在两个互斥的更改日志之间进行更改?
【发布时间】:2021-06-22 19:16:10
【问题描述】:

我为一个问题准备了两种不同的解决方案。解决方案是指调用数据库过程的数据库触发器。我希望用户/客户能够选择他想要使用的解决方案,因为这两种解决方案都有优点和缺点。我还希望该用户能够更改解决方案。这两种解决方案是互斥的,也就是说,用户一次只能使用一种解决方案。

我有三个变更日志文件:

  1. master.xml - 它包含数据库架构
  2. soultion1.xml - 它包含解决方案 1(触发器、过程和表)
  3. soultion2.xml - 它包含解决方案 2(另一个触发器、另一个过程和另一个表)

如果用户知道他想要什么解决方案,这很容易。他将使用适当的解决方案文件执行 liquibase update。不幸的是,我不确定如何确保用户可以随时更改解决方案。在应用新的解决方案之前,必须删除或禁用当前应用的解决方案。通过删除或禁用解决方案,我的意思是至少删除或禁用数据库触发器(过程和表也可以删除,但没关系)。用户无法执行 liquibase dropAll,因为用户不想丢失 master.xml 更改日志创建的架构中存储的任何数据。

假设用户会先选择soltion1,然后他会切换到solution2,然后他会再次切换到solution1。

我从未使用过 tagrollback 命令,但我已在文档中阅读过它并有以下想法。用户首先在 master.xml 上执行 update 命令。之后,用户必须创建标签。下一个用户在 soultion1.xml 上执行 update 命令。要更改解决方案,用户必须先回滚到他的标签,然后用户在 soultion2.xml 上执行 update 命令。如果用户想再次更改为solution1,那么他必须首先回滚到标记并在soultion1.xml 上再次执行update

我希望我的想法能正常工作,但我还没有测试过它,所以它可能不会工作。不幸的是,这个解决方案有一个很大的缺点,用户必须记住创建标签。如果用户忘记创建标签,他将遇到麻烦。用户必须计算变更集并使用 rollbackCount 命令。此外,在solutions1.xml 和solutions2.xml 文件中的sql 标记中创建触发器。恐怕回滚不能与 sql 标签一起正常工作。

有没有更好的解决方案?

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    我认为您描述的解决方案会起作用。

    为了不忘记创建标签,您可以向每个使用“tagDatabase”更改类型的 solution.xml 添加更改集。然后在 Liquibase 更新命令期间创建标签。

    https://docs.liquibase.com/change-types/community/tag-database.html

    由于您是通过自定义 sql 创建触发器,因此您需要在回滚块中通过自定义 sql 为这些触发器提供回滚 sql。请参阅此处的“回滚标签”部分:

    https://docs.liquibase.com/concepts/basic/changeset.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      相关资源
      最近更新 更多