-4

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

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

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

它仍然无法撤消:

我的执行顺序是

  • 插入,

  • 从中删除,

  • 回滚。

4

8 回答 8

13

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

于 2012-01-20T13:19:49.333 回答
5

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

对于 DDL 语句,当前没有要回滚的事务。COMMITDDL 语句在语句开始之前和完成之后隐式生成一个。因此,如果您发出ROLLBACK以下 a DROP,则当前事务中没有完成任何工作,因此没有什么可以回滚。

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

  • 插入
  • 删除
  • 回滚

您的交易在您执行INSERT操作时开始。因此,当您发出 时ROLLBACK,您将同时回滚 theINSERT和 the,DELETE因此您将恢复到表中没有数据(假设您开始时没有数据)。如果您COMMIT在之后,INSERT则下一个事务将以 the 开始,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
于 2012-01-20T14:40:47.367 回答
4

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

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

于 2012-01-20T13:22:47.523 回答
3

文档中:

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

这意味着您不能ROLLBACK使用 DDL 语句(即模式更改)。

于 2012-01-20T13:22:57.740 回答
1

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

于 2012-01-20T13:22:17.937 回答
0

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

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

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

于 2012-01-20T13:21:13.230 回答
0

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

于 2012-01-21T06:53:03.873 回答
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

提交提交后,我们无法回滚。

于 2012-01-21T13:47:26.580 回答