首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Liquibase回滚从不执行

Liquibase回滚从不执行
EN

Stack Overflow用户
提问于 2021-01-08 22:34:44
回答 1查看 101关注 0票数 1
代码语言:javascript
复制
<dependency>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-maven-plugin</artifactId>
  <version>3.5.3</version>
</dependency>

<dependency>
  <groupId>oracle.jdbc</groupId>
  <artifactId>ojdbc7</artifactId>
  <version>12.1.0.2.0</version>
</dependency>

我们可以成功地创建表、索引、触发器等,但是当我们第一次构建这些时,我们从脚本中得到了错误,并且回滚永远不会执行,或者至少表仍然存在。我们解决了我们的问题,并成功地让脚本工作,但希望确保回滚工作。回滚之所以没有执行,是因为我们使用<sqlfile>构建所有内容并使用<sql>删除表吗?我们遗漏了什么?

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <changeSet id="ddl_v1" author="AUTHOR_NAME" runInTransaction="true" failOnError="true">
        <sqlFile path="ddl/v1/Create_Table1_And_Relations.sql" relativeToChangelogFile="true"  splitStatements="true" endDelimiter="/"/>
        <sqlFile path="ddl/v1/Create_Table2_And_Relations.sql" relativeToChangelogFile="true" splitStatements="true" endDelimiter="/"/>
        <sqlFile path="ddl/v1/Create_Table3_And_Relations.sql" relativeToChangelogFile="true" splitStatements="true" endDelimiter="/"/>
        <sqlFile path="ddl/v1/Create_Table4_And_Relations.sql" relativeToChangelogFile="true" splitStatements="true" endDelimiter="/"/>
        <sqlFile path="ddl/v1/Create_Table5_And_Relations.sql" relativeToChangelogFile="true" splitStatements="true" endDelimiter="/"/>
        <rollback>
            <sql>DROP TABLE TABLE1;</sql>
            <sql>DROP TABLE TABLE2;</sql>
            <sql>DROP TABLE TABLE3;</sql>
            <sql>DROP TABLE TABLE4;</sql>
            <sql>DROP TABLE TABLE5;</sql>
        </rollback>
    </changeSet>

    <changeSet id="dml_v1" author="AUTHOR_NAME" runInTransaction="true" failOnError="true">
        <sqlFile path="dml/v1/Insert_TABLE1.sql" relativeToChangelogFile="true"/>
        <sqlFile path="dml/v1/Insert_TABLE5.sql" relativeToChangelogFile="true"/>
    </changeSet>

</databaseChangeLog>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-09 00:58:55

Liquibase回滚机制有点令人困惑。

如果changeSet由于某些错误而失败,则不应该执行它。所有的changeSets都是在一个事务内执行的,所以如果changeSet失败了,那么事务本身就应该回滚。这就是为什么changeSets应该尽可能是原子的,并且每个changeSet都应该有preConditions。但它与rollback标记没有任何关系。

如果您希望实际回滚到以前固定的数据库模式状态,则需要使用rollback。例如,您可以使用tag机制来固定数据库模式的状态。

为了触发回滚,您应该运行特定的liquibase rollback命令。

看看这个article about Liquibase rollbacks。它具有所有的回滚基础知识。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65630949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档