【发布时间】:2021-06-22 19:16:10
【问题描述】:
我为一个问题准备了两种不同的解决方案。解决方案是指调用数据库过程的数据库触发器。我希望用户/客户能够选择他想要使用的解决方案,因为这两种解决方案都有优点和缺点。我还希望该用户能够更改解决方案。这两种解决方案是互斥的,也就是说,用户一次只能使用一种解决方案。
我有三个变更日志文件:
- master.xml - 它包含数据库架构
- soultion1.xml - 它包含解决方案 1(触发器、过程和表)
- soultion2.xml - 它包含解决方案 2(另一个触发器、另一个过程和另一个表)
如果用户知道他想要什么解决方案,这很容易。他将使用适当的解决方案文件执行 liquibase update。不幸的是,我不确定如何确保用户可以随时更改解决方案。在应用新的解决方案之前,必须删除或禁用当前应用的解决方案。通过删除或禁用解决方案,我的意思是至少删除或禁用数据库触发器(过程和表也可以删除,但没关系)。用户无法执行 liquibase dropAll,因为用户不想丢失 master.xml 更改日志创建的架构中存储的任何数据。
假设用户会先选择soltion1,然后他会切换到solution2,然后他会再次切换到solution1。
我从未使用过 tag 和 rollback 命令,但我已在文档中阅读过它并有以下想法。用户首先在 master.xml 上执行 update 命令。之后,用户必须创建标签。下一个用户在 soultion1.xml 上执行 update 命令。要更改解决方案,用户必须先回滚到他的标签,然后用户在 soultion2.xml 上执行 update 命令。如果用户想再次更改为solution1,那么他必须首先回滚到标记并在soultion1.xml 上再次执行update。
我希望我的想法能正常工作,但我还没有测试过它,所以它可能不会工作。不幸的是,这个解决方案有一个很大的缺点,用户必须记住创建标签。如果用户忘记创建标签,他将遇到麻烦。用户必须计算变更集并使用 rollbackCount 命令。此外,在solutions1.xml 和solutions2.xml 文件中的sql 标记中创建触发器。恐怕回滚不能与 sql 标签一起正常工作。
有没有更好的解决方案?
【问题讨论】:
标签: liquibase