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

トリガー活動化時間

トリガー活動化時間 は、いつトリガーを活動化するかを指定します。すなわち、そのトリガー事象が実行される BEFORE (前) か AFTER (後) を指定します。たとえば、次のトリガーの活動化時間は employee での INSERT 操作の後 (AFTER) です。

    CREATE TRIGGER NEW_HIRE
      AFTER INSERT ON EMPLOYEE
      FOR EACH ROW MODE DB2SQL
      UPDATE COMPANY_STATS SET NBEMP = NBEMP + 1

活動化時間が BEFORE の場合、トリガー・アクションは、トリガー事象が実行される前に影響される行のそれぞれに対して活動化されます。 BEFORE トリガーは、FOR EACH ROW の細分性を持たなければならないことに注意してください。

活動化時間が AFTER の場合、トリガー・アクションは、影響される行のそれぞれに対して、またはステートメントに対して、トリガーの細分性に従って活動化されます。これはトリガー事象が実行された後、またトリガー事象によって影響される可能性がある制約 (参照制約のアクションも含む) すべてをデータベース・マネージャーが検査した後で起きます。 AFTER トリガーは、FOR EACH ROW か FOR EACH STATEMENT のどちらかの細分性を持つことができます。

トリガーの活動化時間が異なると、トリガーの目的も異なります。根本的に、BEFORE トリガーはデータベース管理システムの制約付きサブシステムに対する拡張です。したがって、通常は次のような目的で使用します。

BEFORE トリガーはトリガー事象がデータベースに適用される前に活動化されるので、これを使ってデータベースをさらに修正することはできません。そのため、BEFORE トリガーを活動化した後で保全性に関する制約を検査すると、トリガー事象がその制約に違反する可能性があります。

逆に、AFTER トリガーは、特殊な事象が起こるたびにデータベースで実行されるアプリケーション論理のモジュールとみなすことができます。 AFTER トリガーは、アプリケーションの一部として常に一定の状態でデータベースを参照します。 AFTER トリガーは、トリガー SQL 操作により違反されることのある保全性に関する制約が検査された後で実行されることに注意してください。したがって、このトリガーは主にアプリケーションでも実行できる操作を行うために使用できます。以下に例を示します。

BEFORE および AFTER トリガーにはさまざまな特質のものがあるため、それらのトリガー・アクションを定義するにはさまざまな SQL 操作が使用されます。たとえば、更新操作は BEFORE トリガーでは実行できません。これは、トリガー・アクションにおいて保全性に関する制約が違反されないという保証がないためです。 BEFORE および AFTER トリガーで指定できる一連の SQL 操作については、 トリガー・アクションで説明します。同様に、BEFORE および AFTER トリガーには、さまざまな細分性がサポートされています。たとえば、FOR EACH STATEMENT は BEFORE トリガーでは実行できません。これは、トリガー・アクションによる制約の違反がなく、それゆえにその操作が順々に失敗するということがないと保証できないためです。


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