ORACLE/TRIGGER編

オラクルちょこっとリファレンス

HOME > TRIGGER編

TRIGGER(トリガー)

トリガーとは、ある条件に合致した操作が行われた場合に、実行されるオブジェクトです。例えばあるテーブルが更新されたら、他のテーブルに挿入を行うというような感じです。
ただ、実際のシステムでトリガーを使いすぎると仕組みが複雑になり、分かりづらくなってしまうので、多用は避けたほうが無難です。

トリガーの作成

トリガーの作成には、CREATE TRIGGER句を使用します。

CREATE TRIGGER構文
CREATE [ OR REPLACE ] TRIGGER トリガー名
  { BEFORE | AFTER | INSTEAD OF }
  { INSERT | UPDATE [OF 列名,...] | DELETE }
    [OR {INSERT | UPDATE [OF 列名,...] | DELETE }]
    [... ]
      ON テーブル名
    [ FOR EACH ROW ]
    [ WHEN 条件式 ]
      BEGIN
        処理内容
    END
;
パラメータ 説明
OR REPLACE 同じ名前のトリガーがあった場合は上書きする指定。
BEFORE |
AFTER |
INSTEAD OF
トリガーを起動させるタイミング。
 before:データが操作される前にトリガーを起動する
 after:データが操作された後にトリガーを起動する
 instead of:データが操作されるSQLが実行された時、そのSQLは実行せずにトリガーだけを起動する
FOR EACH ROW 複数の行のデータが操作された場合、この指定があると、各行ごとにトリガーを起動する
この指定が無いと複数行のデータが操作されるSQLが発行されても1回しかトリガーは起動されない。
TRRIGERの作成例文
--(例)test_tblの挿入・変更・削除件数をcnt_tblに記録するトリガー CREATE OR REPLACE TRIGGER test_trg before insert or update or delete on test_tbl for each row BEGIN if inserting then update cnt_tbl set i_cnt = i_cnt + 1; elsif updating then update cnt_tbl set u_cnt = u_cnt + 1; else update cnt_tbl set d_cnt = d_cnt + 1; end if; END; /

この例だと、test_tblテーブルにINSERTかUPDATEかDELETEが実行されると起動するトリガーが作成されます。
BEGIN~ENDの間でINSERT、UPDATE、それ以外の場合で行う処理を変えています。

CREATE TRIGGERの実行には以下の権限が必要です。

  • 自スキーマに作成する場合:「CREATE TRIGGER」システム権限
  • 他スキーマに作成する場合:「CREATE ANY TRIGGER」システム権限

トリガーを有効/無効にする

トリガーの有効/無効の設定には ALTER TRIGGER句を使用します。

ALTER TRIGGER構文 (トリガーの有効/無効)
ALTER TRIGGER <トリガー名> {ENABLE | DISABLE};

TRIGGERを無効にする例文
--(例)トリガー(トリガー名:test_trg)を無効にする。 ALTER TRIGGER test_trg DISABLE;

トリガーの削除

トリガーの削除には DROP TRIGGER句を使用します。

DROP TRIGGER構文
DROP TRIGGER <トリガー名>;

TRIGGERの削除例文
--(例)トリガー(トリガー名:test_trg)を削除する。 DROP TRIGGER test_trg;

トリガーの情報を表示する

トリガーの情報を表示するには DBA_TRIGGERSデータディクショナリビューを検索します。

トリガーの情報を表示する
SELECT * FROM DBA_TRIGGERS;

データディクショナリビューには、DBA_やUSER_で始まるものもあります。
 違いは参照できる範囲が異なります。

【DBA_TRIGGERSの主要カラム】
カラム内容
OWNERトリガーの所有者
TRIGGER_NAMEトリガー名
TRIGGER_TYPEトリガーの種類
(BEFORE STATEMENT/BEFORE EACH ROW/AFTER STATEMENT/AFTER EACH ROW/INSTEAD OF/COMPOUND)
TRIGGERING_EVENTトリガーが起動するイベント
TABLE_OWNERトリガーが定義されたテーブルの所有者
BASE_OBJECT_TYPEトリガーが定義されているオブジェクト(TABLE/VIEW/SCHEMA/DATABASE)
TABLE_NAMEトリガーが定義されたテーブル名
※トリガーのオブジェクトがSCHEMA/DATABASEの場合はNULL
COLUMN_NAME
REFERENCING_NAMES
WHEN_CLAUSE
STATUSトリガーの使用可否
(ENABLED:使用可能 DISABLED:使用禁止)
DESCRIPTIONトリガーの説明
ACTION_TYPEトリガーの実行形式
("CALL" "PL/SQL")
TRIGGER_BODYトリガーで呼ばれる処理
CROSSEDITION
BEFORE_STATEMENTトリガーにBEFORE STATEMENTセクションがあるかどうか
(YES/NO)
BEFORE_ROWトリガーにBEFORE EACH ROWセクションがあるかどうか
(YES/NO)
AFTER_ROWトリガーにAFTER EACH ROWセクションがあるかどうか
(YES/NO)
AFTER_STATEMENTトリガーにAFTER STATEMENTセクションがあるかどうか
(YES/NO)
INSTEAD_OF_ROWトリガーにINSTEAD OFセクションがあるかどうか
(YES/NO)
FIRE_ONCE
APPLY_SERVER_ONLY

ここで取り上げているカラムは、主要なカラムのみです。

ToTop