如何在两个互斥的变更日志之间进行更改?

How to change between two mutually exclusive changelogs?

我为一个问题准备了两种不同的解决方案。我所说的解决方案是指调用数据库过程的数据库触发器。我希望 user/client 能够选择他想要使用的解决方案,因为这两种解决方案各有利弊。我还希望该用户能够更改解决方案。这两种解决方案是互斥的,换句话说,用户一次只能使用一种解决方案。

我有三个更新日志文件:

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

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

假设用户首先选择解决方案1,然后他将更改为解决方案2,然后再次更改为解决方案1。

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

上再次执行 update

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

有没有更好的解决方案?

我认为您描述的解决方案可行。

为了不忘记创建标签,您可以向每个使用“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