IT Soldier Sakuri !!

Oracle使い。いつのまにかIT戦士になってしまったさくりの可哀想な奮闘記。

Oracle活用 テーブルの削除と救出

夏休み初日を自堕落に過ごしてしまい、罪悪感が半端ない。
この調子でいったら、「あっ!」という間に夏休み終了だよ…ふえぇ。
明日はちゃんと活動します!



さて、Oracle10gからごみ箱機能というものが追加されて、
テーブルの削除 = 取り返しのつかない所業 ではなくなりました。
でも実際あんまり仕事ではテーブルの削除なんてしないので、
今日はテーブルの削除と、救出について勉強してみました。

最初にこんな感じのテーブルを作って何件かデータを入れておく。

BOONUS テーブル

列名 データ型 サイズ 制約
DEPARTMENT_ID NUMBER 4 NOT NULL
RATE NUMBER 5,2  
21:01:25 SQL> CREATE TABLE BONUS (
21:01:37   2      DEPARTMENT_ID NUMBER(4) NOT NULL,
21:01:37   3      RATE NUMBER(5,2),
21:01:37   4      CONSTRAINT PK_BONUS PRIMARY KEY(DEPARTMENT_ID)
21:01:37   5  ) TABLESPACE USERS;

表が作成されました。

21:01:37 SQL> select * from bonus;

レコードが選択されませんでした。

21:01:56 SQL> INSERT INTO BONUS VALUES (10,2);

1行が作成されました。

21:05:11 SQL> INSERT INTO BONUS VALUES (20,1.8);

1行が作成されました。

21:05:11 SQL> INSERT INTO BONUS VALUES (100,1.92);

1行が作成されました。

21:05:11 SQL> commit;

コミットが完了しました。

21:05:23 SQL> select * from bonus;

DEPARTMENT_ID       RATE
------------- ----------
           10          2
           20        1.8
          100       1.92

21:05:26 SQL> 


早速テーブルを削除してみる。ドキドキ…

21:05:26 SQL> DROP TABLE BONUS;

表が削除されました。

21:06:03 SQL> select * from bonus;
select * from bonus
              *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


21:06:08 SQL>

こんなの会社で出てきちゃった日にはもう土下座して退職願を提出だよ…
怖い怖い

ここでゴミ箱をのぞくコマンドを…

21:06:08 SQL> SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
BONUS            BIN$nuntDfzGSim+PLpJ9JzSOA==$0 TABLE        2015-08-08:21:06:03
21:06:32 SQL>

いたよ!いた!いた!!
削除した日時もちゃんと載ってるんだね。

ちなみに「Oracle Database 11g Express Editionのスタート・ガイド 」で見てみると、
こんな感じ。
f:id:itsoldiersakuri:20150808213736p:plain
BIN~って名前になるんだね。
PRIMARY_KEYも一緒にゴミ箱にいるみたい。

ではフラッシュバックで戻してみます!

21:06:32 SQL> FLASHBACK TABLE BONUS TO BEFORE DROP ;

フラッシュバックが完了しました。

21:07:08 SQL>

たったこれだけ。
これだけ???

21:07:08 SQL> select * from bonus;

DEPARTMENT_ID       RATE
------------- ----------
           10          2
           20        1.8
          100       1.92

21:07:12 SQL>

ちゃんと中身もありました!よかったね!!


ただし、削除のときにゴミ箱に入れず完全削除をすると
当たり前だけど、戻せませんでした。

21:07:12 SQL> DROP TABLE BONUS CASCADE CONSTRAINT PURGE;

表が削除されました。

21:08:14 SQL> select * from bonus;
select * from bonus
              *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


21:08:16 SQL> SHOW RECYCLEBIN
21:08:18 SQL>

ゴミ箱にない!!!!!



まとめ:テーブル削除はまずゴミ箱に。そのあとでゴミ箱を空にしよう。

テーブルを削除する

DROP TABLE [テーブル名]

制約も含めてテーブルを削除する

DROP TABLE [テーブル名] CASCADE CONSTRAINT;

制約も含めてゴミ箱に入れずに完全に削除する

DROP TABLE [テーブル名] CASCADE CONSTRAINT PURGE;

PURGE恐るべし!!!

ゴミ箱を空にする

PURGE RECYCLEBIN ;