ヘッダーをスキップ
Oracle Database PL/SQL言語リファレンス
11g リリース1(11.1)
E05670-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

CREATE TRIGGER文

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

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

トリガー起動の順序 異なるタイミングBEFOREAFTERINSTEAD OF)を持つ2つ以上のトリガーが同じ表の同じ文に対して定義されている場合は、次の順序で起動されます。

場合によっては、異なるタイミングを持つ個々のトリガー群を、必要な順序でアクションを明示的にコード化した単一の複合トリガーに置き換えます。

同じタイミングを持つ2つ以上のトリガーが定義されており、起動順序が重要である場合は、FOLLOWS句(「FOLLOWS」を参照)を使用して起動順序を制御できます。

表に複数の複合トリガーが指定されている場合、すべてのBEFORE文セクションはBEFORE文のタイミングで、BEFORE行セクションはBEFORE行のタイミングで、というように実行されます。 トリガーの実行順序がFOLLOWS句で指定された場合、複合トリガーのセクションの実行順序はFOLLOWS句によって決まります。 FOLLOWSがすべてのトリガーではなく一部のトリガーのみに指定されている場合、トリガーの実行順序はFOLLOWS句によって関係付けられたトリガーについてのみ保証されます。

前提条件

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

構文

create_trigger ::=

create_trigger
create_trigger_noed.gifの説明

non_dml_trigger ::=trigger_body ::=

simple_dml_trigger ::=

simple_dml_trigger
simple_dml_trigger_noed.gifの説明

dml_event_clause ::=referencing_clause ::=

compound_dml_trigger ::=

compound_dml_trigger
compound_dml_trigger_noed.gifの説明

dml_event_clause ::=referencing_clause ::=

non_dml_trigger ::=

non_dml_trigger
non_dml_trigger_noed.gifの説明

trigger_body ::=

trigger_body
trigger_body.gifの説明

plsql_block ::=compound_trigger_block ::=、『Oracle Database SQL言語リファレンス』のCALL routine_clauseに関する項)

dml_event_clause ::=

dml_event_clause
dml_event_clause.gifの説明

referencing_clause ::=

referencing_clause
referencing_clause.gifの説明

compound_trigger_block ::=

compound_trigger_block
compound_trigger_block.gifの説明

declare_section ::=

timing_point_section ::=

timing_point_section
timing_point_section.gifの説明

tps_body ::=

tps_body
tps_body.gifの説明

declare_section ::=

キーワードとパラメータの説明

OR REPLACE

OR REPLACEを指定すると、トリガーがすでに存在する場合に再作成できます。 この句を指定すると、既存のトリガーの定義を削除せずに変更できます。

schema

トリガーを含めるスキーマを指定します。 schemaを省略すると、データベースによってユーザー自身のスキーマにトリガーが作成されます。

trigger

作成するトリガーの名前を指定します。

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


注意:

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

simple_dml_trigger

この句を使用すると、DMLイベントに1つのトリガーを定義できます。

BEFORE

BEFOREを指定すると、データベースでトリガーを起動するイベントを実行する前にトリガーを起動できます。 行トリガーの場合、影響を受ける各行が変更される前にトリガーが起動されます。

BEFOREトリガーの制限 BEFOREトリガーには、次の制限があります。

AFTER

AFTERを指定すると、データベースでトリガーを起動するイベントを実行した後にトリガーを起動できます。 行トリガーの場合、影響を受ける各行が変更された後にトリガーが起動されます。

AFTERトリガーの制限 AFTERトリガーには、次の制限があります。


注意:

表に対するマテリアライズド・ビュー・ログを作成した場合は、その表にAFTER ROWトリガーが暗黙的に作成されます。 このトリガーは、INSERT文、UPDATE文またはDELETE文でマスター表のデータが変更された場合、常にマテリアライズド・ビュー・ログに1行を挿入します。 複数の行トリガーを起動する順序は制御できません。 したがって、マテリアライズド・ビューの内容に影響するトリガーは記述しないでください。


参照:

マテリアライズド・ビュー・ログの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

INSTEAD OF

INSTEAD OFを指定すると、データベースでトリガーを起動するイベントを実行するかわりに、トリガーを起動することができます。 複合トリガーでINSTEAD OF ROWセクションを指定したときと同じ効果が得られます。


注意:

データベースのファイングレイン・アクセス制御を使用すると、ビューに行レベルのセキュリティ・ポリシーを定義できます。 これらのポリシーによって、DML操作に応じて定義されたルールが適用されます。 ビューにINSTEAD OFトリガーも定義すると、データベースによって行レベルのセキュリティ・ポリシーは適用されません。ビューに対してDMLが実行されるかわりに、INSTEAD OFトリガーが起動されるためです。

dml_event_clause

DML_event_clauseを使用すると、トリガーを起動する3つのDML文のいずれかを指定できます。データベースによって、既存のユーザー・トランザクションでトリガーが起動されます。

DML_event_clauseには、MERGEキーワードを指定できません。 MERGE操作に関連してトリガーを起動する必要がある場合は、MERGE操作の構成要素であるINSERTおよびUPDATE操作に対してトリガーを作成する必要があります。

DELETE DELETEを指定すると、DELETE文で表から行を削除するか、またはネストした表から要素を削除するたびにデータベースでトリガーを起動できます。

INSERT INSERTを指定すると、INSERT文で表に行を挿入するか、またはネストした表に要素を挿入するたびにデータベースでトリガーを起動できます。

UPDATE UPDATEを指定すると、OF句の後に指定したいずれかの列の値をUPDATE文で変更するたびにデータベースでトリガーを起動できます。 OF句を省略すると、UPDATE文で表またはネストした表のいずれかの列の値を変更するたびにデータベースによってトリガーが起動されます。

UPDATEトリガーでは、オブジェクト型、VARRAY型およびREF型の列をOF句の後に指定して、UPDATE文によってこれらのいずれかの列の値が変更されるたびにトリガーが起動されるようにすることができます。 ただし、これらの列の値はトリガー本体では変更できません。


注意:

Oracle Call Interface(OCI)関数またはDBMS_LOBパッケージを使用してオブジェクト列のLOB値またはLOB属性を更新した場合、データベースによってその列または属性を含む表に定義されているトリガーは起動されません。

UPDATE操作でのトリガーの制限 UPDATE句には、次の制限があります。


参照:

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

ネストした表の列にDML操作を直接実行した場合、そのネストした表の列が含まれている表に定義されているトリガーはデータベースによって起動されません。

ON table | view  ON句を使用すると、トリガーが作成されるデータベース・オブジェクトを決定できます。 トリガーを作成する、次のいずれかのschemaおよびtableまたはviewの名前を指定します。

schemaを省略すると、表は自身のスキーマ内に存在するとみなされます。

スキーマの制限 トリガーは、SYSスキーマ内の表には作成できません。

NESTED TABLE句 トリガーが定義されるビューのnested_table_columnを指定します。 このようなトリガーは、DMLの操作対象がネストした表の要素である場合にのみ起動されます。

ネストした表のトリガーの制限 NESTED TABLEは、INSTEAD OFトリガーにのみ指定できます。

referencing_clause

referencing_clauseを使用すると、相関名を指定できます。 相関名は、特に現在の行の新旧の値を参照する場合に、トリガー本体および行トリガーのWHEN条件で使用できます。 デフォルトの相関名はOLDおよびNEWです。 行トリガーをOLDまたはNEWという表に関連付ける場合は、表名と相関名との混乱を回避するために、この句を使用して異なる相関名を指定します。

referencing_clauseの制限 referencing_clauseは、DDLイベントCREATEINSTEAD OFトリガーでは無効です。

FOR EACH ROW

FOR EACH ROWを指定すると、トリガーを行トリガーとして設定できます。行トリガーは、トリガーを起動する文の影響を受け、かつWHEN条件で定義したオプションのトリガー制約を満たす行ごとに1回起動されます。

この句を省略すると、INSTEAD OFトリガー以外のトリガーは文トリガーになります。オプションのトリガー制約が満たされている場合にトリガーを起動する文を発行すると、データベースによって文トリガーが1回のみ起動されます。

INSTEAD OFトリガー文は、各行に対して暗黙的にアクティブになります。

行トリガーの制限 この句は、複合DMLトリガー、DDLトリガーまたはデータベース・イベント・トリガーではなく、単純なDMLトリガーにのみ有効です。

compound_dml_trigger

この句を使用すると、DMLイベントに複合トリガーを定義できます。 COMPOUNDトリガーの本体には、最大4つのセクションを指定できます。したがって、文の前、行の前、行の後または文の後の操作を1つのトリガー内に指定できます。

dml_event_clauseおよびreferencing_clauseは、複合DMLトリガーに対して単純なDMLトリガーと同じセマンティクスを持ちます。

複合トリガーの制限 FOR EACH ROW句は、複合トリガーには指定できません。


参照:

その他の制限については、「複合トリガーの制限」を参照してください。

non_dml_trigger

この句を使用すると、DDLイベントまたはデータベース・イベントに1つのトリガーを定義できます。

ddl_event

トリガーを起動できる1つ以上の種類のDDL文を指定します。 特に指定がないかぎり、DATABASEまたはSCHEMAに対してこれらのイベントのトリガーを作成できます。 これらのイベントにはBEFOREトリガーおよびAFTERトリガーを作成できます。データベースによって既存のユーザー・トランザクションでトリガーが起動されます。

DDLイベントのトリガーの制限 PL/SQLプロシージャを介して実行されたDDL操作は、トリガーを起動するイベントとしては指定できません。

次のddl_event値が有効です。

ALTER ALTERを指定すると、ALTER文でデータ・ディクショナリのデータベース・オブジェクトを変更するたびにトリガーを起動できます。 トリガーは、ALTER DATABASE文では起動されません。

ANALYZE ANALYZEを指定すると、統計情報が収集または削除されるか、またはデータベース・オブジェクトの構造が検証されるたびにトリガーを起動できます。


参照:

SQL文のANALYZEを使用して統計情報を収集する方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

ASSOCIATE STATISTICS ASSOCIATE STATISTICSを指定すると、データベースによって統計タイプがデータベース・オブジェクトに関連付けられるたびにトリガーを起動できます。

AUDIT AUDITを指定すると、SQL文の実行またはスキーマ・オブジェクトに対する操作が追跡されるたびにトリガーを起動できます。

COMMENT COMMENTを指定すると、データベース・オブジェクトに対するコメントがデータ・ディクショナリに追加されるたびにトリガーを起動できます。

CREATE CREATEを指定すると、CREATE文でデータ・ディクショナリに新しいデータベース・オブジェクトを追加するたびにトリガーを起動できます。 トリガーは、CREATE DATABASE文またはCREATE CONTROLFILE文では起動されません。

DISASSOCIATE STATISTICS DISASSOCIATE STATISTICSを指定すると、データベースによって統計タイプがデータベース・オブジェクトとの関連付けを解除されるたびにトリガーを起動できます。

DROP DROPを指定すると、DROP文でデータ・ディクショナリのデータベース・オブジェクトを削除するたびにトリガーを起動できます。

GRANT GRANTを指定すると、ユーザーが別のユーザーまたはロールにシステム権限、ロールまたはオブジェクト権限を付与するたびにトリガーを起動できます。

NOAUDIT NOAUDITを指定すると、NOAUDIT文でスキーマ・オブジェクトでのSQL文または操作の追跡を停止するたびにトリガーを起動できます。

RENAME RENAMEを指定すると、RENAME文でデータベース・オブジェクトの名前を変更するたびにトリガーを起動できます。

REVOKE REVOKEを指定すると、REVOKE文でユーザーまたはロールからシステム権限、ロールまたはオブジェクト権限を取り消すたびにトリガーを起動できます。

TRUNCATE TRUNCATEを指定すると、TRUNCATE文で表またはクラスタから行を削除し、記憶特性を再設定するたびにトリガーを起動できます。

DDL DDLを指定すると、前述のDDL文のいずれかを発行するたびにトリガーを起動できます。

database_event

トリガーを起動できる1つ以上のデータベースの状態を指定します。 特に指定がないかぎり、DATABASEまたはSCHEMAに対してこれらのイベントのトリガーを作成できます。 これらのトリガーを起動する各イベントに対して、データベースによって自律型トランザクションの有効範囲がオープンされ、トリガーが起動されて、(既存のユーザー・トランザクションには関係なく)別のトランザクションがコミットされます。


参照:


各データベース・イベントは、BEFOREトリガーまたはAFTERトリガーのいずれかで有効です。ただし、両方で有効ではありません。 次のdatabase_event値が有効です。

AFTER STARTUP AFTER STARTUPを指定すると、データベースがオープンされるたびにトリガーを起動できます。 このイベントは、DATABASEでのみ有効であり、SCHEMAでは有効ではありません。

BEFORE SHUTDOWN BEFORE SHUTDOWNを指定すると、データベースのインスタンスが停止されるたびにトリガーを起動できます。 このイベントは、DATABASEでのみ有効であり、SCHEMAでは有効ではありません。

AFTER DB_ROLE_CHANGE Data Guardの構成では、AFTER DB_ROLE_CHANGEを指定すると、ロールがスタンバイからプライマリ、またはプライマリからスタンバイに変更されるたびにトリガーを起動できます。 このイベントは、DATABASEでのみ有効であり、SCHEMAでは有効ではありません。

AFTER LOGON AFTER LOGONを指定すると、クライアント・アプリケーションがデータベースにログオンするたびにトリガーを起動できます。

BEFORE LOGOFF  BEFORE LOGOFFを指定すると、クライアント・アプリケーションがデータベースからログオフするたびにトリガーを起動できます。

AFTER SERVERERROR  AFTER SERVERERRORを指定すると、サーバー・エラー・メッセージのログが記録されるたびにトリガーを起動できます。

次のエラーが発生しても、SERVERERRORトリガーは起動されません(stringには文字列が入ります)。

AFTER SUSPEND SUSPENDを指定すると、サーバー・エラーによってトランザクションが停止するたびにトリガーを起動できます。


参照:

自律型トランザクションの詳細は、「自律型トランザクションによる独立した作業単位の実行」を参照してください。

DATABASE DATABASEを指定すると、データベース全体にトリガーを定義できます。 データベース・ユーザーがトリガー・イベントを開始するたびにトリガーが起動されます。

SCHEMA SCHEMAを指定すると、現行のスキーマにトリガーを定義できます。 schemaとして接続しているユーザーがトリガー・イベントを開始するたびにトリガーが起動されます。

FOLLOWS

この句を使用すると、同じタイプの複数のトリガーに相対的な起動順序を指定できます。 FOLLOWSを使用すると、作成されるトリガーが、指定したトリガーの後に起動するように指定できます。

指定したトリガーは、すでに存在している必要があります。また、作成されるトリガーと同じ表に定義されており、正常にコンパイルされている必要があります。 有効になっている必要はありません。

FOLLOWSは、複合トリガー・ターゲットを持つ単純なトリガーの定義、または単純なトリガー・ターゲットを持つ複合トリガーの定義に指定できます。 このような場合、FOLLOWSキーワードは、単純なトリガーと同じタイミングを持つ複合トリガーのセクションにのみ適用されます。 複合トリガーにそのようなタイミングがない場合、FOLLOWSは特に警告もなく無視されます。


参照:

トリガーが起動される順序の詳細は、「トリガー起動の順序」を参照してください。

ENABLE | DISABLE

この句を使用すると、有効または無効な状態でトリガーを作成できます。 無効な状態でトリガーを作成すると、実際に使用する前にトリガーがエラーなしでコンパイルされることを確認できます。

DISABLEを指定すると、トリガーを無効な形式で作成できます。 その後、ALTER TRIGGER ... ENABLEまたはALTER TABLE ... ENABLE ALL TRIGGERS文を発行して、トリガーを有効にできます。 この句を省略すると、トリガーは作成時に有効になります。


参照:

  • ENABLE句の詳細は、「ALTER TRIGGER文」を参照してください。

  • CREATE TABLE ... ENABLE ALL TRIGGERSの使用方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


WHEN句

トリガー条件(データベースでトリガーを起動するために必要なSQL条件)を指定します。 この条件には相関名を指定する必要があります。問合せは指定できません。

NEWおよびOLDキーワードをWHEN句で指定する場合は、バインド変数とみなされないため、コロン(:)を前に付けません。 ただし、WHEN句以外のすべての参照では、NEWおよびOLDの前にコロンを付けて指定する必要があります。


参照:


トリガー条件の制限 トリガー条件には、次の制限があります。

trigger_body

トリガーを起動するためにデータベースによって実行されるPL/SQLブロック、PL/SQL複合トリガー・ブロックまたはコール・プロシージャを指定します。

compound_trigger_block

タイミング部は任意の順序で指定できますが、繰り返して使用することはできません。 複合トリガー・ブロックのdeclare_sectionPRAGMA AUTONOMOUS_TRANSACTIONを含めることはできません。

DMLトリガーの作成: 例 次の例では、BEFORE文トリガーの基本構文を示します。 このようなトリガーは、表に対してDML文を発行できる場合などに、DML文に制限を課すために記述します。

CREATE TRIGGER schema.trigger_name
    BEFORE
    DELETE OR INSERT OR UPDATE
    ON schema.table_name
       pl/sql_block

DML文が表に対して実行されるたびにトリガーが起動されます。 このトリガーは、BEFORE文トリガーであるため、トリガーを起動する文が実行される前にデータベースによって1回起動されます。

次の例では、パーシャルBEFORE行トリガーを示します。 たとえば、PL/SQLブロックによって、従業員の給与が従業員の職種に対して設定された給与の範囲内にあるように指定されたとします。

CREATE TRIGGER hr.salary_check
      BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees
      FOR EACH ROW
         WHEN (new.job_id <> 'AD_VP')
      pl/sql_block

このトリガーは、次の文のいずれかが発行されるたびに起動されます。

salary_checkは、BEFORE行トリガーであるため、UPDATE文で更新される各行を変更する前、またはINSERT文で挿入される各行を追加する前に起動されます。

salary_checkには、管理部門の副社長(AD_VP)の給与を確認できないトリガー条件が設定されています。

DDLトリガーの作成: 例  次の例では、任意のDDL文CREATEAFTER文トリガーを作成します。 このようなトリガーを使用して、自身のスキーマにある新規データ・ディクショナリ・オブジェクトの作成を監査します。

CREATE TRIGGER audit_db_object AFTER CREATE
   ON SCHEMA
      pl/sql_block

トリガー本体のプロシージャのコール: 例 PL/SQLブロック内にトリガー本体を設定するかわりに、プロシージャをコールすることによって、前述の例で記述されたsalary_checkトリガーを作成できます。 従業員の給与が適切な範囲内にあることを確認するcheck_salプロシージャをhrスキーマに定義したとします。 トリガーsalary_checkは、次のようにして作成できます。

CREATE TRIGGER salary_check
   BEFORE INSERT OR UPDATE OF salary, job_id ON employees
   FOR EACH ROW
   WHEN (new.job_id <> 'AD_VP')
   CALL check_sal(:new.job_id, :new.salary, :new.last_name)

check_salプロシージャは、PL/SQL、CまたはJavaで実装できます。 また、:NEW値のかわりにCALL句の:OLD値を指定できます。

データベース・イベント・トリガーの作成: 例 次の例では、すべてのエラーのログを記録するトリガーの基本構文を示します。 仮定のPL/SQLブロックが特定のエラー(無効なログオン: エラー番号は1017)に対して特別な処理を行うとします。 このトリガーは、AFTER文トリガーであるため、文の実行の失敗(ログオンの失敗など)の後で起動されます。

CREATE TRIGGER log_errors AFTER SERVERERROR ON DATABASE
   BEGIN
      IF (IS_SERVERERROR (1017)) THEN
         <special processing of logon error>
      ELSE
         <log error number>
      END IF;
   END;

INSTEAD OFトリガーの作成: 例 次の例では、顧客情報および注文情報を表示するoe.order_infoビューを作成します。

CREATE VIEW order_info AS
   SELECT c.customer_id, c.cust_last_name, c.cust_first_name,
          o.order_id, o.order_date, o.order_status
   FROM customers c, orders o
   WHERE c.customer_id = o.customer_id;

通常、orders表の主キー(order_id)は結合ビューの結果セットで一意でないため、このビューは更新できません。 このビューを更新できるようにするには、ビューにINSTEAD OFトリガーを作成し、ビューに送られるINSERT文を処理します。

CREATE OR REPLACE TRIGGER order_info_insert
   INSTEAD OF INSERT ON order_info
   DECLARE
     duplicate_info EXCEPTION;
     PRAGMA EXCEPTION_INIT (duplicate_info, -00001);
   BEGIN
     INSERT INTO customers
       (customer_id, cust_last_name, cust_first_name)
     VALUES (
     :new.customer_id,
     :new.cust_last_name,
     :new.cust_first_name);
   INSERT INTO orders (order_id, order_date, customer_id)
   VALUES (
     :new.order_id,
     :new.order_date,
     :new.customer_id);
   EXCEPTION
     WHEN duplicate_info THEN
       RAISE_APPLICATION_ERROR (
         num=> -20107,
         msg=> 'Duplicate customer or order ID');
   END order_info_insert;
/

すべてのNOT NULL列に値があるかぎり、ビューを介していずれの実表にも挿入できるようになります。

INSERT INTO order_info VALUES
   (999, 'Smith', 'John', 2500, '13-MAR-2001', 0);

INSTEAD OFトリガーの詳細は、「複合ビューの変更(INSTEAD OFトリガー)」を参照してください。

SCHEMAトリガーの作成: 例 次の例では、サンプル・スキーマhrBEFORE文トリガーを作成します。 hrとして接続しているユーザーがデータベース・オブジェクトを削除しようとすると、オブジェクトの削除前に、データベースによってこのトリガーが起動されます。

CREATE OR REPLACE TRIGGER drop_trigger
   BEFORE DROP ON hr.SCHEMA
   BEGIN
      RAISE_APPLICATION_ERROR (
         num => -20000,
         msg => 'Cannot drop object');
   END;
/

関連トピック