OracleでDELETE操作をブロックするトリガー活用術

SQL

誤操作を未然に防ぎ、大切なデータを守る!

重要な業務テーブルに対してうっかり DELETE してしまう…。
その一瞬のミスが、取り返しのつかない損失を生むこともあります。

本記事では、Oracleのトリガーを用いてDELETE操作を確実にブロックする方法と、UPDATE・INSERTなど他の操作制御の応用例を具体的なSQL付きで紹介します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


🧾この記事の構成

  • STEP 1:スキーマ・テーブルの準備
  • STEP 2:DELETE禁止トリガーの作成
  • STEP 3:動作確認
  • 応用編:INSERT・UPDATEの禁止や特定列だけの制御例

✅ STEP 1:ユーザーとテーブルの作成

DBAユーザーでユーザー作成

CREATE USER user_a IDENTIFIED BY password
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;

GRANT CONNECT, RESOURCE TO user_a;

USER_AでEMP表を作成

CONNECT user_a/password

CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(100)
);

🔒 STEP 2:DELETEを禁止するトリガーを作成

CREATE OR REPLACE TRIGGER trg_block_delete_emp
BEFORE DELETE ON emp
BEGIN
RAISE_APPLICATION_ERROR(-20001, 'EMP表に対するDELETE操作は禁止されています。');
END;
/

🔍 STEP 3:動作確認

テストデータを挿入

INSERT INTO emp VALUES (1001, 'SCOTT');
COMMIT;

DELETEを試行

DELETE FROM emp WHERE empno = 1001;

結果

ORA-20001: EMP表に対するDELETE操作は禁止されています。

➡️ DELETEは完全にブロックされます。

SQL> CREATE USER user_a IDENTIFIED BY password
2 DEFAULT TABLESPACE users
3 TEMPORARY TABLESPACE temp
4 QUOTA UNLIMITED ON users;

ユーザーが作成されました。

SQL> GRANT CONNECT, RESOURCE TO user_a;

権限付与が成功しました。

SQL> CONNECT user_a/password
接続されました。
SQL> CREATE TABLE emp (
2 empno NUMBER PRIMARY KEY,
3 ename VARCHAR2(100)
4 );

表が作成されました。

SQL> CREATE OR REPLACE TRIGGER trg_block_delete_emp ★トリガー作成
2 BEFORE DELETE ON emp
3 BEGIN
4 RAISE_APPLICATION_ERROR(-20001, 'EMP表に対するDELETE操作は禁止されています。');
5 END;
6 /

トリガーが作成されました。

SQL> INSERT INTO emp VALUES (1001, 'SCOTT');

1行が作成されました。

SQL> COMMIT;

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

SQL> DELETE FROM emp WHERE empno = 1001; ★DELETE でエラーが発生する
DELETE FROM emp WHERE empno = 1001
*
行1でエラーが発生しました。:
ORA-20001: EMP表に対するDELETE操作は禁止されています。 ORA-06512:
"USER_A.TRG_BLOCK_DELETE_EMP", 行2
ORA-04088: トリガー'USER_A.TRG_BLOCK_DELETE_EMP'の実行中にエラーが発生しました

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


💡 応用例:他の操作もブロックするトリガー


🔸INSERT操作の禁止

CREATE OR REPLACE TRIGGER trg_block_insert_emp
BEFORE INSERT ON emp
BEGIN
RAISE_APPLICATION_ERROR(-20002, 'EMP表に対するINSERTは禁止されています。');
END;
/

🔸UPDATE操作の禁止

CREATE OR REPLACE TRIGGER trg_block_update_emp
BEFORE UPDATE ON emp
BEGIN
RAISE_APPLICATION_ERROR(-20003, 'EMP表に対するUPDATEは禁止されています。');
END;
/

🔸特定カラム(ename)のUPDATEだけを禁止

CREATE OR REPLACE TRIGGER trg_block_update_ename
BEFORE UPDATE OF ename ON emp
BEGIN
RAISE_APPLICATION_ERROR(-20004, 'ENAME列の更新は禁止されています。');
END;
/

✅ 各トリガーの使い分け

トリガー名制御内容用途の例
trg_block_delete_empDELETE 全体を禁止誤削除防止
trg_block_insert_empINSERT 全体を禁止データの追加を運用側に限定したい
trg_block_update_empUPDATE 全体を禁止監査のため変更不可にしたい
trg_block_update_enameename列のUPDATEだけ禁止名前の変更を業務側に制限したい

🧩まとめ

  • トリガーを活用すれば、DELETE/INSERT/UPDATEの制御が可能
  • カラム単位の制御も柔軟に実装できる
  • RAISE_APPLICATION_ERRORで適切なエラー表示もでき、運用ルールの明確化に有効


[参考]
14.12 CREATE TRIGGER文

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました