--==============================================
-- Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)
--==============================================
FLASHBACK DROP 特性允许在不丢失任何数据库的情况下将指定的表恢复至其被删除的时间点,并保持数据库为当前状态。闪回删除并不是
真正的删除表,而是把该表重命名并放入回收站,类似于Windows的回收站一样。当某个活动对象需要使用该表所占用的空间时,该表才会被真
正删除。只要空间未被复用,该表即可恢复。本文主要讲述了FLASHBACK DROP特性以及闪回特性中回收站(RECYCLEBIN)的管理。
一、FLASHBACK DROP 的功能
将先前删除的表恢复到删除之前的状态
恢复该表的索引以及触发器,授权
恢复该表的约束,包括唯一约束、主键约束、非空约束。外键约束不可恢复
可以实现基于系统和基于会话的flash drop操作
alter system set recyclebin = on | off;
alter session set recyclebin = on | off;
drop table(oracle 10g)命令并不真正删除表,在内部被映射为rename命令,即是将其重命名之后放入回收站。
二、理解表重名的过程
scott@ORCL> create table tb_emp as select * from emp; --基于emp表来创建表tb_emp
scott@ORCL> alter table tb_emp add constraint empno_pk --添加主键约束,将产生主键索引
2 primary key(empno);
scott@ORCL> alter table tb_emp add constraint ename_uk --添加唯一约束,将产生唯一索引
2 unique(ename);
scott@ORCL> alter table tb_emp add constraint sal_ck check(sal>0); --添加check约束
scott@ORCL> alter table tb_emp modify job constraint job_nn not null; --添加非空约束
scott@ORCL> alter table tb_emp add constraint dept_fk --添加外键约束
2 foreign key(deptno) references dept(deptno) on delete cascade;
scott@ORCL> select constraint_name,constraint_type --查看tb_emp表上的所有约束
2 from user_constraints where table_name='TB_EMP';
CONSTRAINT_NAME C
--------------- -
EMPNO_PK P
ENAME_UK U
SAL_CK C
JOB_NN C
DEPT_FK R
--下面查看表tb_emp所在文件的id,块的起始id,大小,以及该对象的对象id等
sys@ORCL> select file_id,block_id,bytes from dba_extents where segment_name='TB_EMP';
FILE_ID BLOCK_ID BYTES
---------- ---------- ----------
4 393 65536
sys@ORCL> select object_name,object_id from dba_objects --查看表tb_emp的对象ID
2 where object_name = 'TB_EMP';
OBJECT_NAME OBJECT_ID
-------------------- ----------
TB_EMP 54493
--对表进行重命名
scott@ORCL> alter table tb_emp rename to tb_employees;
sys@ORCL> select file_id,block_id,bytes from dba_extents --重命名后所在文件的id,块的起始id,大小没有发生变化
2 where segment_name='TB_EMPLOYEES';
FILE_ID BLOCK_ID BYTES
---------- ---------- ----------
4 393 65536
sys@ORCL> select object_name,object_id from dba_objects --重命名后对象ID没有发生变化
2 where object_name = 'TB_EMPLOYEES';
OBJECT_NAME OBJECT_ID
-------------------- ----------
TB_EMPLOYEES 54493
scott@ORCL> select index_name,index_type --重命名后索引和约束也没有发生变化
2 from user_indexes where table_name='TB_EMPLOYEES'
3 union all
4 select constraint_name,constraint_type
5 from user_constraints where table_name='TB_EMPLOYEES';
INDEX_NAME INDEX_TYPE
------------------------------ ---------------------------
EMPNO_PK NORMAL
ENAME_UK NORMAL
EMPNO_PK P
ENAME_UK U
SAL_CK C
JOB_NN C
DEPT_FK R
从上面的演示可以看出对于表的重命名仅仅是修改了表名,而对于表对象的ID,以及表存放的位置,块的起始,大小等并未发生实质性的变化。