Liquibase在回滚时遵循的所有步骤是什么?

时间:2017-01-11 07:29:32

标签: liquibase deployit xl-deploy

我不了解使用Liquibase回滚时的详细步骤。

我有6个变更集的场景,并且没有定义一个changeSet回滚 - 也就是说,变更集中只有<rollback/>

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

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

请有专家告诉我为什么?回滚的确切行为是什么?

总体上想知道何时删除了来自Databasechangelog的记录?

2 个答案:

答案 0 :(得分:3)

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

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

但是如果在更改中没有足够的信息(比如dropTable没有重新创建表所需的信息)那么rollback命令将失败并且#34;不能回滚&#34;错误。

所以回滚逻辑是:

  1. 使用块中定义的内容
  2. 如果没有回滚阻止,请尝试推断出需要的内容
  3. 如果没有足够的信息可以回滚,请在回滚前退出
  4. 如果你指定一个空的回滚块,你要告诉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,您可以找到更多详细信息和其他链接。