CREATE
TRIGGER
文は、次のいずれかのデータベース・トリガーを作成するか、または置き換えます。
表、ビュー、スキーマまたはデータベースに関連付けられているストアドPL/SQLブロック
無名PL/SQLブロック、あるいはPL/SQLまたはJavaで実装されているプロシージャの起動
指定された条件が発生した場合、トリガーは自動的に実行されます。
ここでのトピック
前提条件
自分のスキーマ内の表または自分のスキーマ(SCHEMA
)に対するトリガーを自分のスキーマ内に作成する場合は、CREATE
TRIGGER
システム権限が必要です。
任意のスキーマ内の表または別のユーザーのスキーマ(schema
.SCHEMA
)に対するトリガーを任意のスキーマ内に作成する場合は、CREATE
ANY
TRIGGER
システム権限が必要です。
前述の権限に加えて、DATABASE
に対するトリガーを作成する場合は、ADMINISTER
DATABASE
TRIGGER
システム権限が必要です。
プラガブル・データベース(PDB)に対するトリガーを作成する場合は、そのPDBに接続し、ADMINISTER
DATABASE
TRIGGER
システム権限を持っていることが必要です。PDBの詳細は、『Oracle Database管理者ガイド』を参照してください。
前述の権限に加えて、crosseditionトリガーを作成する場合は、エディションが有効になっている必要があります。ユーザーに対するエディションの有効化の詳細は、『Oracle Database開発ガイド』を参照してください。
トリガーがSQL文を発行するか、あるいはプロシージャまたはファンクションを起動する場合、そのトリガーの所有者には、これらの操作を行うための権限が必要です。これらの権限は、ロールを介して付与するのではなく、所有者に直接付与する必要があります。
構文
create_trigger ::=
plsql_trigger_source ::=
参照:
simple_dml_trigger ::=
参照:
instead_of_dml_trigger ::=
参照:
compound_dml_trigger ::=
参照:
dml_event_clause ::=
referencing_clause ::=
trigger_edition_clause ::=
trigger_ordering_clause ::=
trigger_body ::=
参照:
『Oracle Database SQL言語リファレンス』のroutine_clause
timing_point_section ::=
timing_point ::=
セマンティクス
create_trigger
OR REPLACE
トリガーが存在する場合は、トリガーを再作成し、再コンパイルします。
再定義する前のトリガーに対する権限を付与されていたユーザーは、権限を再付与される必要なく、プロシージャにアクセスできます。
[ EDITIONABLE | NONEDITIONABLE ]
schema
でスキーマ・オブジェクト・タイプTRIGGER
に対してエディションが有効になっている場合に、トリガーがエディション・オブジェクトまたは非エディション・オブジェクトのどちらになるかを指定します。デフォルト: EDITIONABLE
。エディション・オブジェクトと非エディション・オブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。
NONEDITIONABLEの制限
crosseditionトリガーに対してNONEDITIONABLE
を指定できません。
plsql_trigger_source
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
フィールドを読み取れますが、書き込めません。)
注意:
表に対するマテリアライズド・ビュー・ログを作成した場合は、その表にAFTER
行トリガーが暗黙的に作成されます。このトリガーは、INSERT
文、UPDATE
文またはDELETE
文でマスター表のデータが変更された場合、常にマテリアライズド・ビュー・ログに1行を挿入します。複数の行トリガーを起動する順序は制御できません。したがって、マテリアライズド・ビューの内容に影響するトリガーは記述しないでください。
関連項目:
マテリアライズド・ビュー・ログの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
エディショニング・ビューの詳細は、『Oracle Database開発ガイド』を参照してください。
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
値を読み取ることができますが、変更することはできません。
注意:
ビューが本質的に更新可能であり、そのビューにINSTEAD
OF
トリガーがある場合は、トリガーが優先されます。ビューでDMLを実行するかわりに、トリガーが起動されます。
ビューが階層に属する場合、サブビューはトリガーを継承しません。
ビューのWITH
CHECK
OPTION
は、INSTEAD
OF
トリガーを使用してビューに対する挿入または更新を行う場合は実行されません。INSTEAD
OF
トリガー本体でチェックを実行する必要があります。WITH
CHECK
OPTION
の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
データベースのファイングレイン・アクセス制御を使用すると、ビューに行レベルのセキュリティ・ポリシーを定義できます。これらのポリシーによって、DML操作に応じて指定されたルールが適用されます。ビューにINSTEAD
OF
トリガーも定義すると、データベースでは、ビューに対してDMLが実行されるかわりに、INSTEAD
OF
トリガーが起動されるため、行レベルのセキュリティ・ポリシーは適用されません。
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 DMLトリガー」を参照してください。
関連項目:
ビューに対する挿入、更新または削除を禁止する構造体の詳細は、『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
文である必要があります。
最大1つのINSTEAD
OF
DDLトリガー(non_dml_trigger
)を作成できます。
たとえば、データベースまたはスキーマでINSTEAD
OF
トリガーを作成できますが、データベースとスキーマの両方でこれを作成できません。
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
に対してこれらのイベントのトリガーを作成できます。これらのトリガーを起動する各イベントに対して、データベースによって自律型トランザクションの有効範囲がオープンされ、トリガーが起動されて、(既存のユーザー・トランザクションには関係なく)別のトランザクションがコミットされます。
AFTER
STARTUP
データベースがオープンされるたびにデータベースによってトリガーを起動できます。このイベントは、DATABASE
でのみ有効であり、SCHEMA
では有効ではありません。
BEFORE
SHUTDOWN
データベースのインスタンスが停止されるたびにデータベースによってトリガーを起動できます。このイベントは、DATABASE
でのみ有効であり、SCHEMA
では有効ではありません。
AFTER
DB_ROLE_CHANGE
Data Guardの構成では、ロールがスタンバイからプライマリ、またはプライマリからスタンバイに変更されるたびにデータベースによってトリガーを起動できます。このイベントは、DATABASE
でのみ有効であり、SCHEMA
では有効ではありません。
注意:
PDBに対してAFTER
DB_ROLE_CHANGE
トリガーを作成することはできません。
AFTER
SERVERERROR
次の条件の両方が該当するたびに、データベースによってトリガーを起動できます。
サーバー・エラー・メッセージがログに記録される。
Oracleリレーショナル・データベース管理システム(RDBMS)が、エラー・トリガーを起動することが妥当であると判断する。
次のような場合は、エラー・トリガーを起動することが妥当ではありません。
RDBMSが起動中である。
クリティカル・エラーが発生した。
AFTER
LOGON
クライアント・アプリケーションがデータベースにログオンするたびにデータベースによってトリガーを起動できます。
BEFORE
LOGOFF
クライアント・アプリケーションがデータベースからログオフするたびにデータベースによってトリガーを起動できます。
AFTER
SUSPEND
サーバー・エラーによってトランザクションが停止するたびにデータベースによってトリガーを起動できます。
AFTER
CLONE
PLUGGABLE
DATABASE
が指定されている場合にのみ指定できます。PDBのコピー(クローン作成)後に、データベースが新しいPDB内でトリガーを起動した後、トリガーを削除します。トリガーが失敗すると、コピー操作は失敗します。
BEFORE
UNPLUG
PLUGGABLE
DATABASE
が指定されている場合にのみ指定できます。PDBの切断前に、データベースがトリガーを起動した後、削除します。トリガーが失敗すると、切断操作は失敗します。
[ BEFORE
| AFTER
] SET
CONTAINER
ALTER
SESSION
SET
CONTAINER
文を実行する前または後のいずれかで、データベースによってトリガーを起動できます。
関連項目:
トリガーを介したデータベース・イベントに対する応答の詳細は、「イベントをパブリッシュするトリガー」を参照してください
[schema.]SCHEMA
指定したスキーマにトリガーを定義します。デフォルト: 現行のスキーマ。指定したスキーマとして接続しているユーザーがトリガー・イベントを開始するたびにトリガーが起動されます。
[ PLUGGABLE ] DATABASE
DATABASE
はルートに対するトリガーを定義します。マルチテナント・コンテナ・データベース(CDB)では、ルートに接続している共通ユーザーのみがデータベース全体に対するトリガーを作成できます。
PLUGGABLE
DATABASE
は接続しているPDBに対するトリガーを定義します。
指定したデータベースまたはPDBのユーザーがトリガーを起動するイベントを開始するたびにトリガーが起動されます。
注意:
PDBに接続している場合は、PDBにのみ適用されるオプション(CLONE
またはUNPLUG
など)を指定しないかぎり、DATABASE
を指定することはPLUGGABLE
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
内の表に対してトリガーを作成することはできません。
view
トリガーが作成されるデータベース・ビューまたはオブジェクト・ビューの名前。
注意:
非エディショニング・ビューに対して作成された複合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トリガーはビューに対しては定義できません。
crosseditionトリガーに対してNONEDITIONABLE
を指定できません。
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_dml_trigger
に属します。
compound_trigger_block
非エディショニング・ビューに対してトリガーを作成する場合は、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
を含めることはできません。
関連項目:
timing_point
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
の変数を宣言できません。
例
DMLトリガー
例9-1、トリガーによる条件述語を使用したトリガーを起動する文の検出
例9-2、INSTEAD OFトリガー
例9-3、ビューのネストした表の列に対するINSTEAD OFトリガー
例9-4、複合トリガーによる、別の表にある表に対する変更のログへの記録
例9-5、複合トリガーによる変更表エラーの回避
参照整合性を保証するトリガー
例9-7、親表に対するUPDATEおよびDELETE RESTRICTトリガー
例9-8、親表に対するUPDATEおよびDELETE SET NULLトリガー
例9-9、親表に対するDELETE CASCADEトリガー
例9-10、親表に対するUPDATE CASCADEトリガー
例9-11、トリガーによる複雑な制約のチェック
例9-12、トリガーによるセキュリティ認可の施行
例9-13、トリガーによる新しい列値の導出
相関名および疑似レコードを使用するトリガー
例9-14、トリガーによるEMPLOYEES.SALARYの変更の記録
例9-15、条件付きトリガーによる給与変更情報の出力
例9-16、トリガーによるCLOB列の変更
例9-17、REFERENCING句のあるトリガー
例9-18、トリガーによるOBJECT_VALUE疑似列の参照
システム・トリガー
例9-19、サンプル・スキーマHRに対するBEFORE文トリガー
例9-20、データベースに対するAFTER文トリガー
例9-21、トリガーによるログオンの監視
例9-22、スキーマに対するINSTEAD OF CREATEトリガー
その他のトリガーの例
関連トピック
この章:
他の章:
関連項目:
crosseditionトリガーの詳細は、『Oracle Database開発ガイド』を参照してください。