闪回删除例子:
(1)用system用户连接到数据库
SQL> conn system/oracle
已连接。
(2)创建一个新用户
SQL> create user dropper identified by dropper;
用户已创建。
SQL> grant create session,resource to dropper;
授权成功。
SQL> conn dropper/dropper
已连接。
(3)创建一个带有索引和约束的表,并插入一行:
SQL> create table names(naem varchar2(10));
表已创建。
SQL> create index name_idx on names(naem);
索引已创建。
SQL> alter table names add constraint name_u unique(naem);
表已更改。
SQL> insert into names values('Jonn');
已创建 1 行。
(4)确认模式的内容
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
-------------------- -------------------
NAME_IDX INDEX
NAMES TABLE
SQL> select constraint_name,constraint_type,table_name from user_constraints;
CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME
-------------------- -------------------- ------------------------------
NAME_U U NAMES
(5)删除该表
SQL> drop table names;
表已删除。
(6)重复步骤4中的查询。
SQL> select constraint_name,constraint_type,table_name from user_constraints;
CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME
-------------------- -------------------- ------------------------------
BIN$LFg1G52oR7y8Bnjd U BIN$iadCJZxxSsGOQYNH/ZPwNg==$0
JHyoeA==$0
SQL> select object_name,object_type from user_objects;
未选定行
结果显示:虽然从user_objects中删除了对象,但是仍然采用系统生成的名称的约束。
(7)查询回收站以查看原始的名称到回收站名称的映射。
SQL> select object_name,original_name,type from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE
-------------------- -------------------------------- ------------
BIN$43Vw0GYgTSe+1i9Q NAME_IDX INDEX
VPM5ZQ==$0
BIN$iadCJZxxSsGOQYNH NAMES TABLE
/ZPwNg==$0
回收站中的对象可以查询,但不可以对其进行DML操作。
(8)使用flashback drop恢复表
SQL> flashback table names to before drop;
闪回完成。
(9)重新运行一下步骤4和7中的查询。
SQL> select object_name,original_name,type from user_recyclebin;
未选定行
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
-------------------- -------------------
NAMES TABLE
BIN$43Vw0GYgTSe+1i9Q INDEX
VPM5ZQ==$0
SQL> select constraint_name,constraint_type,table_name from user_constraints;
CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME
-------------------- -------------------- ------------------------------
BIN$LFg1G52oR7y8Bnjd U NAMES
JHyoeA==$0
注:索引和约束已保留了它们的回收站名称.
(11)将索引和约束重命名回原先的名称:
SQL> alter index "BIN$43Vw0GYgTSe+1i9QVPM5ZQ==$0" rename to name_idx;
索引已更改。
SQL> alter table names rename constraint "BIN$LFg1G52oR7y8BnjdJHyoeA==$0" to nam
e_u;
表已更改。
(12)再重新查询一下是否操作成功:
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
-------------------- -------------------
NAME_IDX INDEX
NAMES TABLE
SQL> select constraint_name,constraint_type,table_name from user_constraints;
CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME
-------------------- -------------------- ------------------------------
NAME_U U NAMES
(13)使用system连接数据库,删除dropper模式
SQL> drop user dropper cascade;
用户已删除。
(14)查询dba_recyclebin视图来证实确定删除了用户dropper拥有的所有对象.
SQL> select count(*) from dba_recyclebin where owner='DROPPER';
COUNT(*)
----------
0