システム・トリガー
システム・トリガーは、スキーマまたはデータベースのいずれかに対して作成されます。
このトリガーを起動するイベントは、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では、サンプル・スキーマHR
にBEFORE
文トリガーを作成します。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; /