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 |
ここで取り上げているカラムは、主要なカラムのみです。

