0

我不明白使用 Liquibase 回滚时的详细步骤。

我有类似 6 个变更集的场景,其中一个变更集回滚未定义 - 也就是说,仅<rollback/>在变更集中。

使用 deployIT 执行后,我可以在 Databasechangelog 表中看到 7 个条目,其中 6 个用于添加,1 个用于标记创建,因为使用了 deployIT。

回滚后,我看到了删除所有新添加的 6 个变更集的行为,即使六个变更集之一有一个空的回滚标记。

请哪位高手告诉我为什么?回滚的确切行为是什么?

总体上想知道何时从 Databasechangelog 中删除记录?

4

2 回答 2

3

运行回滚时,liquibase 找到要回滚的 changeSet,然后检查<rollback>每个标签中描述如何回滚 changeSet。

如果没有<rollback>标签,则 Liquibase 会检查 changeSet 中的更改是否具有有关如何回滚的内置逻辑。就像 gile 指出的那样,如果更改中有足够的信息来撤消它(例如 createTable 更改如何具有删除表所需的表名),它仍然能够回滚它们。

但是,如果更改中没有足够的信息(例如 dropTable 没有重新创建表所需的信息),则回滚命令将失败并出现“无法回滚”错误。

所以回滚逻辑是:

  1. 使用块中定义的内容
  2. 如果没有回滚块,尝试推断需要什么
  3. 如果没有足够的信息可以回滚,请在回滚前退出

如果您指定一个空的回滚块,您是在告诉 Liquibase “回滚所需的逻辑是什么都不做”,因此 Liquibase 会愉快地运行您的无操作回滚命令并将 changeSet 标记为已回滚。

于 2017-01-11T15:27:01.700 回答
0

根据您的更改集,您可能会遇到自动生成回滚命令的语句,如Liquibase 回滚文档

许多重构例如“创建表”、“重命名列”和“添加列”都可以自动创建回滚语句。如果您的更改日志仅包含适合此类别的语句,您的回滚命令将自动生成。

其他重构如“drop table”和“insert data”没有对应的可以自动生成的回滚命令。在这些情况下,以及您想要覆盖默认生成的回滚命令的情况下,您可以通过 changeSet 标记中的标记指定回滚命令。如果您不希望执行任何操作来撤消回滚模式中的更改,请使用空标记。

http://forum.liquibase.org/topic/understanding-rollback您可以找到更多详细信息和其他链接。

于 2017-01-11T07:49:24.500 回答