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
の変数を宣言できません。