システム・トリガー

システム・トリガーは、スキーマまたはデータベースのいずれかに対して作成されます。

このトリガーを起動するイベントは、DDL文(ddl_eventのリストを参照)またはデータベース操作文(database_eventのリストを参照)で構成されます。

システム・トリガーは、次のいずれかのタイミングで起動されます。

  • トリガーを起動する文が実行される前

    (このトリガーは、BEFORE文トリガーまたは文レベルのBEFOREトリガーと呼ばれます。)

  • トリガーを起動する文が実行された後

    (このトリガーは、AFTER文トリガーまたは文レベルのAFTERトリガーと呼ばれます。)

  • CREATE文を起動するかわり

    (このトリガーは、INSTEAD OF CREATEトリガーと呼ばれます。)

ここでのトピック

SCHEMAトリガー

SCHEMAトリガーは、スキーマに対して作成され、そのスキーマの所有者であるユーザーが現行ユーザーで、トリガー・イベントを開始するたびに起動されます。

user1とuser2の両方がSCHEMAトリガーを所有していて、user2が所有するDRユニットをuser1が起動するとします。DRユニット内では、user2が現行ユーザーになります。したがって、user2が所有するSCHEMAトリガーのトリガー・イベントをDRユニットが開始すると、そのトリガーが起動されます。ただし、user1が所有するSCHEMAトリガーのトリガー・イベントをDRユニットが開始しても、そのトリガーは起動されません。

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

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

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

DATABASEトリガー

DATABASEトリガーは、データベースに対して作成され、データベース・ユーザーがトリガー・イベントを開始するたびに起動されます。

例10-20では、エラーのログを記録するトリガーの基本構文を示します。このトリガーは、文の実行の失敗(ログオンの失敗など)の後で起動されます。

ノート:

AFTER SERVERERRORトリガーは、Oracleリレーショナル・データベース管理システム(RDBMS)が、エラー・トリガーを起動することが妥当であると判断した場合にのみ起動されます。AFTER SERVERERRORトリガーの詳細は、「CREATE TRIGGER文」を参照してください。

例10-21のトリガーは、ユーザーがデータベースにログオンした後にプロシージャcheck_userを実行します。

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

CREATE TRIGGER log_errors
  AFTER SERVERERROR ON DATABASE
  BEGIN
    IF (IS_SERVERERROR (1017)) THEN
      NULL;  -- (substitute code that processes logon error)
    ELSE
      NULL;  -- (substitute code that logs error code)
    END IF;
  END;
/

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

CREATE OR REPLACE TRIGGER check_user
  AFTER LOGON ON DATABASE
  BEGIN
    check_user;
  EXCEPTION
    WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR
        (-20000, 'Unexpected error: '|| DBMS_Utility.Format_Error_Stack);
 END;
/

INSTEAD OF CREATEトリガー

INSTEAD OF CREATEトリガーは、トリガー・イベントがCREATE文であるSCHEMAトリガーです。データベースでは、トリガーを起動する文が実行されるかわりに、トリガー自体が起動されます。

例10-22は、現在のスキーマに対するINSTEAD OF CREATEトリガーの基本構文を示しています。このトリガーは、現在のスキーマの所有者が現在のスキーマでCREATE文を発行すると起動されます。

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

CREATE OR REPLACE TRIGGER t
  INSTEAD OF CREATE ON SCHEMA
  BEGIN
    EXECUTE IMMEDIATE 'CREATE TABLE T (n NUMBER, m NUMBER)';
  END;
/