ヘッダーをスキップ
Oracle® Database PL/SQL言語リファレンス
11gリリース2 (11.2)
B56260-09
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

CREATE TRIGGER文

CREATE TRIGGER文は、次のいずれかのデータベース・トリガーを作成するか、または置き換えます。

指定された条件が発生した場合、トリガーは自動的に実行されます。

ここでのトピック

前提条件

  • 自分のスキーマ内の表または自分のスキーマ(SCHEMA)に対するトリガーを自分のスキーマ内に作成する場合は、CREATE TRIGGERシステム権限が必要です。

  • 任意のスキーマ内の表または別のユーザーのスキーマ(schema.SCHEMA)に対するトリガーを任意のスキーマ内に作成する場合は、CREATE ANY TRIGGERシステム権限が必要です。

  • 前述の権限に加えて、DATABASEに対するトリガーを作成する場合は、ADMINISTER DATABASE TRIGGERシステム権限が必要です。

  • 前述の権限に加えて、crosseditionトリガーを作成する場合は、エディションが有効になっている必要があります。ユーザーに対するエディションの有効化の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

トリガーがSQL文を発行するか、あるいはプロシージャまたはファンクションを起動する場合、そのトリガーの所有者には、これらの操作を行うための権限が必要です。これらの権限は、ロールを介して付与するのではなく、所有者に直接付与する必要があります。

構文

create_trigger ::=

create_trigger.gifの説明が続きます。
create_trigger.gifの説明

plsql_trigger_source ::=

plsql_trigger_source.gifの説明が続きます
図plsql_trigger_source.gifの説明

参照:

simple_dml_trigger ::=

simple_dml_trigger.gifの説明が続きます
simple_dml_trigger.gifの説明

参照:

instead_of_dml_trigger ::=

instead_of_trigger.gifの説明が続きます
図instead_of_trigger.gifの説明

参照:

compound_dml_trigger ::=

compound_dml_trigger.gifの説明が続きます
compound_dml_trigger.gifの説明

参照:

system_trigger ::=

system_trigger.gifの説明が続きます
system_trigger.gifの説明

dml_event_clause ::=

dml_event_clause.gifの説明が続きます
dml_event_clause.gifの説明

referencing_clause ::=

referencing_clause.gifの説明が続きます
referencing_clause.gifの説明

trigger_edition_clause ::=

trigger_edition_clause.gifの説明が続きます
trigger_edition_clause.gifの説明

trigger_ordering_clause ::=

trigger_ordering_clause.gifの説明が続きます
trigger_ordering_clause.gifの説明

trigger_body ::=

trigger_body.gifの説明が続きます
trigger_body.gifの説明

参照:

compound_trigger_block ::=

compound_trigger_block.gifの説明が続きます
compound_trigger_block.gifの説明

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

timing_point_section ::=

timing_point_section.gifの説明が続きます
timing_point_section.gifの説明

timing_point ::=

timing_point.gifの説明が続きます
timing_point.gifの説明

tps_body ::=

tps_body.gifの説明が続きます
tps_body.gifの説明

参照:

セマンティクス

OR REPLACE

トリガーが存在する場合は、トリガーを再作成し、再コンパイルします。

再定義する前のトリガーに対する権限を付与されていたユーザーは、権限を再付与される必要なく、プロシージャにアクセスできます。

schema

作成するトリガーに対するスキーマの名前。デフォルト: 自分のスキーマ。

trigger

作成するトリガーの名前。

同じスキーマ内のトリガーには同じ名前を付けることができません。トリガーには、他のスキーマ・オブジェクトと同じ名前を付けることができます(たとえば、表とトリガーは同じ名前でもかまいませんが、混乱を避けるため、違う名前を付けることをお薦めします)。

トリガーでコンパイル・エラーが発生した場合、そのトリガーは作成されますが実行時に正常に処理されません。トリガーを正常に実行できない場合、トリガーが無効にされるか、コンパイル・エラーのないバージョンに置き換えられるか、または削除されるまで、トリガーを起動するすべてのDML文は実行できません。関連付けられているコンパイラ・エラー・メッセージは、SQL*PlusコマンドSHOW ERRORSを使用して確認できます。


注意:

マテリアライズド・ビューの実表にトリガーを作成する場合は、トリガーがマテリアライズド・ビューのリフレッシュ中に起動されないようにする必要があります。リフレッシュ中、DBMS_MVIEWプロシージャI_AM_A_REFRESHTRUEを戻します。

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では、相関名NEWOLDまたは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トリガー」を参照してください。


関連項目:

ビューに対する挿入、更新または削除を禁止する構造体の詳細は、『Oracle Database SQL言語リファレンス』CREATE VIEW」AS subquery句に関する項を参照してください。

schema

非エディショニング・ビューが含まれるスキーマの名前。デフォルト: 自分のスキーマ。

noneditioning_view

nested_table_columnを指定する場合、noneditioning_viewnested_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では、相関名NEWOLDまたは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)の制限 

  • この句は、STARTUPSHUTDOWNまたはDB_ROLE_CHANGEトリガーには指定できません。

  • この句をSERVERERRORトリガーに指定する場合は、conditionERRNO = 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

現在の行の新旧の値および親値を参照する相関名を指定します。デフォルト: OLDNEWおよびPARENT

トリガーをOLDNEWまたはPARENTという表に関連付ける場合は、表名と相関名との混乱を回避するために、この句を使用して異なる相関名を指定します。

ネストした表にトリガーが定義されている場合、OLDおよびNEWはネストした表の現在の行を参照し、PARENTは親表の現在の行を参照します。データベースの表またはビューにトリガーが定義されている場合、OLDおよびNEWはデータベースの表またはビューの現在の行を参照し、PARENTは未定義になります。

referencing_clauseの制限 trigger_bodyCALLルーチンの場合、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_blockdeclare_sectionには、PRAGMA AUTONOMOUS_TRANSACTIONを含めることはできません。

BEFORE STATEMENT

表またはエディショニング・ビューに対して、compound_dml_triggerBEFORE STATEMENTセクションを指定します。このセクションにより、トリガーを起動するイベントを実行する前にデータベースによってトリガーを起動できます。

BEFORE STATEMENTの制限 このセクションは:NEWまたは:OLDを指定できません。

BEFORE EACH ROW

表またはエディショニング・ビューに対して、compound_dml_triggerBEFORE EACH ROWセクションを指定します。このセクションにより、トリガーを起動するイベントを実行する前にデータベースによってトリガーを起動できます。影響を受ける各行が変更される前にトリガーが起動されます。

このセクションでは、:OLDおよび:NEWフィールドの読取りと書込みを行えます。

AFTER STATEMENT

表またはエディショニング・ビューに対して、compound_dml_triggerAFTER STATEMENTセクションを指定します。このセクションにより、トリガーを起動するイベントを実行した後にデータベースによってトリガーを起動できます。

AFTER STATEMENTの制限 このセクションは:NEWまたは:OLDを指定できません。

AFTER EACH ROW

表またはエディショニング・ビューに対して、compound_dml_triggerAFTER EACH ROWセクションを指定します。このセクションにより、トリガーを起動するイベントを実行した後にデータベースによってトリガーを起動できます。影響を受ける各行が変更された後にトリガーが起動されます。

このセクションでは、:OLDおよび:NEWフィールドを読み取れますが、書き込めません。

INSTEAD OF EACH ROW

非エディショニング・ビューでcompound_dml_triggerINSTEAD 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トリガー

INSTEAD OF DMLトリガー

複合DMLトリガー

参照整合性を保証するトリガー

システム・トリガー

トリガーのその他の例

関連トピック

この章:

他の章:


関連項目:

crosseditionトリガーの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。