Liquibase 回滚从不执行

Liquibase rollback never executes

<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> 删除表吗?我们缺少什么?

<?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>

Liquibase 回滚机制有点混乱。

如果 changeSet 因某些错误而失败,则不应执行它。 所有的变更集都在一个事务中执行,所以如果变更集失败,那么事务应该回滚自己。这就是为什么 changeSet 应该尽可能原子化并且每个 changeSet 应该有 preConditions。但它与rollback标签无关。

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

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

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