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_で始まるものもあります。
違いは参照できる範囲が異なります。
カラム | 内容 |
---|---|
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 |
ここで取り上げているカラムは、主要なカラムのみです。