cascade constraints和purge簡述

1、 cascade constraints

DROP TABLE ** CASCADE CONSTRAINTS PURGE 假設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。

 

 2、purge

oracle10g的新特性。在oralce 9i中只支持DML的閃回功能,到了oracle10g也支持DDL的閃回特性。 當我們drop table A;時,其實只是將table A 放到了回收站中,改了個系統的名字。如果想徹底刪除該表,需要 drop table A purge; 或 (1)drop table A; //將A送入回收站中 (2)purge table A;//將A從回收站中刪除 注意:利用create global temporary table 建立的表drop時 不會進入回收站,故也不能用purge table 。。。 但是可以 drop table ...purge; 詳細信息可參照:http://www.oracle.com/technology/global/cn/pub/articles/10gdba/week5_10gdba.html Oracle9i Database 推出了閃回查詢選項的概念,以便檢索過去某個時間點的數據,但它不能閃回 DDL 操作,如刪除表的操作。唯一的恢復方法是在另一個數據庫中使用表空間的時間點恢復,然後使用導出/導入或其他方法,在當前數據庫中重新創建表。這一過程需要 DBA 進行大量工作並且耗費寶貴的時間,更不用說還要使用另一個數據庫進行克隆。 請使用 Oracle Database 10g 中的閃回表特性,它使得被刪除表的恢復過程如同執行幾條語句一樣簡單。讓我們來看該特性是如何工作的。 首先,讓我們查看當前模式中的表。 TNAME TABTYPE CLUSTERID------------------------ ------- ----------RECYCLETEST TABLE 現在,我們意外地刪除了該表: SQL> drop table recycletest; Table dropped. 現在讓我們來查看該表的狀態。 SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE 表 RECYCLETEST 已不存在,但是請注意出現新表 BIN$04LhcpndanfgMAAAAAANPw==$0。這就是所發生的事情:被刪除的表 RECYCLETEST 並沒有完全消失,而是重命名爲一個由系統定義的名稱。它存在於同一個表空間中,具有與原始表相同的結構。如果在該表上定義了索引或觸發器,則它們也被重命名,使用與表相同的命名規則。任何相關源(如過程)都失效;原始表的觸發器和索引被改爲放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被刪除表的完整對象結構。 表及其相關對象被放置在一個稱爲“回收站”的邏輯容器中,它類似於您 PC 機中的回收站。但是,對象並沒有從它們原先所在的表空間中刪除;它們仍然佔用那裏的空間。回收站只是一個列出被刪除對象目錄的邏輯結構。在 SQL*Plus 提示符處使用以下命令來查看其內容(您需要使用 SQL*Plus 10.1 來進行此操作): SQL> show recyclebinORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME---------------- ------------------------------ ------------ ------------------RECYCLETEST BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE 2004-02-16:21:13:31 結果顯示了表的原始名稱 RECYCLETEST,並顯示了回收站中的新名稱,該名稱與我們看到的刪除後所創建的新表名稱相同。(注意:確切的名稱可能因平臺不同而不同。)爲恢復該表,您所需要做的就是使用 FLASHBACK TABLE 命令: SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;FLASHBACK COMPLETE.SQL> SELECT * FROM TAB;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------RECYCLETEST TABLE 瞧!表毫不費力地恢復了。如果現在查看回收站,它將是空的。 記住,將表放在回收站裏並不在原始表空間中釋放空間。要釋放空間,您需要使用以下命令清空回收站: PURGE RECYCLEBIN; 但是如果您希望完全刪除該表而不需要使用閃回特性,該怎麼辦?在這種情況下,可以使用以下命令永久刪除該表: DROP TABLE RECYCLETEST PURGE; 此命令不會將表重命名爲回收站中的名稱,而是永久刪除該表,就象 10g 之前的版本一樣。管理回收站 如果在該過程中沒有實際刪除表 — 因而沒有釋放表空間 — 那麼當被刪除的對象佔用了所有空間時,會發生什麼事? 答案很簡單:這種情況根本不會出現。當表空間被回收站數據完全佔滿,以至於必須擴展數據文件來容納更多數據時,可以說表空間處於“空間壓力”情況下。此時,對象以先進先出的方式從回收站中自動清除。在刪除表之前,相關對象(如索引)被刪除。 同樣,空間壓力可能由特定表空間定義的用戶限額而引起。表空間可能有足夠的空餘空間,但用戶可能將其在該表空間中所分配的部分用完了。在這種情況下,Oracle 自動清除該表空間中屬於該用戶的對象。 此外,有幾種方法可以手動控制回收站。如果在刪除名爲 TEST 的特定表之後需要從回收站中清除它,可以執行 PURGE TABLE TEST; 或者使用其回收站中的名稱: PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0"; 此命令將從回收站中刪除表 TEST 及所有相關對象,如索引、約束等,從而節省了空間。但是,如果要從回收站中永久刪除索引,則可以使用以下命令來完成工作: purge index in_test1_01; 此命令將僅僅刪除索引,而將表的拷貝留在回收站中。 有時在更高級別上進行清除可能會有用。例如,您可能希望清除表空間 USERS 的回收站中的所有對象。可以執行: PURGE TABLESPACE USERS; 您也許希望只爲該表空間中特定用戶清空回收站。在數據倉庫類型的環境中,用戶創建和刪除許多臨時表,此時這種方法可能會有用。您可以更改上述命令,限定只清除特定的用戶: PURGE TABLESPACE USERS USER SCOTT; 諸如 SCOTT 等用戶可以使用以下命令來清空自己的回收站 PURGE RECYCLEBIN; DBA 可以使用以下命令清除任何表空間中的所有對象 PURGE DBA_RECYCLEBIN; 可以看到,可以通過多種不同方法來管理回收站,以滿足特定的需要。 表版本和閃回功能 用戶可能會經常多次創建和刪除同一個表,如: CREATE TABLE TEST (COL1 NUMBER);INSERT INTO TEST VALUES (1); commit;DROP TABLE TEST;CREATE TABLE TEST (COL1 NUMBER); INSERT INTO TEST VALUES (2);commit;DROP TABLE TEST; CREATE TABLE TEST (COL1 NUMBER); INSERT INTO TEST VALUES (3);commit;DROP TABLE TEST; 此時,如果您要對錶 TEST 執行閃回操作,那麼列 COL1 的值應該是什麼?常規想法可能認爲從回收站取回表的第一個版本,列 COL1 的值是 1。實際上,取回的是表的第三個版本,而不是第一個。因此列 COL1 的值爲 3,而不是 1。 此時您還可以取回被刪除表的其他版本。但是,表 TEST 的存在不允許出現這種情況。您有兩種選擇: 使用重命名選項: FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST2;FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST1; 這些語句將表的第一個版本恢復到 TEST1,將第二個版本恢復到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值將分別是 1 和 2。或者, 使用表的特定回收站名稱進行恢復。爲此,首先要識別表的回收站名稱,然後執行: FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST2;FLASHBACK TABLE "BIN$04LhcpnqanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST1; 這些語句將恢復被刪除表的兩個版本。 警告…… 取消刪除特性使表恢復其原始名稱,但是索引和觸發器等相關對象並沒有恢復原始名稱,它們仍然使用回收站的名稱。在表上定義的源(如視圖和過程)沒有重新編譯,仍然保持無效狀態。必須手動得到這些原有名稱並應用到閃回表。 信息保留在名爲 USER_RECYCLEBIN 的視圖中。在對錶進行閃回操作前,請使用以下查詢來檢索原有名稱。 SELECT OBJECT_NAME, ORIGINAL_NAME, TYPEFROM USER_RECYCLEBINWHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBINWHERE ORIGINAL_NAME = 'RECYCLETEST')AND ORIGINAL_NAME != 'RECYCLETEST';OBJECT_NAME ORIGINAL_N TYPE------------------------------ ---------- --------BIN $04LhcpnianfgMAAAAAANPw==$0 IN_RT_01 INDEXBIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT TRIGGER 在表進行閃回操作後,表 RECYCLETEST 上的索引和觸發器將按照 OBJECT_NAME 列中所示進行命名。根據以上查詢,可以使用原始名稱重新命名對象,如下所示: ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT; 一個值得注意的例外情況是位圖索引。當刪除位圖索引時,它們並不放置在回收站中 — 因此無法檢索它們。約束名稱也無法從視圖中檢索。必須從其他來源對它們進行重命名。 閃回表的其他用途 閃回刪除表功能不僅限於恢復表的刪除操作。與閃回查詢類似,您還可以使用它將表恢復到不同的時間點,利用表的“過去”版本來替代整個表。例如,以下語句將表恢復到系統更改號 (SCN) 2202666520。 FLASHBACK TABLE RECYCLETEST TO SCN 2202666520; 此特性使用 Oracle 數據泵技術來創建不同的表,使用閃回功能將該 SCN 處的數據版本填充到表中,然後用新表替代原始表。爲找出能夠在何種程度上對錶進行閃回操作,可以使用 Oracle Database 10g 的版本控制特性。在閃回子句中也可以指定時間戳記而不是指定 SCN。 SQL> select * from tab;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章