CREATE TRIGGER文は、次のいずれかのデータベース・トリガーを作成するか、または置き換えます。
表、スキーマまたはデータベースに関連付けられているストアドPL/SQLブロック
無名PL/SQLブロック、あるいはPL/SQLまたはJavaで実装されているプロシージャの起動
指定された条件が発生した場合、トリガーは自動的に実行されます。
ここでのトピック
前提条件
自分のスキーマ内の表または自分のスキーマ(SCHEMA)に対するトリガーを自分のスキーマ内に作成する場合は、CREATE TRIGGERシステム権限が必要です。
任意のスキーマ内の表または別のユーザーのスキーマ(schema.SCHEMA)に対するトリガーを任意のスキーマ内に作成する場合は、CREATE ANY TRIGGERシステム権限が必要です。
前述の権限に加えて、DATABASEに対するトリガーを作成する場合は、ADMINISTER DATABASE TRIGGERシステム権限が必要です。
前述の権限に加えて、crosseditionトリガーを作成する場合は、エディションが有効になっている必要があります。ユーザーに対するエディションの有効化の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。
トリガーがSQL文を発行するか、あるいはプロシージャまたはファンクションを起動する場合、そのトリガーの所有者には、これらの操作を行うための権限が必要です。これらの権限は、ロールを介して付与するのではなく、所有者に直接付与する必要があります。
構文
create_trigger ::=

plsql_trigger_source ::=

参照:
simple_dml_trigger ::=

参照:
instead_of_dml_trigger ::=

参照:
compound_dml_trigger ::=

参照:
system_trigger ::=

dml_event_clause ::=

referencing_clause ::=

trigger_edition_clause ::=

trigger_ordering_clause ::=

trigger_body ::=

参照:
『Oracle Database SQL言語リファレンス』のroutine_clause
compound_trigger_block ::=

「declare_section ::=」を参照してください。
timing_point_section ::=

timing_point ::=

tps_body ::=

参照:
セマンティクス
OR REPLACE
トリガーが存在する場合は、トリガーを再作成し、再コンパイルします。
再定義する前のトリガーに対する権限を付与されていたユーザーは、権限を再付与される必要なく、プロシージャにアクセスできます。
schema
作成するトリガーに対するスキーマの名前。デフォルト: 自分のスキーマ。
trigger
作成するトリガーの名前。
同じスキーマ内のトリガーには同じ名前を付けることができません。トリガーには、他のスキーマ・オブジェクトと同じ名前を付けることができます(たとえば、表とトリガーは同じ名前でもかまいませんが、混乱を避けるため、違う名前を付けることをお薦めします)。
トリガーでコンパイル・エラーが発生した場合、そのトリガーは作成されますが実行時に正常に処理されません。トリガーを正常に実行できない場合、トリガーが無効にされるか、コンパイル・エラーのないバージョンに置き換えられるか、または削除されるまで、トリガーを起動するすべてのDML文は実行できません。関連付けられているコンパイラ・エラー・メッセージは、SQL*PlusコマンドSHOW ERRORSを使用して確認できます。
|
注意: マテリアライズド・ビューの実表にトリガーを作成する場合は、トリガーがマテリアライズド・ビューのリフレッシュ中に起動されないようにする必要があります。リフレッシュ中、DBMS_MVIEWプロシージャI_AM_A_REFRESHはTRUEを戻します。 |
create_triggerの制限 「トリガーの制限」を参照してください。
simple_dml_trigger
単純なDMLトリガーを作成します(「DMLトリガー」を参照)。
BEFORE
トリガーを起動するイベントを実行する前にデータベースによってトリガーを起動できます。行トリガーの場合、影響を受ける各行が変更される前にトリガーが起動されます。
BEFOREの制限
BEFOREトリガーは、エディショニング・ビュー以外のビューには指定できません。
BEFORE文トリガーでは、トリガー本体は:NEWまたは:OLDを読み取ることはできません。(BEFORE行トリガーでは、トリガー本体は:OLDおよび:NEWフィールドの読取りと書込みを行えます。)
AFTER
トリガーを起動するイベントを実行した後にデータベースによってトリガーを起動できます。行トリガーの場合、影響を受ける各行が変更された後にトリガーが起動されます。
AFTERの制限
AFTERトリガーは、エディショニング・ビュー以外のビューには指定できません。
AFTER文トリガーでは、トリガー本体は:NEWまたは:OLDを読み取ることはできません。(AFTER行トリガーでは、トリガー本体は:OLDおよび:NEWフィールドを読み取れますが、書き込めません。)
|
関連項目:
|
FOR EACH ROW
トリガーを行トリガーとして作成します。トリガーを起動する文の影響を受け、WHEN条件で定義されているオプションのトリガー制約を満たす各行に対して、データベースによって行トリガーが起動されます。
この句を省略した場合、トリガーは文トリガーになります。オプションのトリガー制約が満たされている場合にトリガーを起動する文が発行されたときのみ、データベースによって文トリガーが起動されます。
[ ENABLE | DISABLE ]
トリガーを有効(デフォルト)または無効な状態で作成します。無効な状態でトリガーを作成すると、有効化する前にトリガーがエラーなしでコンパイルされることを確認できます。
|
注意: DISABLEは、crosseditionトリガーを作成する場合に特に役立ちます。crosseditionトリガーは、コンパイル・エラーが発生した場合にオンライン・アプリケーションの再定義に影響を与えるためです。 |
WHEN (condition)
トリガーを起動する文に影響を受ける行ごとにデータベースで評価されるSQL条件を指定します。影響を受ける行に対してconditionの値がTRUEの場合は、その行に対してtrigger_bodyが実行されますが、それ以外の場合は、その行に対してtrigger_bodyは実行されません。トリガーを起動する文は、conditionの値に関係なく実行されます。
conditionには相関名を指定できます(「referencing_clause ::=」を参照)。conditionでは、相関名NEW、OLDまたはPARENTの前にコロン(:)を付けないでください(このコンテキストでは、相関名はバインド変数のプレースホルダではありません)。
|
関連項目: SQL条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
WHEN (condition)の制限
この句を指定する場合は、FOR EACH ROWも指定する必要があります。
conditionには、副問合せまたはPL/SQL式(ユーザー定義のファンクションの起動など)を含めることはできません。
trigger_body
データベースがトリガーを起動するために実行するPL/SQLブロックまたはCALLサブプログラム。CALLサブプログラムは、PL/SQLサブプログラムまたはPL/SQLラッパー内のJavaサブプログラムのいずれかです。
trigger_bodyがPL/SQLブロックの場合、ブロック内にエラーがあると、CREATE [OR REPLACE]文は失敗します。
trigger_bodyの制限 declare_sectionでは、データ型LONGまたはLONG RAWの変数を宣言できません。
instead_of_dml_trigger
INSTEAD OF DMLトリガーを作成します(「INSTEAD OF DMLトリガー」を参照)。
INSTEAD OFの制限 INSTEAD OFトリガーは、OLD値およびNEW値を読み取ることができますが、変更することはできません。
DELETE
トリガーが非エディショニング・ビューで作成される場合、DELETEにより、非エディショニング・ビューが定義されている表からDELETE文によって行が削除されるたびにデータベースによりトリガーが起動されるようになります。
トリガーが非エディショニング・ビューのネストした表の列で作成される場合、DELETEにより、ネストした表からDELETE文によって要素が削除されるたびにデータベースによりトリガーが起動されるようになります。
INSERT
トリガーが非エディショニング・ビューで作成される場合、INSERTにより、非エディショニング・ビューが定義されている表にINSERT文によって行が追加されるたびにデータベースによりトリガーが起動されるようになります。
トリガーが非エディショニング・ビューのネストした表の列で作成される場合、INSERTにより、ネストした表にINSERT文によって要素が追加されるたびにデータベースによりトリガーが起動されるようになります。
UPDATE
トリガーが非エディショニング・ビューで作成される場合、UPDATEにより、非エディショニング・ビューが定義されている表の列の値がUPDATE文によって変更されるたびにデータベースによりトリガーが起動されるようになります。
トリガーが非エディショニング・ビューのネストした表の列で作成される場合、UPDATEにより、ネストした表の列の値がUPDATE文によって変更されるたびにデータベースによりトリガーが起動されるようになります。
nested_table_column
トリガーを作成するnested_table_columnの名前。トリガーは、DMLの操作対象がネストした表の要素である場合にのみ起動されます。ネストした表の列にDML操作を直接実行した場合、そのネストした表の列が含まれている表に定義されているトリガーはデータベースによって起動されません。詳細は、「ビューのネストした表の列に対するINSTEAD OFトリガー」を参照してください。
|
関連項目: ビューに対する挿入、更新または削除を禁止する構造体の詳細は、『Oracle Database SQL言語リファレンス』の「CREATE VIEW」のAS subquery句に関する項を参照してください。 |
schema
非エディショニング・ビューが含まれるスキーマの名前。デフォルト: 自分のスキーマ。
noneditioning_view
nested_table_columnを指定する場合、noneditioning_viewはnested_table_columnを含む非エディショニング・ビューの名前です。それ以外の場合は、noneditioning_viewはトリガーを作成する非エディショニング・ビューの名前です。
FOR EACH ROW
INSTEAD OFトリガーは常に行トリガーであるため、ドキュメントでのみ使用します。
ENABLE
(デフォルト)有効な状態でトリガーを作成します。
DISABLE
無効な状態でトリガーを作成すると、有効化する前にトリガーがエラーなしでコンパイルされることを確認できます。
|
注意: DISABLEは、crosseditionトリガーを作成する場合に特に役立ちます。crosseditionトリガーは、コンパイル・エラーが発生した場合にオンライン・アプリケーションの再定義に影響を与えるためです。 |
trigger_body
データベースがトリガーを起動するために実行するPL/SQLブロックまたはCALLサブプログラム。CALLサブプログラムは、PL/SQLサブプログラムまたはPL/SQLラッパー内のJavaサブプログラムのいずれかです。
trigger_bodyがPL/SQLブロックの場合、ブロック内にエラーがあると、CREATE [OR REPLACE]文は失敗します。
trigger_bodyの制限 declare_sectionでは、データ型LONGまたはLONG RAWの変数を宣言できません。
compound_dml_trigger
複合DMLトリガーを作成します(「複合DMLトリガー」を参照)。
ENABLE
(デフォルト)有効な状態でトリガーを作成します。
DISABLE
無効な状態でトリガーを作成すると、有効化する前にトリガーがエラーなしでコンパイルされることを確認できます。
|
注意: DISABLEは、crosseditionトリガーを作成する場合に特に役立ちます。crosseditionトリガーは、コンパイル・エラーが発生した場合にオンライン・アプリケーションの再定義に影響を与えるためです。 |
WHEN (condition)
トリガーを起動する文に影響を受ける行ごとにデータベースで評価されるSQL条件を指定します。影響を受ける行に対してconditionの値がTRUEの場合は、その行に対してtps_bodyが実行されますが、それ以外の場合は、その行に対してtps_bodyは実行されません。トリガーを起動する文は、conditionの値に関係なく実行されます。
conditionには相関名を指定できます(「referencing_clause ::=」を参照)。conditionでは、相関名NEW、OLDまたはPARENTの前にコロン(:)を付けないでください(このコンテキストでは、相関名はバインド変数のプレースホルダではありません)。
|
関連項目: SQL条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
WHEN (condition)の制限
この句を指定する場合は、少なくとも次のタイミングのいずれかも指定する必要があります。
BEFORE EACH ROW
AFTER EACH ROW
INSTEAD OF EACH ROW
conditionには、副問合せまたはPL/SQL式(ユーザー定義のファンクションの起動など)を含めることはできません。
system_trigger
システム・トリガーを定義します(「システム・トリガー」を参照)。
BEFORE
トリガーを起動するイベントを実行する前にデータベースによってトリガーを起動できます。
AFTER
トリガーを起動するイベントを実行した後にデータベースによってトリガーを起動できます。
INSTEAD OF
INSTEAD OFトリガーを作成します。
INSTEAD OFの制限 トリガー・イベントは、CREATE文である必要があります。
ddl_event
トリガーを起動できる1つ以上の種類のDDL SQL文。特に指定がないかぎり、DATABASEまたはSCHEMAに対してこれらのイベントのトリガーを作成できます。これらのうちどのイベントに対してでもBEFOREおよびAFTERトリガーを作成できますが、INSTEAD OFトリガーを作成できるのはCREATEイベントに対してのみです。データベースは既存のユーザー・トランザクションでトリガーを起動します。
|
注意: 一部のオブジェクトは、PL/SQL APIを使用して作成、変更および削除されます(たとえば、スケジューラ・ジョブはDBMS_SCHEDULERパッケージ内のサブプログラムによって管理されます)。このようなPL/SQLサブプログラムでは、DDLトリガーは起動されません。 |
次のddl_event値が有効です。
ALTER
ALTER文でデータ・ディクショナリのデータベース・オブジェクトを変更するたびにデータベースによってトリガーを起動できます。ALTER DATABASE文ではトリガーは起動されません。
ANALYZE
統計情報が収集または削除されるか、またはデータベース・オブジェクトの構造が検証されるたびにデータベースによってトリガーを起動できます。
|
関連項目: SQL文のANALYZEを使用して統計情報を収集する方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
ASSOCIATE STATISTICS
データベースで統計タイプがデータベース・オブジェクトに関連付けられるたびにデータベースによってトリガーを起動できます。
AUDIT
AUDIT文が発行されるたびにデータベースによってトリガーを起動できます。
COMMENT
データベース・オブジェクトに対するコメントがデータ・ディクショナリに追加されるたびにデータベースによってトリガーを起動できます。
CREATE
CREATE文でデータ・ディクショナリにデータベース・オブジェクトを追加するたびにデータベースによってトリガーを起動できます。CREATE DATABASE文またはCREATE CONTROLFILE文ではトリガーは起動されません。
DISASSOCIATE STATISTICS
データベースで統計タイプがデータベース・オブジェクトとの関連付けを解除されるたびにデータベースによってトリガーを起動できます。
DROP
DROP文でデータ・ディクショナリからデータベース・オブジェクトが削除されるたびにデータベースによってトリガーを起動できます。
GRANT
ユーザーが別のユーザーまたはロールにシステム権限、ロールまたはオブジェクト権限を付与するたびにデータベースによってトリガーを起動できます。
NOAUDIT
NOAUDIT文が発行されるたびにデータベースによってトリガーを起動できます。
RENAME
RENAME文でデータベース・オブジェクトの名前を変更するたびにデータベースによってトリガーを起動できます。
REVOKE
REVOKE文でユーザーまたはロールからシステム権限、ロールまたはオブジェクト権限を取り消すたびにデータベースによってトリガーを起動できます。
TRUNCATE
TRUNCATE文で表またはクラスタから行を削除し、記憶特性を再設定するたびにデータベースによってトリガーを起動できます。
DDL
前述のDDL文のいずれかを発行するたびにデータベースによってトリガーを起動できます。
database_event
次のいずれかのデータベース・イベント。特に指定がないかぎり、DATABASEまたはSCHEMAに対してこれらのイベントのトリガーを作成できます。各データベース・イベントは、BEFOREトリガーまたはAFTERトリガーのいずれかで有効ですが、両方では有効ではありません。これらのトリガーを起動する各イベントに対して、データベースによって自律型トランザクションの有効範囲がオープンされ、トリガーが起動されて、(既存のユーザー・トランザクションには関係なく)別のトランザクションがコミットされます。
AFTER STARTUP
データベースがオープンされるたびにデータベースによってトリガーを起動できます。このイベントは、DATABASEでのみ有効であり、SCHEMAでは有効ではありません。
BEFORE SHUTDOWN
データベースのインスタンスが停止されるたびにデータベースによってトリガーを起動できます。このイベントは、DATABASEでのみ有効であり、SCHEMAでは有効ではありません。
AFTER DB_ROLE_CHANGE
Data Guardの構成では、ロールがスタンバイからプライマリ、またはプライマリからスタンバイに変更されるたびにデータベースによってトリガーを起動できます。このイベントは、DATABASEでのみ有効であり、SCHEMAでは有効ではありません。
AFTER SERVERERROR
次の条件の両方が該当するたびに、データベースによってトリガーを起動できます。
サーバー・エラー・メッセージがログに記録される。
Oracleリレーショナル・データベース管理システム(RDBMS)が、エラー・トリガーを起動することが妥当であると判断する。
次のような場合は、エラー・トリガーを起動することが妥当ではありません。
RDBMSが起動中である。
クリティカル・エラーが発生した。
AFTER LOGON
クライアント・アプリケーションがデータベースにログオンするたびにデータベースによってトリガーを起動できます。
BEFORE LOGOFF
クライアント・アプリケーションがデータベースからログオフするたびにデータベースによってトリガーを起動できます。
AFTER SUSPEND
サーバー・エラーによってトランザクションが停止するたびにデータベースによってトリガーを起動できます。
[schema.]SCHEMA
指定したスキーマにトリガーを定義します。デフォルト: 現行のスキーマ。指定したスキーマとして接続しているユーザーがトリガー・イベントを開始するたびにトリガーが起動されます。
DATABASE
DATABASEはルートに対するトリガーを定義します。指定したデータベースまたはプラガブル・データベースのユーザーがトリガーを起動するイベントを開始するたびにトリガーが起動されます。
ENABLE
(デフォルト)有効な状態でトリガーを作成します。
DISABLE
無効な状態でトリガーを作成すると、有効化する前にトリガーがエラーなしでコンパイルされることを確認できます。
WHEN (condition)
データベースにより評価されるSQL条件を指定します。conditionの値がTRUEの場合は、その行に対してtrigger_bodyが実行されますが、それ以外の場合は、その行に対してtrigger_bodyは実行されません。トリガーを起動する文は、conditionの値に関係なく実行されます。
|
関連項目: SQL条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
WHEN (condition)の制限
この句は、STARTUP、SHUTDOWNまたはDB_ROLE_CHANGEトリガーには指定できません。
この句をSERVERERRORトリガーに指定する場合は、conditionをERRNO = error_codeにする必要があります。
conditionには、副問合せ、PL/SQL式(ユーザー定義のファンクションの起動など)または相関名を含めることはできません。
trigger_body
データベースがトリガーを起動するために実行するPL/SQLブロックまたはCALLサブプログラム。CALLサブプログラムは、PL/SQLサブプログラムまたはPL/SQLラッパー内のJavaサブプログラムのいずれかです。
trigger_bodyがPL/SQLブロックの場合、ブロック内にエラーがあると、CREATE [OR REPLACE]文は失敗します。
trigger_bodyの制限
declare_sectionでは、データ型LONGまたはLONG RAWの変数を宣言できません。
トリガー本体は、:NEWまたは:OLDフィールドは指定できません。
dml_event_clause
simple_dml_triggerまたはcompound_dml_triggerに対して、トリガーを起動する文を指定します。データベースによって、既存のユーザー・トランザクションでトリガーが起動されます。
DELETE
DELETE文でtableから、またはviewが定義されている表から行を削除するたびに、データベースによってトリガーを起動できます。
INSERT
INSERT文でtableに、またはviewが定義されている表に行を追加するたびに、データベースによってトリガーを起動できます。
UPDATE [ OF column [, column ] ]
指定した列の値をUPDATE文で変更するたびにデータベースによってトリガーを起動できます。デフォルト: UPDATE文でtable、またはviewが定義されている表のいずれかの列の値を変更するたびに、データベースによってトリガーを起動できます。
columnを指定する場合、トリガーの本体でその値を変更することはできません。
schema
トリガーが作成されるデータベース・オブジェクトを含むスキーマの名前。デフォルト: 自分のスキーマ。
table
トリガーが作成されるデータベース表またはオブジェクト表の名前。
schema.tableの制限 トリガーは、SYSスキーマ内の表には作成できません。
ビュー
トリガーが作成されるデータベース・ビューまたはオブジェクト・ビューの名前。
|
注意: 非エディショニング・ビューに対して作成された複合DMLトリガーは、そのタイミング部が1つのみであるため、正確には複合トリガーではありません。 |
referencing_clause
現在の行の新旧の値および親値を参照する相関名を指定します。デフォルト: OLD、NEWおよびPARENT。
トリガーをOLD、NEWまたはPARENTという表に関連付ける場合は、表名と相関名との混乱を回避するために、この句を使用して異なる相関名を指定します。
ネストした表にトリガーが定義されている場合、OLDおよびNEWはネストした表の現在の行を参照し、PARENTは親表の現在の行を参照します。データベースの表またはビューにトリガーが定義されている場合、OLDおよびNEWはデータベースの表またはビューの現在の行を参照し、PARENTは未定義になります。
referencing_clauseの制限 trigger_bodyがCALLルーチンの場合、referencing_clauseは有効ではありません。
trigger_edition_clause
トリガーをcrosseditionトリガーとして作成します。
オンライン・アプリケーションのエディション・ベースの再定義(EBR)時に発生したDML変更の処理には複数のステップが伴う可能性があります。したがって、crosseditionトリガーが複合トリガーでもある可能性が高いでしょう(必須ではありません)。
trigger_edition_clauseの制限 crosseditionトリガーをビューに定義できません。
FORWARD
(デフォルト)forward crosseditionトリガーとしてトリガーを作成します。forward crosseditionトリガーは、データベースを使用するオンライン・アプリケーションにEBRによりパッチ適用またはアップグレードが実行されている間にデータベースにDML変更が加えられた場合に起動するように意図されています。crosseditionトリガーの本体は、このようなDML変更を処理するように設計されているため、アプリケーション・コードに対する変更が完了した後でDML変更を適切に適用できます。
REVERSE
トリガーを、EBRによってパッチ適用またはアップグレードが実行された後のアプリケーションでDML変更が行われると起動される、reverse crosseditionトリガーとして作成します。このトリガーは、パッチ適用またはアップグレードが実行される前にアプリケーションで使用された列または表にデータを伝播します。
|
関連項目: crosseditionトリガーの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。 |
trigger_ordering_clause
FOLLOWS | PRECEDES
同じタイミングを持つ複数のトリガーに相対的な起動を指定します。これは、意図した機能を実現するために特定の順序で起動する必要がある、crosseditionトリガーを作成する場合に特に役立ちます。
FOLLOWSを使用すると、作成されるトリガーが、指定したトリガーの後に起動するように指定できます。FOLLOWSは、通常のトリガーまたはforward crosseditionトリガーに指定できます。
PRECEDESを使用すると、作成中のトリガーが、指定したトリガーの前に起動するように指定できます。PRECEDESは、reverse crosseditionトリガーにのみ指定できます。
指定するトリガーが存在し、正常にコンパイルされている必要があります。有効になっている必要はありません。
crosseditionトリガー以外のトリガーを作成する場合、指定するトリガーは次のすべての条件を満たしている必要があります。
crosseditionトリガー以外のトリガーである。
作成中のトリガーと同じ表に定義されている。
作成中のトリガーと同じエディションで参照できる。
crosseditionトリガーを作成する場合、指定するトリガーは次のすべての条件を満たしている必要があります。
crosseditionトリガーである。
FOLLOWSまたはPRECEDESを指定しない場合は、作成中のトリガーと同じ表または同じエディショニング・ビューに定義されている。
FOLLOWSを指定する場合、指定するトリガーはforward crosseditionトリガーである必要があり、PRECEDESを指定する場合、指定するトリガーはreverse crosseditionトリガーである必要があります。ただし、指定するトリガーが、作成中のトリガーと同じ表または同じエディショニング・ビューにある必要はありません。
作成中のトリガーと同じエディションで参照できる。
次の定義では、A、B、CおよびDはcrosseditionトリガー以外のトリガーまたはforward crosseditionトリガーのいずれかです。
BのFOLLOWS句にAが指定されている場合、BはAの直後に起動されます。
Bの直後にCが起動され、Aの直後にBが起動される場合、CはAの後に間接的に起動されます。
Cの直後にDが起動され、Aの後に間接的にCが起動される場合、DはAの後に間接的に起動されます。
Aの直後またはAの後に間接的にBが起動される場合、BはAの後に明示的に起動されます(つまり、BおよびAが起動される順序は1つ以上のFOLLOWS句で明示的に指定されます)。
次の定義では、A、B、CおよびDはreverse crosseditionトリガーです。
AのPRECEDES句にBが指定されている場合、AはBの直前に起動されます。
Bの直前にAが起動され、Cの直前にBが起動される場合、AはCの前に間接的に起動されます。
Bの直前にAが起動され、Dの前に間接的にBが起動される場合、AはDの前に間接的に起動されます。
Bの直前またはBの前に間接的にAが起動される場合、AはBの前に明示的に起動されます(つまり、AおよびBが起動される順序は1つ以上のPRECEDES句で明示的に指定されます。)
compound_trigger_block
compound_dml_triggerに属します。
非エディショニング・ビューに対してトリガーを作成する場合は、compound_trigger_blockにはINSTEAD OF EACH ROWセクションのみを含める必要があります。
表またはエディショニング・ビューに対してトリガーを作成する場合は、タイミング部は任意の順序で指定できますが、繰り返して使用することはできません。compound_trigger_blockにはINSTEAD OF EACH ROWセクションを含めることはできません。
compound_trigger_blockの制限 compound_trigger_blockのdeclare_sectionには、PRAGMA AUTONOMOUS_TRANSACTIONを含めることはできません。
BEFORE STATEMENT
表またはエディショニング・ビューに対して、compound_dml_triggerのBEFORE STATEMENTセクションを指定します。このセクションにより、トリガーを起動するイベントを実行する前にデータベースによってトリガーを起動できます。
BEFORE STATEMENTの制限 このセクションは:NEWまたは:OLDを指定できません。
BEFORE EACH ROW
表またはエディショニング・ビューに対して、compound_dml_triggerのBEFORE EACH ROWセクションを指定します。このセクションにより、トリガーを起動するイベントを実行する前にデータベースによってトリガーを起動できます。影響を受ける各行が変更される前にトリガーが起動されます。
このセクションでは、:OLDおよび:NEWフィールドの読取りと書込みを行えます。
AFTER STATEMENT
表またはエディショニング・ビューに対して、compound_dml_triggerのAFTER STATEMENTセクションを指定します。このセクションにより、トリガーを起動するイベントを実行した後にデータベースによってトリガーを起動できます。
AFTER STATEMENTの制限 このセクションは:NEWまたは:OLDを指定できません。
AFTER EACH ROW
表またはエディショニング・ビューに対して、compound_dml_triggerのAFTER EACH ROWセクションを指定します。このセクションにより、トリガーを起動するイベントを実行した後にデータベースによってトリガーを起動できます。影響を受ける各行が変更された後にトリガーが起動されます。
このセクションでは、:OLDおよび:NEWフィールドを読み取れますが、書き込めません。
INSTEAD OF EACH ROW
非エディショニング・ビューでcompound_dml_triggerのINSTEAD OF EACH ROWセクション(唯一のタイミング部)を指定します。データベースにより、トリガーを起動するDML文のかわりにtps_bodyが実行されます。詳細は、「INSTEAD OF DMLトリガー」を参照してください。
INSTEAD OF EACH ROWの制限
このセクションは、非エディショニング・ビューのcompound_dml_triggerにのみ指定できます。
このセクションでは、:OLDおよび:NEW値を読み取れますが、書き込めません。
tps_body
データベースがトリガーを起動するために実行するPL/SQLブロックまたはCALLサブプログラム。CALLサブプログラムは、PL/SQLサブプログラムまたはPL/SQLラッパー内のJavaサブプログラムのいずれかです。
tps_bodyがPL/SQLブロックの場合、ブロック内にエラーがあると、CREATE [OR REPLACE]文は失敗します。
tps_bodyの制限 declare_sectionでは、データ型LONGまたはLONG RAWの変数を宣言できません。