知識面是由知識點組成的,你在研究某一個知識點的時候經常會遇到另外一個知識點,而後你去研究那個知識點,又會帶出更多的知識點,最終組成了知識面。html
今天在看書的時候看到一個刪除表的語句:測試
DROP TABLE AAA CASCADE CONSTRAINTS PURGE;spa
平時本身刪除表,用的僅僅是DROP TABLE TABLENAME,後邊歷來沒加過這幾個參數,感受好奇就找了幾個資料研究了一番。htm
先說參數 CASCADE CONSTRAINTS對象
抄襲開始:blog
----------------------------------------------------------------------------get
關於 cascade constraintsstring
假設A爲主表(既含有某一主鍵的表),B爲從表(即引用了A的主鍵做爲外鍵)。flash
則當刪除A表時,如不特殊說明,則 drop table A 系統會出現錯誤警告的訊息而不會容許執行。table
此時必須用,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從10G開始支持DDL語句閃回,免去了以前誤刪除(DROP)表後恢復起來很困難的麻煩。9i版本恢復誤刪除的表很困難,具體怎麼困難,我不知道。可是,10G後恢復就很簡單了,那就是Oracle提供了flashback drop新特性。
使用flashback drop功能的注意事項(一下狀況不能使用次功能):
1:表的存儲表空間不能爲system
2: 表被刪除的時候不能帶purge參數
3:存在空間壓力的時候
4:表上面啓用了細粒度審計
5:表啓用了VPD
(題外話:這個4和5對我來講又是新的知識點,哎,抽時間再研究吧。)
開啓回收站功能:
SQL> show parameter recyclebin;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
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; //清除任何表空間中的全部對象