回滚命令不起作用 - Oracle

时间:2012-01-20 13:18:54

标签: oracle oracle11g sqlplus rollback dml

我放弃了一张桌子并尝试回滚,但没有用。它会像这样工作还是我在这里玩错了?

从大多数评论中我都清楚DDL语句不能通过回滚来撤消,而只能通过FLASHBACK撤消。

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

它仍然无法撤消:

我的执行顺序是

  • INSERT,

  • DELETE FROM,

  • ROLLBACK。

8 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

没有保存点限定符的

ROLLBACK将回滚整个当前事务。

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

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

  • INSERT
  • DELETE
  • ROLLBACK

执行INSERT操作时,您的事务就会开始。因此,当您发出ROLLBACK时,您正在回滚INSERTDELETE,这样您就可以回到表中没有数据(假设您没有数据)。如果您在COMMIT之后INSERT,则下一个交易将以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

答案 3 :(得分:3)

来自documentation

  

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

回滚:

使用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

提交后我们无法回滚。