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 の値を読み取ることができますが、: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:トリガーtri1_tの後にトリガーtri2_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