【发布时间】:2017-10-22 08:15:39
【问题描述】:
我的问题:有没有办法在 Oracle DB 中禁用 DDL 语句的自动提交?
上下文: 我正在使用 Flyway 4 来维护我的 Oracle DB 的状态。正如他们在faq page 中所说,他们无法回滚 Oracle 中的 DDL 更改,因为 DDL 是在此数据库中自动提交的。
例如,我将一列从一个表移动到另一个表(复制现有值)。所以我想在同一个 sql 文件中有一个 ALTER TABLE ADD,然后是一个 UPDATE,然后是一个 ALTER TABLE DROP。我碰巧在 DROP 语句上遇到错误,但第一个 ALTER TABLE 添加的列仍然存在。我也希望能够回滚该更改。
我正在使用的一个解决方法是为每个 DDL 语句添加一个单独的 sql 文件。但这很丑陋。还有其他方法吗?
【问题讨论】:
-
我不知道为什么有人给你反对票,但无论如何,Oracle 引擎就是这样工作的。所有 DDL 和 DCL 都是自动提交的。这是许多 Oracle 脚本中的常见错误,并且不小心提交了所有数据。
-
在您的场景中,您希望在什么情况下回滚哪些操作?
-
我编辑了这个问题:如果我在 ALTER TABLE DROP 收到错误,新列仍然被添加。我想删除它们。如果可能的话,我希望在每个 sql 文件中都没有做一些事情,因为有很多文件和很多同事正在处理这个问题(有人可能会忘记在他的文件中添加语句)。