アプリケーション開発の手引き

変換表

FOR EACH ROW と FOR EACH STATEMENT の両方のトリガーでは、影響される行の全セットを参照しなければならないことがあります。これはたとえば、トリガー本体が影響される行のセットを超えた集約を適用する必要がある場合に当てはまります (たとえば列の値の MAX、MIN、または AVG)。トリガーは、影響される行のセットを CREATE TRIGGER ステートメントの REFERENCING 文節で指定できる 2 つの変換表を使って参照します。変換表には、変位変数のように OLD_TABLE および NEW_TABLE として表名 とともに指定される 2 種類があります。この 2 種類の変換表の意味は次のとおりです。

OLD_TABLE 表名
影響される行のセットの元の状態 (トリガー SQL 操作がデータベースに適用される前の状態) を収集する表の名前を指定します。

NEW_TABLE 表名
トリガー・アクションがデータベースに適用される際に、データベースの行を更新するために使用される値を収集する表の名前を指定します。

以下に例を示します。

    CREATE TRIGGER REORDER
      AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS
      REFERENCING NEW_TABLE AS N_TABLE
      NEW AS N_ROW
      FOR EACH ROW MODE DB2SQL
      WHEN ((SELECT AVG (ON_HAND) FROM N_TABLE) > 35)
      BEGIN ATOMIC
        VALUES(INFORM_SUPERVISOR(N_ROW.PARTNO,
                                 N_ROW.MAX_STOCKED,
                                 N_ROW.ON_HAND));
      END

NEW_TABLE は、FOR EACH ROW トリガーにおいても、更新された行の全セットを常に持つことに注意してください。トリガーはそれが定義される表上で実行されると、 NEW_TABLE にはそのトリガーを活動化したステートメントから変更された行が入ります。ただし、トリガー内のステートメントによって変更された行は入りません。これはトリガーの活動化を分離させるためです。

変換表は読み取り専用です。変換表は、トリガー事象に対して定義できる変位変数の種類を定義するのと同じ、次のような規則で定義できます。

UPDATE
UPDATE トリガーは、 OLD_TABLENEW_TABLE の両方の変換表を参照できます。

INSERT
INSERT トリガーは、NEW_TABLE 変換表のみを参照できます。これは、INSERT 操作の活動化の前に、影響される行がデータベースに存在しないためです。すなわち、トリガー・アクションがデータベースに適用される前の古い値を定義している行の元の状態 がありません。

DELETE
DELETE トリガーは、OLD 変換表のみを参照できます。これは、削除操作で指定された新しい値がないためです。
注:変換表が AFTER トリガーの FOR EACH ROW と FOR EACH STATEMENT の両方の細分性に対して指定できることは知っておく必要があります。

OLD_TABLENEW_TABLE表名 の効力範囲はトリガー本体です。この効力範囲の表名 は、スキーマ内にある同一の非修飾表名 を持つ他のすべての表に優先します。したがって、たとえば OLD_TABLENEW_TABLE表名 が X の場合、 SELECT ステートメントの FROM 文節で X (すなわち非修飾の X) を参照することで、トリガー作成者のスキーマ内に X という名の表があったとしても変換表を常に参照します。この場合、ユーザーはスキーマ内の表 X を参照するために完全修飾名を使わなければなりません。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]