1

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

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

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

4

1 回答 1

6

为什么 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实用程序从中恢复表。

于 2013-09-28T11:29:30.077 回答