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)
);
答案 0 :(得分:1)
似乎您对rollback
的用途有错误的认识。 不用于“在整个changeSet中还原一个大事务”。用于恢复过去的架构状态。
根据Oracle documentation
Oracle数据库在任何数据之前和之后发出隐式COMMIT 定义语言(DDL)语句。
因此,在每次执行create table
语句之后,Oracle都会提交事务。
如果在执行changeSet期间发生错误,那么liquibase只能回滚失败的事务。
查看此thread
如果出现错误,Liquibase不会自动回退部署期间所做的更改。相反,它可以在您要求时将数据库回滚到先前的架构状态。在某些情况下,它可以做到这一点,而无需您明确说明如何进行回滚。
最好将Liquibase中的rollback命令视为 “撤消部署”,而不是事务回滚。
此外,请查看这篇liquibase-rollback文章,了解如何使用回滚。