回滚在 liquibase 变更集中不起作用

Rollback is not working in liquibase changeset

我使用这些脚本进行回滚测试。但是我的数据库没有任何反应,回滚不起作用。它仍然进行插入。请帮助我!

<changeSet author="me" id="123123">
    <sql>
        INSERT INTO employee (id, name) VALUES ('adad', 'test')
    </sql>
    <rollback/>
</changeSet>

在使用 liquibase 脚本时理解回滚的概念很重要,因为这可能会被滥用。

Liquibase 迁移的类别

有两类 Liquibase 操作,导致生成不同的回滚语句:

自动,其中迁移可以确定性地生成回滚所需的步骤 手动,我们需要发出回滚命令,因为迁移指令不能用于确定性地识别语句 例如,“create table”语句回滚到“drop”创建的 table。这一点可以确定无疑,因此可以自动生成回滚语句。

另一方面,无法确定“drop table”命令的回滚语句。无法确定 table 的最后状态,因此无法自动生成回滚语句。这些类型的迁移语句需要手动回滚指令。

这是上述陈述的一个例子

<changeSet id="testRollback" author="Whosebug">
    <createTable tableName="Whosebug_turorial">
        <column name="id" type="int"/>
        <column name="heading" type="varchar(36)"/>
        <column name="author" type="varchar(36)"/>
    </createTable>
    <rollback>
        <dropTable tableName="Whosebug_test"/>
    </rollback>
</changeSet>

所以在你的情况下回滚不能保持为空,应该给出一些声明。

Let's correct your code.

 <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. rollbackTag
  2. rollbackCount
  3. 回滚日期

    回滚到标记

我们可以将数据库的特定状态定义为标签。因此,我们可以参考那个状态。回滚到标签名称“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 并可以在此处提供参考。