我不了解使用Liquibase回滚时的详细步骤。
我有6个变更集的场景,并且没有定义一个changeSet回滚 - 也就是说,变更集中只有<rollback/>
。
使用deployIT执行后,我可以在Databasechangelog表中看到7个条目,添加了6个条目,一个用于因使用deployIT而创建标记。
回滚后,我看到删除所有新添加的6个变更集的行为,即使其中一个变更集有一个空的回滚标记。
请有专家告诉我为什么?回滚的确切行为是什么?
总体上想知道何时删除了来自Databasechangelog的记录?
答案 0 :(得分:3)
当运行回滚时,liquibase找到要回滚的changeSets,然后检查每个中的<rollback>
标记,描述如何回滚changeSet。
如果没有<rollback>
标记,则Liquibase会检查changeSet中的更改是否具有关于如何自行回滚的内置逻辑。就像gile所指出的那样,如果在更改中有足够的信息来撤消它(比如createTable如何更改具有删除表所需的表名),它仍然可以将它们回滚。
但是如果在更改中没有足够的信息(比如dropTable没有重新创建表所需的信息)那么rollback命令将失败并且#34;不能回滚&#34;错误。
所以回滚逻辑是:
如果你指定一个空的回滚块,你要告诉Liquibase&#34;回滚所需的逻辑是什么都不做&#34;所以Liquibase愉快地运行你的no-op rollback命令并将changeSet标记为roll背部。
答案 1 :(得分:0)
根据您的更改集,如果语句具有自动生成的回滚命令,则可能会失败,如Liquibase Rollback documentation所示:
许多重构,例如“创建表”,“重命名列”和“添加” 列“可以自动创建回滚语句。如果你改变了 log只包含适合此类别的语句 回滚命令将自动生成。
其他重构,例如“drop table”和“insert data”都没有 可自动生成的相应回滚命令。 在这些情况下,以及您要覆盖默认值的情况 生成的回滚命令,可以通过指定回滚命令 changeSet标记中的标记。如果你不想做任何事情 撤消回滚模式的更改,使用空标记。
在http://forum.liquibase.org/topic/understanding-rollback,您可以找到更多详细信息和其他链接。