アイ ラブ SQL (I love SQL)

第149回「Lesson136 ゴミ箱 ~その6~」

(2006.9.19)

Oracle10gから表を削除すると、関連するオブジェクトも含めゴミ箱に入り、復活できるというお話をしてきましたが、 前回でもう終わったと思ったでしょう?いえいえ、もう少し付け足しておくことがあるのです。
では、説明する前にやってみましょう。まず、SYSTEMユーザーでログインし、表を2つ作成します。

SHOW USER
CREATE TABLE TEST1 (COL1 NUMBER);
CREATE TABLE TEST2 (COL1 NUMBER) TABLESPACE USERS;            

実行例1:
result1

では、早速ですが2つとも削除しましょう。

DROP TABLE TEST1;
DROP TABLE TEST2;               

実行例2:
result2

ゴミ箱を覗いてみましょう。

COL ORIGINAL_NAME FORMAT A10
COL TS_NAME FORMAT A10
SELECT OBJECT_NAME,ORIGINAL_NAME,TS_NAME FROM RECYCLEBIN;               

実行例3:
result3

あれ?一つしか入っていませんね。なぜ、TEST2はゴミ箱に入れてもらえたのに、TEST1は入れてもらえなかったのでしょうか?
検索結果のTS_NAME列は表領域名です。TEST2は表作成時に明示的にUSERSと指定しました。
TEST1は表領域名の指定を省略したのですが、省略するとどこに格納されるのでしょう?それは、ユーザーのデフォルト表領域ですよね。確認してみましょう。

SELECT USERNAME,DEFAULT_TABLESPACE FROM USER_USERS;               

実行例4:
result4

SYSTEMユーザーさんのデフォルト表領域はSYSTEMでした。
そうなんです!SYSTEM表領域に作成された表はゴミ箱には入れてもらえないのです。では、こんな場合はどうでしょうか?

CREATE TABLE TEST3 (COL1 NUMBER) TABLESPACE USERS;
CREATE INDEX TEST3_I ON TEST3 (COL1);

実行例5:
result5

「表はSYSTEM表領域以外に作成されているが、索引はSYSTEM表領域に作成されている」という場合です。
表だけゴミ箱に入って、索引は入らないのでしょうか?

COL TABLE_SPACE_NAME FORMAT A10
COL SEGMENT_NAME FORMAT A10SELECT SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME
FROM   DBA_SEGMENTS
WHERE  OWNER = 'SYSTEM'
AND    SEGMENT_NAME IN ('TEST3','TEST3_I');

実行例6:
result6

では、TEST3表を削除してゴミ箱を覗いてみましょう。

DROP TABLE TEST3;
SELECT OBJECT_NAME,ORIGINAL_NAME,TS_NAME FROM RECYCLEBIN;

実行例7:
result7

索引もゴミ箱に入っていましたね。つまり、表がSYSTEM表領域以外に作成されていたのであれば、その表に定義されていたオブジェクトもゴミ箱に入れられますが、表そのものがSYSTEM表領域内に作成されていた場合はゴミ箱に入れられないのです。
まあ、SYSTEMユーザーでオブジェクトを作るなんてことは普通しないと思いますが、気をつけてくださいね。

(Text by YUKO)

▲ページTOPへ