FOR EACH ROW と FOR EACH STATEMENT の両方のトリガーでは、影響される行の全セットを参照しなければならないことがあります。これはたとえば、トリガー本体が影響される行のセットを超えた集約を適用する必要がある場合に当てはまります (たとえば列の値の MAX、MIN、または AVG)。トリガーは、影響される行のセットを CREATE TRIGGER ステートメントの REFERENCING 文節で指定できる 2 つの変換表を使って参照します。変換表には、変位変数のように OLD_TABLE および NEW_TABLE として表名 とともに指定される 2 種類があります。この 2 種類の変換表の意味は次のとおりです。
以下に例を示します。
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 にはそのトリガーを活動化したステートメントから変更された行が入ります。ただし、トリガー内のステートメントによって変更された行は入りません。これはトリガーの活動化を分離させるためです。
変換表は読み取り専用です。変換表は、トリガー事象に対して定義できる変位変数の種類を定義するのと同じ、次のような規則で定義できます。
注: | 変換表が AFTER トリガーの FOR EACH ROW と FOR EACH STATEMENT の両方の細分性に対して指定できることは知っておく必要があります。 |
OLD_TABLE と NEW_TABLE の表名 の効力範囲はトリガー本体です。この効力範囲の表名 は、スキーマ内にある同一の非修飾表名 を持つ他のすべての表に優先します。したがって、たとえば OLD_TABLE や NEW_TABLE の表名 が X の場合、 SELECT ステートメントの FROM 文節で X (すなわち非修飾の X) を参照することで、トリガー作成者のスキーマ内に X という名の表があったとしても変換表を常に参照します。この場合、ユーザーはスキーマ内の表 X を参照するために完全修飾名を使わなければなりません。