保存点在 Oracle 中如何工作?

mno*_*tka 1 oracle migration rollback

我正在对我的数据库进行非常严肃的操作,我想保证我的数据安全。

不幸的是出了点问题,看:

SAVEPOINT before_foo_update;

CREATE TABLE AUX_FOO as
   SELECT * FROM FOO;

TRUNCATE TABLE FOO;  

ALTER TABLE FOO
  MODIFY(BAR NUMBER(11) NOT NULL);

INSERT INTO FOO
  SELECT * FROM AUX_FOO;

DROP TABLE AUX_FOO;    

ROLLBACK TO SAVEPOINT before_foo_update;
Run Code Online (Sandbox Code Playgroud)

不幸的是,我收到一个错误:

ROLLBACK TO SAVEPOINT before_foo_update
Error report:
SQL Error: ORA-01086: savepoint 'BEFORE_FOO_UPDATE' never established
01086. 00000 -  "savepoint '%s' never established"
*Cause:    Trying to roll back to a save point that was never established
Run Code Online (Sandbox Code Playgroud)

现在 FOO 表是空的......并且 AUX_FOO 没有被删除。你知道我做错了什么吗?

Jus*_*ave 6

保存点是当前事务中的一个点。一个DDL说法像CREATE TABLETRUNCATEALTER TABLEDROP TABLE将发行前后语句运行将结束当前事务后隐式提交。当前事务结束后,您将无法再回滚到该事务中定义的保存点。

潜在地,您希望改为使用还原点。还原点是数据库的一个属性,而不是事务,因此您可以生成许多事务并仍将整个数据库还原回还原点。但是,还原到还原点会影响在定义还原点和执行还原之间对数据库所做的每项更改——您将丢失所有更改,而不仅仅是会话或您的会话所做的更改。用户,但数据库中的所有会话和用户。