在使用 liquibase 脚本时了解回滚的概念很重要,因为这可能会被滥用。
Liquibase 迁移的类别
Liquibase 操作分为两类,导致产生不同的回滚语句:
自动,迁移可以确定性地生成回滚所需的步骤
手册,我们需要发出回滚命令,因为迁移指令不能用于确定性地识别语句
例如,“create table”语句的回滚将是“drop”创建的表。这可以毫无疑问地确定,因此可以自动生成回滚语句。
另一方面,无法确定“drop table”命令的回滚语句。无法确定表的最后状态,因此无法自动生成回滚语句。这些类型的迁移语句需要手动回滚指令。
这是上述陈述的一个例子
<changeSet id="testRollback" author="stackoverflow">
<createTable tableName="stackoverflow_turorial">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
<column name="author" type="varchar(36)"/>
</createTable>
<rollback>
<dropTable tableName="stackoverflow_test"/>
</rollback>
</changeSet>
所以在你的情况下,回滚不能保持为空,应该给出一些声明。
让我们更正您的代码。
<changeSet author="me" id="123123">
<sql>INSERT INTO EMPLOYEE (id, name) VALUES ('adad', 'test')</sql>
<rollback>DELETE FROM EMPLOYEE WHERE ID = 'adad'</rollback>
</changeSet>
我们可以使用以下命令运行迁移:
mvn liquibase:update
执行后我们可以回滚操作:
mvn liquibase:rollback
这将执行变更集的回滚段,并应恢复在更新阶段完成的任务。但是如果我们单独发出这个命令,构建就会失败。
原因是——我们没有指定回滚的限制;回滚到初始阶段,数据库将被彻底清除。因此,必须定义以下三个约束之一来限制满足条件时的回滚操作:
- 回滚标签
- 回滚计数
-
回滚日期
回滚到标签
我们可以将数据库的特定状态定义为标签。因此,我们可以参考该状态。回滚到标签名称“1.0”看起来像:
mvn liquibase:rollback -Dliquibase.rollbackTag=1.0
这将执行标记“1.0”之后执行的所有变更集的回滚语句。
按计数回滚
在这里,我们定义了需要回滚多少变更集。如果我们将其定义为 1,则最后一次执行的变更集将被回滚:
mvn liquibase:rollback -Dliquibase.rollbackCount=1
回滚到日期
我们可以将回滚目标设置为日期,因此,在该日期之后执行的任何变更集都将回滚:
mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"
日期格式必须是 ISO 数据格式或应与执行平台的 DateFormat.getDateInstance() 的值匹配。
你也可以在不同的sql文件中提及sql,并可以在这里给出参考。