【问题标题】:rolling back ddl changes on oracle using flyway使用 flyway 在 oracle 上回滚 ddl 更改
【发布时间】: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 文件中都没有做一些事情,因为有很多文件和很多同事正在处理这个问题(有人可能会忘记在他的文件中添加语句)。

标签: oracle flyway


【解决方案1】:

还有其他方法吗?

由于 flyway 只是运行迁移文件,您可以将匿名 PL SQL 块放入其中。通过一些努力,这些可以用于通过 PL SQL 异常来管理错误,以撤消所有先前的步骤。如果您要操作多个列,则每列可能需要位于单独的文件中,或者所有列都需要回滚。

单列的伪代码:

declare
begin
    -- alter table add new column
    exception when others then
        dbms_output.put_line('Exception adding new column');
        -- nothing to rollback as failed on first step
    end;      

    -- update copy data to new column
    exception when others then
        dbms_output.put_line('Exception when populating new column');
        -- delete any data in new column if committed in blocks
        -- drop new column
    end;      

    -- drop old column
    exception when others then
        dbms_output.put_line('Exception when dropping old column');
        -- ? not sure if you can rollback a failed drop column
        -- delete any data in new column if committed in blocks
        -- drop new column
    end;      

end;
/

如您所见,这有点费力。您可能需要进一步解释为什么您希望避免与同事使用多个 sql 文件以及这是否只影响数据库?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2015-10-28
    • 2011-06-24
    • 2019-10-29
    • 2020-09-09
    • 2018-02-24
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多