CREATE TRIGGER ステートメント (PL/SQL)

CREATE TRIGGER ステートメントは、データベース内で PL/SQL トリガーを定義します。

構文

構文図を読む構文図をスキップするCREATEOR REPLACE TRIGGERtrigger-nameBEFOREAFTERINSTEAD OFtrigger-eventONtable-nameREFERENCING1OLDAScorrelation-nameNEWAScorrelation-nameFOR EACH ROWFOR EACH STATEMENTWHEN(search-condition)DECLAREdeclarationBEGINstatement EXCEPTIONWHENconditionORTHENhandler-statementEND
trigger-event
構文図を読む構文図をスキップするORINSERTDELETEUPDATEOF,column-name2
注:
  • 1 OLD および NEW はそれぞれ 1 回しか指定できません。
  • 2 トリガー・イベントを同一操作に対して複数回指定してはなりません。 例えば、INSERT OR DELETE は使用できますが、INSERT OR INSERT は使用できません。

説明

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 値になります。
REFERENCING 節が呼び出されない場合、トリガー変数 NEW および OLD を明示的に定義しなくてもオプションで使用できます。
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
/