知识面是由知识点组成的,你在研究某一个知识点的时候常常会遇到另一个知识点,然后你去研究那个知识点,又会带出更多的知识点,最终组成了知识面。

 

今天在看书的时候看到一个删除表的语句:

 

DROP TABLE AAA CASCADE CONSTRAINTS PURGE;

 

平时自己删除表,用的仅仅是DROP TABLE TABLENAME,后边从来没加过这几个参数,感觉好奇就找了几个资料研究了一番。


先说参数 CASCADE CONSTRAINTS

抄袭开始:

----------------------------------------------------------------------------

关于 cascade constraints

假设A为主表(既含有某一主键的表),B为从表(即引用了A的主键作为外键)。

则当删除A表时,如不特殊说明,则 drop table A 系统会出现错误警告的讯息而不会允许执行。

此时必须用,drop table A cascade constraints;

SQL> select CONSTRAINT_NAME,TABLE_NAME from dba_constraints where owner = 'SYS' and TABLE_NAME = 'B' 
no rows selected 

我们可以发现利用Drop table cascade constraints可以刪除从表的constraint來达成你drop table t的目的,原來属于B的foreign key constraint已经跟随着被删除掉了,但是,储存在table B中的资料不会被删除,也就是说Drop table cascade constraints 是不影响到存储于objec里的row data。

--------------------------------------------------------------------------------------------------------------------------

再说参数 PURGE

这个参数比较有意思,看了几篇文章才搞明白。

参考文章:

DROP TABLE ** CASCADE CONSTRAINTS PURGE

浅谈Oracle闪回删除表限制

========================【拿来主义】========================

Oracle从10G开始支持DDL语句闪回,免去了之前误删除(DROP)表后恢复起来很困难的麻烦。9i版本恢复误删除的表很困难,具体怎么困难,我不知道。但是,10G后恢复就很简单了,那就是Oracle提供了flashback drop新特性。

使用flashback drop功能的注意事项(一下情况不能使用次功能):

1:表的存储表空间不能为system
2: 表被删除的时候不能带purge参数
3:存在空间压力的时候
4:表上面启用了细粒度审计
5:表启用了VPD

(题外话:这个4和5对我来说又是新的知识点,哎,抽时间再研究吧。)

开启回收站功能:

  1. SQL> show parameter recyclebin;  

  2.  

  3. NAME                                 TYPE        VALUE  

  4. ------------------------------------ ----------- ------------------------------  

  5. recyclebin                           string      on 


实验测试flashback drop功能:

 

 

创建表AAA:


SQL> create table aaa (name varchar2(20));

 

Table created


向表AAA插入数据:


SQL> insert into aaa values ('1234');

 

1 row inserted

 

SQL> insert into aaa values ('1234');

 

1 row inserted


查询数据:


SQL> select * from aaa;

 

NAME

--------------------

1234

1234


查询user_recyclebin中有没有关于AAA的记录:


SQL> select * from user_recyclebin where original_name ='AAA';

 

OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE

------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------

 (没有数据)


删除AAA:


SQL> drop table aaa;

 

Table dropped

 

SQL> select * from user_recyclebin where original_name ='AAA';

 

OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE

------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------

BIN$ljh1zkU8SUqaTs8kGHS6mg==$0 AAA                              DROP      TABLE                     TS_FPZX_DAT                    2015-02-03:16:50:10 2015-02-03:16:51:05   29344784                                  YES        YES            94499       94499        94499          8


再次查询表(已经被删除)

SQL> select * from aaa;

 

select * from aaa

 

ORA-00942: 表或视图不存在


再次建立表AAA:

SQL> create table aaa (name varchar2(20));

 

Table created


插入数据:


SQL> insert into aaa values ('abcd');

 

1 row inserted

 

SQL> insert into aaa values ('abcd');

 

1 row inserted


不查询了,直接删除吧:


SQL> drop table aaa;

 

Table dropped


再次查询变化:


SQL> select OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,CREATETIME,DROPTIME from user_recyclebin where original_name ='AAA';

 

OBJECT_NAME                    ORIGINAL_NAME  OPERATION    TYPE   CREATETIME            DROPTIME                

------------------------------ ------------- --------- --------- -----------------     -----------------

BIN$ljh1zkU8SUqaTs8kGHS6mg==$0 AAA             DROP       TABLE   2015-02-03:16:50:10  2015-02-03:16:51:05            

BIN$pk7Yt+SeRhOpF7UvsMuTrg==$0 AAA             DROP       TABLE   2015-02-03:16:52:04  2015-02-03:16:52:20  


此时user_recyclebin中有两条关于AAA的记录,我们此时要是用语句恢复数据的话,恢复的是第二次删除的表中的数据:


SQL> flashback table aaa to before drop;

 

Done

查询数据:

SQL> select * from aaa;

 

NAME

--------------------

abcd

abcd

此时user_recyclebin 表中只剩一条数据了,这个数据中的表AAA,保存的就是第一张表里边的‘1234’的数据。我们来还原它的话需要另命名,因为已经恢复了AAA:

SQL> select OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,CREATETIME,DROPTIME from user_recyclebin where original_name ='AAA';

 

OBJECT_NAME                    ORIGINAL_NAME  OPERATION    TYPE   CREATETIME            DROPTIME                

------------------------------ ------------- --------- --------- -----------------     -----------------

BIN$ljh1zkU8SUqaTs8kGHS6mg==$0 AAA             DROP       TABLE   2015-02-03:16:50:10  2015-02-03:16:51:05  


闪回第一张AAA,加上rename关键字:

SQL> flashback table aaa to before drop rename to AAA2;

 

Done

查询数据:

SQL> select * from aaa2;

 

NAME

--------------------

1234

1234


另:

>>>>>>PURGE TABLESPACE USER SCOTT;  //清除特定表空间特定用户的回收站

>>>>>>PURGE DBA_RECYCLEBIN;      //清除任何表空间中的所有对象