liquibase - Liquibase 回滚在 Sprintboot 2.0 中不起作用
问题描述
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)
);
解决方案
看起来你对它的用途有错误的认识rollback
。它不是为了“在整个变更集中恢复一个大事务”。这是为了恢复一些过去的模式状态。
根据 Oracle文档
Oracle 数据库在任何数据定义语言 (DDL) 语句之前和之后发出隐式 COMMIT。
因此,在每条create table
语句执行后,Oracle 都会提交事务。
如果在 changeSet 执行期间发生错误,liquibase 只能回滚失败的事务,它会这样做。
看看这个线程
如果出现错误,Liquibase 不会自动回滚在部署期间所做的更改。相反,它可以在您要求时将数据库回滚到以前的模式状态。在某些情况下,它可以做到这一点,而无需您明确说明如何进行回滚。
最好将 Liquibase 中的回滚命令视为“撤消部署”而不是事务回滚。
另外,查看这篇关于如何使用回滚的 liquibase-rollback文章。
推荐阅读
- docker - 将 Makefile 移植到 Jenkinsfile,但存在环境变量问题
- python - 如何用随机值刷新字典?
- sql - 有没有办法让我将这些行转换为 oracle 中的列?
- portable-executable - 如何计算导出表的内存虚拟地址的文件偏移量?
- javascript - 在 JavaScript 中,在没有默认参数的其他参数之前为某些参数定义具有默认参数的函数有什么意义?
- angular - 验证 ngx-admin Angular 项目中的表单布局
- node.js - 在上传multer之前检查存在的文件
- java - 为 React Native 客户端获取与服务器端 Java 代码类似的密文
- html - 创建一个 flexbox 导航栏,中间有一个 logo,左右列出项目
- nsis - NSIS在卸载时不删除文件