回滚不适用于liquibase变更集

问题描述 投票:1回答:2

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

<changeSet author="me" id="123123">
    <sql>
        INSERT INTO employee (id, name) VALUES ('adad', 'test')
    </sql>
    <rollback/>
</changeSet>
database liquibase rollback
2个回答
0
投票

如果无法/不需要回滚,则定义为空的回滚标签。

为了进行回滚,您应该为回滚编写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


0
投票

使用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

这将执行变更集的回退段,并且应还原在更新阶段完成的任务。但是,如果仅发出此命令,构建将失败。

原因是–我们没有指定回滚的限制;回滚到初始阶段将完全清除数据库。因此,必须定义以下三个约束之一来限制满足条件时的回滚操作:

  1. rollbackTag
  2. rollbackCount
  3. rollbackDate

    回滚到标签

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

© www.soinside.com 2019 - 2024. All rights reserved.