CREATE TRIGGER ステートメント (PL/SQL)
CREATE TRIGGER ステートメントは、データベース内で PL/SQL トリガーを定義します。
構文
説明
- OR REPLACE
- トリガーの定義が現行のサーバーにある場合にそれを置き換えることを指定します。 既存の定義が実際にドロップされてから、カタログ内で新しい定義が置き換えられます。 トリガーの定義が現行のサーバーにない場合は、このオプションは無視されます。
- trigger-name
- トリガーの名前を指定します。 この名前 (暗黙または明示のスキーマ名を含む) は、カタログ内で既に記述されているトリガーを特定するものであってはなりません (SQLSTATE 42710)。 2 部構成の名前を指定する場合は、スキーマ名の先頭を「SYS」にすることはできません (SQLSTATE 42939)。
- BEFORE
- サブジェクト表の実際の更新による変更がデータベースに適用される前に、関連したトリガー・アクションが適用されることを指定します。
- AFTER
- サブジェクト表の実際の更新による変更がデータベースに適用された後に、関連したトリガー・アクションが適用されることを指定します。
- INSTEAD OF
- サブジェクト・ビューに対するアクションを、ここで関連付けるトリガー・アクションに置換することを指定します。
- trigger-event
- いずれかのイベントがサブジェクト表に適用される際には必ず、トリガーに関連したトリガー・アクションが実行されることを指定します。 イベントは任意の組み合わせで指定できますが、それぞれのイベント (INSERT、DELETE、および UPDATE) を指定できるのは 1 回のみです (SQLSTATE 42613)。
- INSERT
- INSERT 操作がサブジェクト表に適用される際には必ず、トリガーに関連したトリガー・アクションが実行されることを指定します。
- DELETE
- DELETE 操作がサブジェクト表に適用される際には必ず、トリガーに関連したトリガー・アクションが実行されることを指定します。
- UPDATE
- UPDATE 操作がサブジェクト表に適用される際には必ず、トリガーに関連したトリガー・アクションが実行されることを指定します。この動作は、列が指定されているか暗黙指定されているかによって異なります。 オプションの column-name リストが指定されていない場合、表の列はすべて暗黙指定されます。 したがって、column-name リストを省略すると、表の任意列の更新によってトリガーがアクティブになるよう暗黙指定されます。
- OF column-name,...
- それぞれの column-name には、基本表の列を指定する必要があります (SQLSTATE 42703)。 トリガーが BEFORE トリガーの場合は、column-name に ID 列以外の生成された列を指定することはできません (SQLSTATE 42989)。 column-name のリストでは、同じ column-name を複数回使用することはできません (SQLSTATE 42711)。 トリガーがアクティブになるのは、column-name のリストで指定した列の更新時のみです。 この節は INSTEAD OF トリガーには指定できません (SQLSTATE 42613)。
- ON table-name
- BEFORE トリガーまたは AFTER トリガーの定義のサブジェクト表を指定します。 この名前は、基本表か、基本表に解決される別名を指定するものでなければなりません (SQLSTATE 42704 または 42809)。 この名前は、カタログ表 (SQLSTATE 42832)、マテリアライズ照会表 (SQLSTATE 42997)、作成済みの一時表、宣言済み一時表 (SQLSTATE 42995)、またはニックネーム (SQLSTATE 42809) を指定するものであってはなりません。
- REFERENCING
- 遷移変数 の相関名を指定します。 相関名は、トリガー SQL 操作の影響を受ける行セット内の特定の行を指定します。 以下のように correlation-names を指定して列を修飾すると、トリガー SQL 操作の影響を受ける各行をトリガー・アクションで使用できます。
- OLD AS correlation-name
- トリガー SQL 操作の前の時点での行の状態を指定する相関名を指定します。 トリガー・イベントが INSERT の場合、この行の値は NULL 値になります。
- NEW AS correlation-name
- トリガー SQL 操作、および既に実行された BEFORE トリガーの SET ステートメントによって変更されるときの、行の状態を指定する相関名を指定します。 トリガー・イベントが DELETE の場合、この行の値は NULL 値になります。
- FOR EACH ROW
- トリガー SQL 操作の影響を受けるサブジェクト表の行ごとに、トリガー・アクションが 1 回適用されることを指定します。
- FOR EACH STATEMENT
- トリガー・アクションがステートメント全体に対して 1 回のみ適用されることを指定します。
- WHEN
-
- (search-condition)
- 真、偽、または不明の条件を指定します。 search-condition を使用すると、特定のトリガー・アクションを実行する必要があるかどうかを判別することができます。 関連したアクションは、指定した検索条件が真と評価される場合のみ実行されます。
- declaration
- 変数宣言を指定します。
- statement または handler-statement
- PL/SQL プログラム・ステートメントを指定します。 ネストしたブロックをトリガー本体に含めることができます。
- condition
- NO_DATA_FOUND などの例外条件名を指定します。
例
以下の例で示す BEFORE 行トリガーでは、部門 30 に属するすべての新しい従業員の歩合を計算した後に、その従業員のレコードを EMP 表に挿入します。 また、50% を超える昇給を exception 表に記録します。
CREATE TABLE emp (
name VARCHAR2(10),
deptno NUMBER,
sal NUMBER,
comm NUMBER
)
/
CREATE TABLE exception (
name VARCHAR2(10),
old_sal NUMBER,
new_sal NUMBER
)
/
CREATE OR REPLACE TRIGGER emp_comm_trig
BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW
BEGIN
IF (:NEW.deptno = 30 and INSERTING) THEN
:NEW.comm := :NEW.sal * .4;
END IF;
IF (UPDATING and (:NEW.sal - :OLD.sal) > :OLD.sal * .5) THEN
INSERT INTO exception VALUES (:NEW.name, :OLD.sal, :NEW.sal);
END IF;
END
/