当前位置: 首页 > 知识库问答 >
问题:

生成liquibase的可能性:diff和回滚

柴衡
2023-03-14

Liquibase在Java世界中类似于EntityFramework(EF)。并且liquibase: diff=Add-迁移EF中。但问题是liquibase: diff只生成变更日志,但没有回滚。有可能在回滚的同时生成差异吗?

我试着用liquibase:rollback创建回滚脚本。但它并不能在所有情况下都生成回滚脚本,例如,当我删除了一个带有更改集的列,然后想要回滚时。设置或运行时出错

Liquibase: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.DropColumnChange created -> [Help 1]

共有1个答案

田信然
2023-03-14

Liquibase的作者Nathan Voxland在这里回答了你的问题:http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html

简而言之,由diff生成的一些更改本身是有问题的,直到了解更改目的的合格开发人员进行审查。回滚甚至更复杂,因此在大多数情况下留给开发人员。

正如Jens在对您的问题的评论中提到的,您生成的一些更改可以自动回滚(相对安全)。然而,其他人不会那么好地工作。

如果有没有自动回滚方式的变更集,您需要在变更集中编写自己的回滚。例如,如果您删除了一个列,那么变更集本身就没有足够的信息来重新创建该列和所有数据。反转脚本可能看起来像“ALTER TABLE Z;UPDATE TABLE Z SET A=;”

鉴于对源系统和目标系统的了解,虽然diff可能会创建“更多”回滚(例如,在编写“DROP column”变更集并注入自定义“rollback”部分时从“旧版本”中提取列数据类型),但它最终会产生虚假安全感,使其达到不需要的程度。

 类似资料: