しばたテックブログ

気分で書いている技術ブログです。

TRUNCATE禁止令

最近忙しくてきちんとしたエントリを書けそうにないので、小ネタでお茶を濁そうかと思います。

Oracle(以外のデータベースでもそうですが)でよく使われるTRUNCATEコマンドは非常に便利なのですが、ロールバックできないので、誤って実行してデータをリカバリしなければならなくなってしまう事がよくあると思います。(私は何度かやらかした事があります…)

そこでこんなトリガーを作ってみました。

--このトリガーはTRUNCATEの実行前に動作します
CREATE OR REPLACE TRIGGER PROHIBIT_TRUNCATE 
BEFORE TRUNCATE ON SCHEMA
DECLARE
    IS_TRUNCATE CHAR(1) := 'N';
BEGIN
    --TRUNCATE対象テーブルを判定
    --ORA_DICT_OBJ_NAME がTRUNCATE対象のテーブル名になります
    IS_TRUNCATE := 
        CASE ORA_DICT_OBJ_NAME
            WHEN 'なんちゃらマスタ' THEN 'N'
            WHEN 'ほんにゃかデータ' THEN 'N'
            ELSE 'Y'
        END;
    IF IS_TRUNCATE = 'N' THEN
        --エラーを起こしてTRUNCATE禁止!エラー番号は適宜変更してください
        RAISE_APPLICATION_ERROR(-20001, ORA_DICT_OBJ_NAME || 'はTRUNCATE禁止です');
    END IF;
END;
/

このトリガーはTRUNCATE実行前に動作し、指定したテーブルに対するTRUNCATEだった場合はエラーを発生させてTRUNCATEを禁止する様にしています。
このトリガーを本番環境などに導入すると不用意にデータをTRUNCATE出来なくなるのでいい感じになると思います。
TRUNCATEを実行したい場合は、トリガー内の判定条件を変えるかトリガー自体を無効にしてしまえば良いです。

ちなみにこのトリガー、Oracle 10g R2で動作確認しています。他のバージョンでもそれなりに動くと思います。