使用flyway回滚oracle上的ddl更改

使用flyway回滚oracle上的ddl更改,oracle,flyway,Oracle,Flyway,我的问题:在Oracle DB中是否有禁用DDL语句自动提交的功能 背景: 我使用Flyway 4来维护Oracle DB的状态。正如他们在报告中所说,他们无法回滚Oracle中的DDL更改,因为DDL是在该数据库中自动提交的 例如,我将一列从一个表移动到另一个表(复制现有值)。所以我希望在同一个sql文件中有一个ALTERTABLE ADD,然后是UPDATE,然后是ALTERTABLE DROP。我碰巧在DROP语句中得到一个错误,但是第一个ALTER表添加的列仍然保留在原来的位置。我也希望

我的问题:在Oracle DB中是否有禁用DDL语句自动提交的功能

背景: 我使用Flyway 4来维护Oracle DB的状态。正如他们在报告中所说,他们无法回滚Oracle中的DDL更改,因为DDL是在该数据库中自动提交的

例如,我将一列从一个表移动到另一个表(复制现有值)。所以我希望在同一个sql文件中有一个ALTERTABLE ADD,然后是UPDATE,然后是ALTERTABLE DROP。我碰巧在DROP语句中得到一个错误,但是第一个ALTER表添加的列仍然保留在原来的位置。我也希望能够回滚这种更改

我正在使用的一个解决方法是为每个DDL语句添加一个单独的sql文件。但这很难看。还有别的办法吗

还有别的办法吗

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

单列的Psuedocode:

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文件,以及这是否只会影响数据库?

我不知道为什么有人给了您否决票,但无论如何,Oracle引擎就是这样工作的。所有DDL和DCL都是自动提交的。这是许多Oracle脚本中的一个常见错误,并且由于意外,提交了它们的所有数据。在您的场景中,您希望回滚哪些操作以及在什么情况下回滚?我编辑了以下问题:如果我在ALTER TABLE DROP中遇到错误,则新列将保持添加状态。我想删除它们。如果可能的话,我希望在每个sql文件中都不做一些事情,因为有许多文件和许多同事在处理这个问题(可能会忘记在文件中添加语句)。