如何一次回滚多个databaseChangeLog文件

时间:2019-12-16 13:58:55

标签: liquibase rollback

我对给定的ChangeLog XML文件执行liquibase更新命令,并用tag1对其进行标记。

例如:

liquibase --driver=org.postgresql.Driver --url=... --changeLogFile=change1.xml update
liquibase --driver=org.postgresql.Driver --url=... --tag tag1

然后我用其他ChangeLog XML文件执行几个其他更新命令:

liquibase --driver=org.postgresql.Driver --url=... --changeLogFile=change2.xml update
liquibase --driver=org.postgresql.Driver --url=... --changeLogFile=change3.xml update

现在我想回滚到tag1:

liquibase --driver=org.postgresql.Driver --url=... --changeLogFile=??? rollback tag1

我应该在--ChangeLogFile中指定哪个文件?有没有一种方法可以定义多个文件? Liquibase有没有一种方法可以存储嵌入的回滚命令而无需提供更新XML?

1 个答案:

答案 0 :(得分:0)

典型的用法是只使用一个用于整个应用程序的变更日志文件,而不是从命令行使用多个变更日志文件。可能有多个变更日志,但是在这种模式下,您只有一个“主”变更日志,然后包括其他变更日志。有关某些示例,请参见https://www.liquibase.org/bestpractices.html

回滚时,liquibase需要知道实际的更改是什么,因此它可以执行其他操作来回滚。 DATABASECHANGELOG表不存储已应用的每个变更集的实际内容,它仅保留ID,作者,文件路径和校验和。它无法知道文件123778steve的{​​{1}}的变更集ID changelog.xml是创建表或alter列或其他任何内容。因此,更改日志文件必须存在,才能回滚。

对于某些更改类型,例如“创建表”,Liquibase可以“自动”为您生成回滚-只是“删除表”。但是,如果更改类似于“删除表”,则它无法生成回退-drop table命令仅具有要删除的表的名称,并且不知道该表中有哪些列,等等。

这就是为什么Liquibase要求您始终提供一个changelog文件的原因,并且如果您希望能够进行回滚,则可能还需要指定如何回滚每个更改。