【问题标题】:Rollback is not working in liquibase changeset回滚在 liquibase 变更集中不起作用
【发布时间】:2020-04-10 04:56:16
【问题描述】:

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

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

【问题讨论】:

    标签: database liquibase rollback


    【解决方案1】:

    在使用 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. 回滚标签
    2. 回滚计数
    3. 回滚日期

      回滚到标签

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2016-05-29
      • 2014-04-24
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多