1,、關(guān)于 cascade constraints 假設(shè)A為主表(既含有某一主鍵的表),,B為從表(即引用了A的主鍵作為外鍵),。 則當(dāng)刪除A表時(shí),,如不特殊說明,則 drop table A 系統(tǒng)會出現(xiàn)錯誤警告的訊息而不會允許執(zhí)行,。 此時(shí)必須用,,drop table A cascade constraints; SQL> select CONSTRAINT_NAME,TABLE_NAME from dba_constraints where owner = 'SYS' and TABLE_NAME = 'B' 2,、關(guān)于purge oracle10g的新特性。在oralce 9i中只支持DML的閃回功能,,到了oracle10g也支持DDL的閃回特性,。 當(dāng)我們drop table A;時(shí),,其實(shí)只是將table A 放到了回收站中,,改了個系統(tǒng)的名字。如果想徹底刪除該表,,需要 drop table A purge,; 或 (1)drop table A; //將A送入回收站中 (2)purge table A,;//將A從回收站中刪除 注意:利用create global temporary table 建立的表drop時(shí) 不會進(jìn)入回收站,,故也不能用purge table 。,。,。 但是可以 drop table ...purge; 詳細(xì)信息可參照:http://www.oracle.com/technology/global/cn/pub/articles/10gdba/week5_10gdba.html Oracle9i Database 推出了閃回查詢選項(xiàng)的概念,,以便檢索過去某個時(shí)間點(diǎn)的數(shù)據(jù),,但它不能閃回 DDL 操作,如刪除表的操作,。唯一的恢復(fù)方法是在另一個數(shù)據(jù)庫中使用表空間的時(shí)間點(diǎn)恢復(fù),,然后使用導(dǎo)出/導(dǎo)入或其他方法,在當(dāng)前數(shù)據(jù)庫中重新創(chuàng)建表,。這一過程需要 DBA 進(jìn)行大量工作并且耗費(fèi)寶貴的時(shí)間,,更不用說還要使用另一個數(shù)據(jù)庫進(jìn)行克隆。 請使用 Oracle Database 10g 中的閃回表特性,,它使得被刪除表的恢復(fù)過程如同執(zhí)行幾條語句一樣簡單,。讓我們來看該特性是如何工作的。 首先,,讓我們查看當(dāng)前模式中的表,。 TNAME TABTYPE CLUSTERID ------------------------ ------- ---------- RECYCLETEST TABLE 現(xiàn)在,我們意外地刪除了該表: SQL> drop table recycletest; 現(xiàn)在讓我們來查看該表的狀態(tài),。 SQL> select * from tab; 表 RECYCLETEST 已不存在,,但是請注意出現(xiàn)新表 BIN$04LhcpndanfgMAAAAAANPw==$0。這就是所發(fā)生的事情:被刪除的表 RECYCLETEST 并沒有完全消失,而是重命名為一個由系統(tǒng)定義的名稱,。它存在于同一個表空間中,,具有與原始表相同的結(jié)構(gòu)。如果在該表上定義了索引或觸發(fā)器,,則它們也被重命名,,使用與表相同的命名規(guī)則。任何相關(guān)源(如過程)都失效,;原始表的觸發(fā)器和索引被改為放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,,保持被刪除表的完整對象結(jié)構(gòu)。 表及其相關(guān)對象被放置在一個稱為“回收站”的邏輯容器中,,它類似于您 PC 機(jī)中的回收站,。但是,對象并沒有從它們原先所在的表空間中刪除,;它們?nèi)匀徽加媚抢锏目臻g,?;厥照局皇且粋€列出被刪除對象目錄的邏輯結(jié)構(gòu),。在 SQL*Plus 提示符處使用以下命令來查看其內(nèi)容(您需要使用 SQL*Plus 10.1 來進(jìn)行此操作): SQL> show recyclebinORIGINAL NAME RECYCLEBIN NAME ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------------------ ------------------ RECYCLETEST BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE 2004-02-16:21:13:31 結(jié)果顯示了表的原始名稱 RECYCLETEST,并顯示了回收站中的新名稱,,該名稱與我們看到的刪除后所創(chuàng)建的新表名稱相同,。(注意:確切的名稱可能因平臺不同而不同,。)為恢復(fù)該表,您所需要做的就是使用 FLASHBACK TABLE 命令: SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;FLASHBACK COMPLETE.SQL> SELECT * FROM TAB;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------RECYCLETEST TABLE 瞧,!表毫不費(fèi)力地恢復(fù)了,。如果現(xiàn)在查看回收站,它將是空的,。 記住,,將表放在回收站里并不在原始表空間中釋放空間。要釋放空間,,您需要使用以下命令清空回收站: PURGE RECYCLEBIN; 但是如果您希望完全刪除該表而不需要使用閃回特性,,該怎么辦?在這種情況下,,可以使用以下命令永久刪除該表: DROP TABLE RECYCLETEST PURGE; 此命令不會將表重命名為回收站中的名稱,,而是永久刪除該表,就象 10g 之前的版本一樣,。 管理回收站 如果在該過程中沒有實(shí)際刪除表 — 因而沒有釋放表空間 — 那么當(dāng)被刪除的對象占用了所有空間時(shí),,會發(fā)生什么事? 答案很簡單:這種情況根本不會出現(xiàn),。當(dāng)表空間被回收站數(shù)據(jù)完全占滿,,以至于必須擴(kuò)展數(shù)據(jù)文件來容納更多數(shù)據(jù)時(shí),可以說表空間處于“空間壓力”情況下。此時(shí),,對象以先進(jìn)先出的方式從回收站中自動清除,。在刪除表之前,相關(guān)對象(如索引)被刪除,。 同樣,,空間壓力可能由特定表空間定義的用戶限額而引起。表空間可能有足夠的空余空間,,但用戶可能將其在該表空間中所分配的部分用完了,。在這種情況下,Oracle 自動清除該表空間中屬于該用戶的對象,。 此外,,有幾種方法可以手動控制回收站。如果在刪除名為 TEST 的特定表之后需要從回收站中清除它,,可以執(zhí)行 PURGE TABLE TEST; 或者使用其回收站中的名稱: PURGE TABLE 'BIN$04LhcpndanfgMAAAAAANPw==$0'; 此命令將從回收站中刪除表 TEST 及所有相關(guān)對象,,如索引、約束等,,從而節(jié)省了空間,。但是,如果要從回收站中永久刪除索引,,則可以使用以下命令來完成工作: purge index in_test1_01; 此命令將僅僅刪除索引,,而將表的拷貝留在回收站中。 有時(shí)在更高級別上進(jìn)行清除可能會有用,。例如,,您可能希望清除表空間 USERS 的回收站中的所有對象??梢詧?zhí)行: PURGE TABLESPACE USERS; 您也許希望只為該表空間中特定用戶清空回收站,。在數(shù)據(jù)倉庫類型的環(huán)境中,,用戶創(chuàng)建和刪除許多臨時(shí)表,,此時(shí)這種方法可能會有用。您可以更改上述命令,,限定只清除特定的用戶: PURGE TABLESPACE USERS USER SCOTT; 諸如 SCOTT 等用戶可以使用以下命令來清空自己的回收站 PURGE RECYCLEBIN; DBA 可以使用以下命令清除任何表空間中的所有對象 PURGE DBA_RECYCLEBIN; 可以看到,,可以通過多種不同方法來管理回收站,以滿足特定的需要,。 表版本和閃回功能 用戶可能會經(jīng)常多次創(chuàng)建和刪除同一個表,,如: 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; 此時(shí),如果您要對表 TEST 執(zhí)行閃回操作,,那么列 COL1 的值應(yīng)該是什么,?常規(guī)想法可能認(rèn)為從回收站取回表的第一個版本,列 COL1 的值是 1。實(shí)際上,,取回的是表的第三個版本,,而不是第一個。因此列 COL1 的值為 3,,而不是 1,。 此時(shí)您還可以取回被刪除表的其他版本。但是,,表 TEST 的存在不允許出現(xiàn)這種情況,。您有兩種選擇:
警告…… 取消刪除特性使表恢復(fù)其原始名稱,但是索引和觸發(fā)器等相關(guān)對象并沒有恢復(fù)原始名稱,,它們?nèi)匀皇褂没厥照镜拿Q,。在表上定義的源(如視圖和過程)沒有重新編譯,仍然保持無效狀態(tài),。必須手動得到這些原有名稱并應(yīng)用到閃回表,。 信息保留在名為 USER_RECYCLEBIN 的視圖中。在對表進(jìn)行閃回操作前,,請使用以下查詢來檢索原有名稱,。 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 ALTER INDEX 'BIN$04LhcpnianfgMAAAAAANPw==$0' RENAME TO IN_RT_01;ALTER TRIGGER 'BIN$04LhcpnganfgMAAAAAANPw==$0' RENAME TO TR_RT; 一個值得注意的例外情況是位圖索引,。當(dāng)刪除位圖索引時(shí),,它們并不放置在回收站中 — 因此無法檢索它們。約束名稱也無法從視圖中檢索,。必須從其他來源對它們進(jìn)行重命名,。 閃回表的其他用途 閃回刪除表功能不僅限于恢復(fù)表的刪除操作。與閃回查詢類似,,您還可以使用它將表恢復(fù)到不同的時(shí)間點(diǎn),,利用表的“過去”版本來替代整個表,。例如,以下語句將表恢復(fù)到系統(tǒng)更改號 (SCN) 2202666520,。 FLASHBACK TABLE RECYCLETEST TO SCN 2202666520; 此特性使用 Oracle 數(shù)據(jù)泵技術(shù)來創(chuàng)建不同的表,,使用閃回功能將該 SCN 處的數(shù)據(jù)版本填充到表中,然后用新表替代原始表,。為找出能夠在何種程度上對表進(jìn)行閃回操作,,可以使用 Oracle Database 10g 的版本控制特性。(更多詳細(xì)信息請參見本系列第 1 周的內(nèi)容,。)在閃回子句中也可以指定時(shí)間戳記而不是指定 SCN,。 SQL> select * from tab; |
|