我丢了一张桌子并试图回滚,但没有用。它会像这样工作还是我在这里玩错了?
从大多数评论来看,我很清楚 DDL 语句不能通过回滚来撤消,而只能通过 FLASHBACK 来撤消。
我尝试撤消从学生中删除;
它仍然无法撤消:
我的执行顺序是
插入,
从中删除,
回滚。
我不相信回滚会撤消架构更改。
ROLLBACK
没有保存点限定符将回滚整个当前事务。
对于 DDL 语句,当前没有要回滚的事务。COMMIT
DDL 语句在语句开始之前和完成之后隐式生成一个。因此,如果您发出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
回滚不会撤消架构更改,但要撤消删除表操作,您可以检查:
http://docs.oracle.com/cd/B19306_01/backup.102/b14192/flashptr004.htm
回滚永远不会撤消数据定义命令,例如 drop table alter table 等。
要回滚 ddl 更改,您需要使用 Flashback。
回滚:
使用 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
提交提交后,我们无法回滚。