CREATE TRIGGER ステートメントは、データベーストリガーを作成または置き換えるために使用します。
指定された条件が発生すると、データベースはトリガーを自動的に実行します。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
前提条件
ユーザー自身のスキーマまたはスキーマのテーブルにトリガーを作成するには、CREATE TRIGGER システム権限が必要です。
他のユーザーのスキーマ(schema.SCHEMA)にトリガーを作成するには、CREATE ANY TRIGGER システム権限が必要です。
トリガーがSQLステートメントを実行したり、ストアドプロシージャや関数を呼び出したりする場合、トリガーの所有者はこれらの操作を実行するために必要な権限を持っている必要があります。これらの権限は、ロールを通じてではなく、直接ユーザーに付与されていなければなりません。
構文
create_trigger の構文は次のとおりです:
CREATE [ OR REPLACE ]
TRIGGER plsql_trigger_source
ここで:
plsql_trigger_sourceの構文は次のとおりです:[schema.] trigger_name { simple_dml_trigger | instead_of_dml_trigger | trigger_ordering_clause }simple_dml_triggerの構文は次のとおりです:{ BEFORE | AFTER } dml_event_clause [ referencing_clause ] [ FOR EACH ROW ] [ ENABLE | DISABLE ] [ WHEN ( condition ) ] trigger_bodyinstead_of_dml_triggerの構文は次のとおりです:INSTEAD OF { DELETE | INSERT | UPDATE } [ OR { DELETE | INSERT | UPDATE } ]... ON [ schema. ] view [ referencing_clause ] [ FOR EACH ROW ] [ ENABLE | DISABLE ] trigger_bodytrigger_ordering_clauseの構文は次のとおりです:{ FOLLOWS | PRECEDES } [ schmema.] trigger_name [ , [ schmema.] trigger_name ]...dml_event_clauseの構文は次のとおりです:{ DELETE | INSERT | UPDATE [ OF column [, column ]... ] } [ OR { DELETE | INSERT | UPDATE [ OF column [, column]... ] }...] ON [ schema.] { table | view }referencing_clauseの構文は次のとおりです:REFERENCING { OLD [ AS ] old | NEW [ AS ] new | PARENT [ AS ] parent }..trigger_bodyの構文は次のとおりです:{ plsql_block | CALL routine_clause }
セマンティクス
構文 |
キーワードまたは構文ノード |
説明 |
|
|---|---|---|---|
| create_trigger | OR REPLACE | 既存の場合はトリガーを再作成し、再コンパイルします。トリガーを再定義する前にそのトリガーに対する権限を付与されたユーザーは、再度権限を取得することなく引き続きそのトリガーにアクセスできます。 | |
| create_trigger | trigger_name | 作成するトリガー名。 | |
| plsql_trigger_source | schema | トリガーが存在するスキーマ名。デフォルト値は現在ユーザーのスキーマです。 | |
| plsql_trigger_source | simple_dml_trigger | 簡単なDMLトリガーを作成します。 | |
| plsql_trigger_source | instead_of_dml_trigger | INSTEAD OF DMLトリガーを作成します。INSTEAD OF トリガーは :OLD と :NEW の値を読み取ることはできますが、変更することはできません。 |
|
| plsql_trigger_source | trigger_ordering_clause | 同一時点で発生するトリガーの実行順序を指定します。指定するトリガーは存在し、正常にコンパイル済みである必要がありますが、有効化する必要はありません。 | |
| simple_dml_trigger | BEFORE | データベースがトリガーイベントを実行する前に、対応するトリガーを実行します。行レベルトリガーの場合、各行を変更する前にこのトリガーが実行されます。BEFORE ステートメントレベルトリガーでは、トリガーボディは :NEW または :OLD を読み取ることができません。(BEFORE 行レベルトリガーでは、トリガーボディは :OLD および :NEW フィールドを読み書きできます。) |
|
| simple_dml_trigger | AFTER | データベースがトリガーイベントを実行した後に、対応するトリガーを実行します。行レベルトリガーの場合、各行を変更した後にこのトリガーが実行されます。AFTER ステートメントレベルトリガーでは、トリガーボディは :NEW または :OLD を読み取ることができません。(AFTER 行レベルトリガーでは、トリガーボディは :OLD および :NEW フィールドを読み書きできます。) |
|
| simple_dml_trigger | FOR EACH ROW | トリガーを行レベルトリガーとして作成します。トリガー文が影響を及ぼす行が WHEN 句で定義されたオプションのトリガー制約を満たす場合、データベースはトリガーを実行します。この句を省略した場合、トリガーはステートメントレベルトリガーとなります。オプションのトリガー制約を満たす場合でも、データベースがステートメントレベルトリガーを実行するのは、トリガー文が実行されたときだけです。 |
|
| simple_dml_trigger | [ ENABLE | DISABLE ] | トリガーの作成を有効(デフォルト)または無効にします。無効状態でトリガーを作成すると、トリガーを有効にする前に正しくコンパイルできるようになります。 | |
| simple_dml_trigger | WHEN (condition) | SQL条件を指定します。データベースは、トリガー文が影響を及ぼす各行についてこの条件を評価します。影響を受ける行の condition の値が TRUE の場合、その行で trigger_body が実行されます。そうでない場合、その行では trigger_body は実行されません。条件の値に関係なく、トリガー文は常に実行されます。condition 句内では、関連名 NEW、OLD、PARENT の前にコロン(:)を付けないでください。WHEN (condition) を指定する場合は、FOR EACH ROW も指定する必要があります。condition にはサブクエリやPL式(ユーザー定義関数の呼び出しなど)を含めることはできません。 |
|
| simple_dml_trigger | trigger_body | データベースがトリガーを実行するために使用するPLブロックまたはCALLサブプログラム。CALLサブプログラムはPLでラッピングされたPLサブプログラムです。trigger_bodyがPLブロックであり、エラーを含む場合、CREATE [OR REPLACE]ステートメントの実行は失敗します。 |
|
| simple_dml_trigger | dml_event_clause | トリガー内でDMLイベントをトリガーする条件を定義するために使用します。DMLイベントには、挿入(INSERT)、更新(UPDATE)、削除(DELETE)操作が含まれます。 | |
| instead_of_dml_trigger | view | その上にトリガーを作成するビュー名。 | |
| instead_of_dml_trigger | FOR EACH ROW | INSTEAD OFトリガーは常に行トリガーです。 |
|
| instead_of_dml_trigger | [ ENABLE | DISABLE ] | トリガーを有効または無効にします。デフォルトではトリガーは有効です。無効状態でトリガーを作成し、正しくコンパイルされてから有効にすることで、トリガーを確実に有効化できます。 | |
| instead_of_dml_trigger | DELETE | トリガーがビュー上に作成されている場合、DELETEステートメントがその定義したテーブルから行を削除するたびに、トリガーが実行されます。 |
|
| instead_of_dml_trigger | INSERT | トリガーがビュー上に作成されている場合、INSERTステートメントがその定義したテーブルに行を追加するたびに、データベースがトリガーを実行します。 |
|
| instead_of_dml_trigger | UPDATE | トリガーがビュー上に作成されている場合、UPDATEステートメントがその定義したテーブルの列の値を変更するたびに、データベースがトリガーを実行します。 |
|
| instead_of_dml_trigger | schema | このトリガーが存在するスキーマ名。デフォルト値は現在ユーザーのスキーマです。 | |
| instead_of_dml_trigger | trigger_body | データベースがトリガーを実行するために使用するPLブロックまたはCALLサブプログラム。CALLサブプログラムはPLでラッピングされたPLサブプログラムです。trigger_bodyがPLブロックであり、エラーを含む場合、CREATE [OR REPLACE]ステートメントの実行は失敗します。 |
|
| trigger_ordering_clause | キーワード未指定時 | 同一のタイミングポイントを持つトリガーの実行順序を指定します。指定するトリガーは存在し、正常にコンパイルされていなければなりませんが、必ずしも有効である必要はありません。 | |
| trigger_ordering_clause | FOLLOWS | 作成中のトリガーが、指定されたトリガーの後に実行される必要があることを示します。 | |
| trigger_ordering_clause | PRECEDES | 作成中のトリガーが、指定されたトリガーより前に実行される必要があることを示します。 | |
例
例1:DMLトリガー del_new_region を作成します。
CREATE OR REPLACE TRIGGER del_new_region
BEFORE DELETE ON regions
FOR EACH ROW
WHEN (old.region_id >3)
BEGIN
INSERT INTO reg_his(region_id , region_name )
VALUES( :old.region_id, :old.region_name );
END;
/
例2:トリガー tri2_t を作成し、トリガー tri1_t の後に実行されるようにします。
CREATE SEQUENCE seq_tri INCREMENT BY 1 START WITH 1 NOMAXVALUE MINVALUE 0 NOCYCLE NOCACHE;
CREATE TABLE t(c1 INT, c2 INT);
CREATE TABLE msg (c1 INT PRIMARY KEY, c2 VARCHAR(100));
CREATE OR REPLACE TRIGGER tri1_t BEFORE INSERT ON t FOR EACH ROW
BEGIN
INSERT INTO msg VALUES (seq_tri.NEXTVAL, 'BEFORE INSERT tri1_t');
END;
/
CREATE OR REPLACE TRIGGER tri2_t BEFORE INSERT ON t FOR EACH ROW FOLLOWS tri1_t
BEGIN
INSERT INTO msg VALUES (seq_tri.nextval, 'BEFORE INSERT tri2_t');
END;
/
INSERT INTO t VALUES (1, 1);
obclient> SELECT * FROM msg;
+----+----------------------+
| C1 | C2 |
+----+----------------------+
| 1 | BEFORE INSERT tri1_t |
| 2 | BEFORE INSERT tri2_t |
+----+----------------------+
2 rows in set