我使用这些脚本进行回滚测试。但是我的数据库没有任何反应,回滚不起作用。它仍然可以插入。请帮助我!
<changeSet author="me" id="123123">
<sql>
INSERT INTO employee (id, name) VALUES ('adad', 'test')
</sql>
<rollback/>
</changeSet>
如果无法/不需要回滚,则定义为空的回滚标签。
为了进行回滚,您应该为回滚编写sql:
<changeSet author="me" id="123123">
<sql>
INSERT INTO EMPLOYEE (id, name) VALUES ('adad', 'test')
</sql>
<rollback>
DELETE FROM EMPLOYEE WHERE ID = 'adad'
</rollback>
</changeSet>
您可以查看更多示例here
使用liquibase脚本时,了解回滚的概念很重要,因为这可能会被滥用。
Liquibase迁移类别
Liquibase操作分为两类,导致生成不同的回滚语句:
自动,迁移可以确定地生成回滚所需的步骤手册,我们需要发出回滚命令,因为迁移指令不能用于确定性地确定语句例如,“ create table
”语句的回滚将是“ drop
”创建的表。毫无疑问,这可以确定,因此可以自动生成rollback语句。
另一方面,无法确定“ drop table
”命令的回退语句。无法确定表的最后状态,因此无法自动生成rollback语句。这些类型的迁移语句需要手动回滚说明。
这里是上述陈述的一个例子
<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
这将执行变更集的回退段,并且应还原在更新阶段完成的任务。但是,如果仅发出此命令,构建将失败。
原因是–我们没有指定回滚的限制;回滚到初始阶段将完全清除数据库。因此,必须定义以下三个约束之一来限制满足条件时的回滚操作:
rollbackDate
回滚到标签
] >>我们可以将数据库的特定状态定义为标签。因此,我们可以参考该状态。回滚到标签名称“ 1.0”,如下所示:
mvn liquibase:rollback -Dliquibase.rollbackTag=1.0
这将执行在标记“ 1.0”之后执行的所有变更集的回滚语句。
按计数回滚
在这里,我们定义需要回滚多少变更集。如果我们将其定义为一个,则将回滚最后一个变更集执行:
mvn liquibase:rollback -Dliquibase.rollbackCount=1
回滚到日期
我们可以将回滚目标设置为日期,因此,在该天之后执行的任何变更集将被回滚:
mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"
日期格式必须为ISO数据格式,或者应与执行平台的DateFormat.getDateInstance()的值匹配。
此外,您可以在其他sql文件中提及该sql,并可以在此处提供参考。