<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>发布于 2021-01-09 00:58:55
Liquibase回滚机制有点令人困惑。
如果changeSet由于某些错误而失败,则不应该执行它。所有的changeSets都是在一个事务内执行的,所以如果changeSet失败了,那么事务本身就应该回滚。这就是为什么changeSets应该尽可能是原子的,并且每个changeSet都应该有preConditions。但它与rollback标记没有任何关系。
如果您希望实际回滚到以前固定的数据库模式状态,则需要使用rollback。例如,您可以使用tag机制来固定数据库模式的状态。
为了触发回滚,您应该运行特定的liquibase rollback命令。
看看这个article about Liquibase rollbacks。它具有所有的回滚基础知识。
https://stackoverflow.com/questions/65630949
复制相似问题