【问题标题】:Is there something similar to commit for DDL?有没有类似于提交 DDL 的东西?
【发布时间】:2013-09-28 10:05:48
【问题描述】:

当我想更新、删除、插入时,我需要提交。这在大多数情况下很有帮助,我可能会更新错误信息或错误删除某些内容,我可以撤消这些操作。

删除列时,我不需要提交。是否有类似回滚(不是闪回)的东西,它可以让我快速撤消我的更改?即使经过长时间的分析,删除列也可能会损坏表(pk、fk)。

为什么 Oracle 为 DML 提供了提交,而不为 DDL 提供了提交?

【问题讨论】:

  • 为什么不闪回?这就是它的用途之一。
  • @Mat flashback 将在 table 上执行某些 ddl 的情况下不起作用
  • @beherenow:闪回数据库将。
  • @Mat 是的,但它基本上是从备份中恢复,不是吗?
  • @beherenow:不过速度更快。

标签: oracle rollback ddl


【解决方案1】:

为什么 Oracle 为 DML 提供了提交,而不为 DDL 提供了提交?

当您发出 DDL 语句时,您基本上是针对 Oracle 数据字典启动一个事务,并且该事务为了消除任何开销,必须尽可能短并尽快生效。因此,DDL 语句会在 DDL 语句之前和之后(或回滚,如果出现问题)语句之后进行双重提交。这种行为使 Oracle 的 DDL 不是事务性 DDL,您不能显式提交或回滚它。就是这样。

话虽如此,如果你删除了一张表,那么从 10g 及以上开始,你可以使用flashback table 技术在一个语句中将其取回,因为 Oracle 在你发出 drop table 语句后不会删除它,而是放入回收站:

flashback table <<table_name>> to before drop

很遗憾,您不能使用闪回表来恢复表中删除的列,因为删除的列不会被放入回收站。您必须对整个数据库或单个表空间执行时间点恢复,或者如果有逻辑备份(*.dmp 文件),请使用 impimpdp 实用程序从其中恢复表。

【讨论】:

    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多