誤操作を未然に防ぎ、大切なデータを守る!
重要な業務テーブルに対してうっかり 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_emp | DELETE 全体を禁止 | 誤削除防止 |
trg_block_insert_emp | INSERT 全体を禁止 | データの追加を運用側に限定したい |
trg_block_update_emp | UPDATE 全体を禁止 | 監査のため変更不可にしたい |
trg_block_update_ename | ename列のUPDATEだけ禁止 | 名前の変更を業務側に制限したい |
🧩まとめ
- トリガーを活用すれば、DELETE/INSERT/UPDATEの制御が可能
- カラム単位の制御も柔軟に実装できる
RAISE_APPLICATION_ERRORで適切なエラー表示もでき、運用ルールの明確化に有効




コメント