有没有类似于提交 DDL 的东西?
Posted
技术标签:
【中文标题】有没有类似于提交 DDL 的东西?【英文标题】:Is there something similar to commit for DDL? 【发布时间】:2013-09-28 10:05:48 【问题描述】:当我想更新、删除、插入时,我需要提交。这在大多数情况下很有帮助,我可能会更新错误信息或错误删除某些内容,我可以撤消这些操作。
删除列时,我不需要提交。是否有类似回滚(不是闪回)的东西,它可以让我快速撤消我的更改?即使经过长时间的分析,删除列也可能会损坏表(pk、fk)。
为什么 Oracle 为 DML 提供了提交,而不为 DDL 提供了提交?
【问题讨论】:
为什么不闪回?这就是它的用途之一。 @Mat flashback 将在 table 上执行某些 ddl 的情况下不起作用 @beherenow:闪回数据库将。 @Mat 是的,但它基本上是从备份中恢复,不是吗? @beherenow:不过速度更快。 【参考方案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 文件),请使用 imp
或 impdp
实用程序从其中恢复表。
【讨论】:
以上是关于有没有类似于提交 DDL 的东西?的主要内容,如果未能解决你的问题,请参考以下文章
DDL 语句总是给你一个隐式提交,还是你能得到一个隐式回滚?