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

複数トリガーの順序付け

CREATE TRIGGER ステートメントを使ってトリガーを定義すると、この作成時間はデータベース内にタイム・スタンプの形式で登録されます。このタイム・スタンプの値は、同時に実行すべきトリガーが複数存在した際に、トリガーの活動化を順序付けするために引き続き使用されます。たとえばタイム・スタンプは、同一対象表に同じ事象と同じ活動化時間を持つトリガーが複数存在する場合に使用されます。また、トリガー事象およびその操作により直接的または間接的に (他の参照制約により再帰的に) 生じた参照を制約する処置により活動化された、 1 つまたは複数の AFTER トリガーが存在する場合にも使用されます。次の 2 つのトリガーを考えてください。

    CREATE TRIGGER NEW_HIRED
      AFTER INSERT ON EMPLOYEE
      FOR EACH ROW MODE DB2SQL
      BEGIN ATOMIC
        UPDATE COMPANY_STATS
        SET NBEMP = NBEMP + 1;
      END;
  
    CREATE TRIGGER NEW_HIRED_DEPT
       AFTER INSERT ON EMPLOYEE
       REFERENCING NEW AS EMP
       FOR EACH ROW MODE DB2SQL
         BEGIN ATOMIC
           UPDATE DEPTS 
           SET NBEMP = NBEMP + 1 
           WHERE DEPT_ID = EMP.DEPT_ID; 
         END;

上記のトリガーは、employee 表で INSERT 操作を実行すると活動化されます。この場合、トリガー作成のタイム・スタンプは、上の 2 つのトリガーのうちどちらが最初に活動化されるかを定義します。

トリガーの活動化は、タイム・スタンプ値の昇順で処理されます。したがって、データベースに新しく追加されたトリガーは、事前に定義されている他のすべてのトリガーの後で実行されます。

旧トリガーは新規トリガーの前に活動化され、新規トリガーがデータベースに影響を及ぼす変更に対して増分の加算として使用できるようにします。たとえば、トリガー T1 のトリガー SQL ステートメントが新しい行を表 T に挿入すると、 T1 の後に実行されるトリガー T2 のトリガー SQL ステートメントを使って、特定の値を持つ T の中の行を更新することができます。作成時の昇順でトリガーを活動化することにより、新規トリガーのアクションが旧トリガーすべての活性化の結果を反映するデータベースで実行されると保証できます。


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