日本語PDF

14.12 CREATE TRIGGER文

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 ::=

dml_event_clause ::=

referencing_clause ::=

trigger_edition_clause ::=

trigger_ordering_clause ::=

timing_point_section ::=

timing_point ::=

セマンティクス

create_trigger

OR REPLACE

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

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

[ EDITIONABLE | NONEDITIONABLE ]

schemaでスキーマ・オブジェクト・タイプTRIGGERに対してエディションが有効になっている場合に、トリガーがエディション・オブジェクトまたは非エディション・オブジェクトのどちらになるかを指定します。デフォルト: EDITIONABLE。エディション・オブジェクトと非エディション・オブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。

NONEDITIONABLEの制限

crosseditionトリガーに対してNONEDITIONABLEを指定できません。

create_triggerの制限

トリガーの制限を参照してください。

plsql_trigger_source

schema

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

trigger

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

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

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

ノート:

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

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行を挿入します。複数の行トリガーを起動する順序は制御できません。したがって、マテリアライズド・ビューの内容に影響するトリガーは記述しないでください。

関連項目:

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 DMLトリガー」を参照してください。

関連項目:

ビューに対する挿入、更新または削除を禁止する構造体の詳細は、『Oracle Database SQL言語リファレンス』CREATE VIEWAS 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文である必要があります。

  • 最大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

    Oracle 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)の制限

  • この句は、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内の表に対してトリガーを作成することはできません。

view

トリガーが作成されるデータベース・ビューまたはオブジェクト・ビューの名前。

ノート:

非エディショニング・ビューに対して作成された複合DMLトリガーは、そのタイミング部が1つのみであるため、正確には複合トリガーではありません。

referencing_clause

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

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

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

referencing_clauseの制限

trigger_bodyCALLルーチンの場合、referencing_clauseは有効ではありません。

DMLの行レベルのトリガーは、USING_NLS_COMP以外の宣言された照合が含まれる列に対応する、OLD/NEW/PARENT疑似レコード(相関名)のフィールドを参照できません。

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_blockdeclare_sectionPRAGMA AUTONOMOUS_TRANSACTIONを含めることはできません。

timing_point

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

  • 例9-1トリガーによる条件述語を使用したトリガーを起動する文の検出

  • 例9-2INSTEAD OFトリガー

  • 例9-3ビューのネストした表の列に対するINSTEAD OFトリガー

  • 例9-4複合トリガーによる、別の表にある表に対する変更のログへの記録

  • 例9-5複合トリガーによる変更表エラーの回避

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

  • 例9-6子表に対する外部キー・トリガー

  • 例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-17REFERENCING句のあるトリガー

  • 例9-18トリガーによるOBJECT_VALUE疑似列の参照

システム・トリガー

  • 例9-19サンプル・スキーマHRに対するBEFORE文トリガー

  • 例9-20データベースに対するAFTER文トリガー

  • 例9-21トリガーによるログオンの監視

  • 例9-22スキーマに対するINSTEAD OF CREATEトリガー

その他のトリガーの例

  • 例9-23トリガーによるJavaサブプログラムの起動

  • 例9-24リモート・データベースが使用できない場合に例外を処理できないトリガー

  • 例9-25リモート・データベースが使用できない場合に例外を処理できないトリガーに対する回避策

  • 例9-26トリガーによる変更表エラー

  • 例9-27更新カスケード

  • 例9-28トリガーに関する情報の表示

関連トピック

この章:

他の章:

関連項目:

crosseditionトリガーの詳細は、『Oracle Database開発ガイド』を参照してください。