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:トリガー 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