【问题标题】:Rollback command not working - Oracle回滚命令不起作用 - Oracle
【发布时间】:2012-01-20 13:18:54
【问题描述】:

我删除了一个表并尝试回滚,但没有用。它会像这样工作还是我在这里玩错了?

从大多数 cmets 来看,我很清楚 DDL 语句不能通过回滚来撤消,而只能通过 FLASHBACK 来撤消。

我尝试撤消 从学生中删除;

它仍然无法撤消:

我的执行顺序是

  • 插入,

  • 删除,

  • 回滚。

【问题讨论】:

  • 请不要在问题中强推解决方案
  • @Sathya 我没有足够的声誉来回答我自己的问题。所以我在这里更新,让我的评论者知道问题已经解决,否则他们将不得不等待 8 小时,其中一些肯定已经浪费了他们的时间,然后解决了同样的问题。在否决和编辑我的答案之前,您必须考虑到这一事实。对我来说,我做了正确的事,猜猜是什么!现在,我必须从头开始写我的答案。我想我应该谢谢你!
  • @kushal 1. 上面的部分是针对问题,而不是答案。 2. downvote 是针对糟糕的格式和一开始没有详细信息的蹩脚问题 3. 您可以发表评论说您已修复/将在 8 小时或任何时间更新 4. 您的“答案”不会丢失,始终可用从以前的修订列表。 i.imgur.com/RxLCQ.pngstackoverflow.com/posts/8942034/revisions
  • @Sathya... 你真的必须阅读下面的评论流程。最初,我什至不知道我们是否可以回滚已删除的表!并感谢评论者让我清楚。为此,我最初可以提供什么细节 MR 。沙迪亚?上帝保佑你聪明的头脑先生。主持人。

标签: oracle oracle11g sqlplus rollback dml


【解决方案1】:

我不相信回滚会撤消架构更改。

【讨论】:

  • 正确。 DDL 语句在 Oracle 中无法回滚
  • @climbage 可以撤消表中删除的行吗?
  • 您能否向我们提供您使用的语句以及执行它们的确切顺序?只要您不在数据库中执行提交或执行结构更改(例如删除表),您就可以回滚数据操作(例如删除行)。回滚只会在遇到此类事件之一之前及时回退。
  • @Kosi2801 。我已经更新了我的问题,但我没有做任何事情。
  • 您的数据库客户端是否启用了自动提交?检查它是否不会在每个成功的语句后自动执行提交!
【解决方案2】:

ROLLBACK 没有保存点限定符将回滚整个当前事务。

对于 DDL 语句,当前没有要回滚的事务。 DDL 语句在语句开始之前和完成之后隐式生成COMMIT。因此,如果您在DROP 之后发出ROLLBACK,则当前事务中尚未完成任何工作,因此没有任何内容可以回滚。

对于 DML 语句,您将回滚整个当前事务。如果你这样做了

  • 插入
  • 删除
  • 回滚

您的事务在您执行INSERT 操作时开始。因此,当您发出ROLLBACK 时,您正在回滚INSERTDELETE,因此您将回到表中没有数据(假设您开始时没有数据)。如果你在INSERT 之后COMMIT,那么下一个事务将以DELETE 开始,而你的ROLLBACK 只会回滚DELETE 操作。或者,您可以在INSERT 之后声明一个保存点并回滚到该保存点

SQL> create table foo( col1 number );

Table created.

SQL> insert into foo values( 1 );

1 row created.

SQL> savepoint after_insert;

Savepoint created.

SQL> delete from foo;

1 row deleted.

SQL> rollback to savepoint after_insert;

Rollback complete.

SQL> select * from foo;

      COL1
----------
         1

【讨论】:

  • 嘿伙计,我还有一个关于丢弃表的问题,我也发布了它,但直到现在还没有找到解决方案。你能看看吗。这是链接link
【解决方案3】:

回滚不会撤消架构更改,但要撤消删除表操作,您可以检查:

http://docs.oracle.com/cd/B19306_01/backup.102/b14192/flashptr004.htm

【讨论】:

    【解决方案4】:

    来自documentation

    Oracle 数据库在每个 DDL 语句之前和之后隐式提交当前事务。

    这意味着您不能ROLLBACK DDL 语句(即架构更改)。

    【讨论】:

    • 我不确定这个答案是否对特定问题有帮助,因为它需要更多关于结构和交易概念的知识,而提问者显然还不清楚。
    • @Kosi2801@ajx 是的!这不是一个合适的答案,但信息很有帮助。
    【解决方案5】:

    回滚永远不会撤消数据定义命令,例如 drop table alter table 等。

    【讨论】:

      【解决方案6】:

      删除表会更改数据库的结构(使用 DDL 语句,如 CREATE、DROP...)。

      COMMIT 和 ROLLBACK 仅适用于使用 DML 语句(如 INSERT、UPDATE...)与数据库交换的 数据

      所以,不,它永远不会像这样工作。

      【讨论】:

        【解决方案7】:

        要回滚 ddl 更改,您需要使用 Flashback。

        【讨论】:

          【解决方案8】:

          回滚:

          使用 ROLLBACK 语句放弃所有挂起的更改。在 ROLLBACK 语句之后:

          • 数据更改已撤消。
          • 数据的先前状态已恢复。
          • 受影响行上的锁被释放。

          例子

          在尝试从 TEST 表中删除记录时,您可能会意外清空该表。您可以更正错误,重新发布正确的声明,并使数据更改永久化。

          DELETE FROM test;
          25,000 rows deleted.
          
          ROLLBACK;
          Rollback complete.
          
          DELETE FROM test
          WHERE id = 100;
          
          1 row deleted.
          
          SELECT *
          FROM test
          WHERE id = 100;
          No rows selected.
          
          COMMIT;
          Commit complete
          

          提交后我们无法回滚。

          【讨论】:

          • After giving commit we can rollback. ==> 你的意思是我们不能回滚,而是没有意义,因为事务已经关闭了。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-31
          • 1970-01-01
          • 2021-12-07
          • 2012-08-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多