我放弃了一张桌子并尝试回滚,但没有用。它会像这样工作还是我在这里玩错了?
从大多数评论中我都清楚DDL语句不能通过回滚来撤消,而只能通过FLASHBACK撤消。
我试过撤消 从学生中删除;
它仍然无法撤消:
我的执行顺序是
INSERT,
DELETE FROM,
ROLLBACK。
答案 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
操作时,您的事务就会开始。因此,当您发出ROLLBACK
时,您正在回滚INSERT
和DELETE
,这样您就可以回到表中没有数据(假设您没有数据)。如果您在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)
答案 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
提交后我们无法回滚。