Liquibase回滚在Sprintboot 2.0中不起作用

时间:2019-10-06 14:22:04

标签: liquibase liquibase-sql

liquibase回滚如何与springboot应用程序一起使用?感谢您的投入。

这是我尝试过的-我正在变更集中的Oracle中创建TableA和TableB。

TableB已存在于数据库中,我希望liquibase回滚TableA,因为在创建TableB时变更集失败,但是liquibase创建TableA并因以下错误而失败,并且从不执​​行回滚块,这很奇怪:

Caused by: liquibase.exception.DatabaseException: ORA-00955: name is already used by an existing object

Liquibase配置:

<changeSet id="rollback" author="test_user">
<validCheckSum>any</validCheckSum>

    <sqlFile path="db/changelog/changes/DML/ddl.sql"/>
    <sqlFile path="db/changelog/changes/DML/ddl.sql"/>

    <rollback> drop table TABLEA;</rollback>
    <rollback> drop table TABLEB;</rollback>
</changeSet>

ddl.sql

CREATE TABLE TABLEA
    (
        TEST_COL       VARCHAR2(100)
    );

    dml.sql 

    CREATE TABLE TABLEB
    (
        TEST_COL       VARCHAR2(100)
    );

1 个答案:

答案 0 :(得分:1)

似乎您对rollback的用途有错误的认识。 用于“在整个changeSet中还原一个大事务”。用于恢复过去的架构状态。

根据Oracle documentation

  

Oracle数据库在任何数据之前和之后发出隐式COMMIT   定义语言(DDL)语句。

因此,在每次执行create table语句之后,Oracle都会提交事务。

如果在执行changeSet期间发生错误,那么liquibase只能回滚失败的事务。

查看此thread

  如果出现错误,

Liquibase不会自动回退部署期间所做的更改。相反,它可以在您要求时将数据库回滚到先前的架构状态。在某些情况下,它可以做到这一点,而无需您明确说明如何进行回滚。

     

最好将Liquibase中的rollback命令视为   “撤消部署”,而不是事务回滚。

此外,请查看这篇liquibase-rollback文章,了解如何使用回滚。