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


トリガー、制約、UDT、UDF、および LOB 間の協調

以下の項では、トリガーおよび制約を利用して UDT、UDF、および LOB を使用するアプリケーション構造をモデル化する方法について説明します。トリガーを使うと、次のことが行えます。

情報の抽出

ELECTRONIC_MAIL 表の列 MESSAGE 内に、完全な電子メールを保管するアプリケーションを作成できます。電子メールを操作するには、 SQL ステートメント内でその情報が必要とされるたびに UDF を使ってメッセージ列から情報を抽出します。

照会は、情報を 1 回抽出してそれを表の列として明確に保管することはしないことに注意してください。これが行われると、UDF が繰り返し呼び出されることがないだけでなく、抽出した情報に索引を定義できるため、照会のパフォーマンスは向上します。

トリガーを使うと、新しい電子メールがデータベースに保管されるたびにこの情報を抽出することができます。これを行うには、ELECTRONIC_MAIL 表に新しい列を追加して BEFORE トリガーを定義し、該当する情報を次のように抽出してください。

     ALTER TABLE ELECTRONIC_MAIL
       ADD COLUMN SENDER    VARCHAR (200)
       ADD COLUMN RECEIVER  VARCHAR (200)
       ADD COLUMN SENT_ON   DATE
       ADD COLUMN SUBJECT   VARCHAR (200)
  
     CREATE TRIGGER EXTRACT_INFO
       NO CASCADE BEFORE INSERT ON ELECTRONIC_MAIL
       REFERENCING NEW AS N
       FOR EACH ROW MODE DB2SQL
       BEGIN ATOMIC
         SET N.SENDER = SENDER(N.MESSAGE);
         SET N.RECEIVER = RECEIVER(N.MESSAGE);
         SET N.SENT_ON = SENDING_DATE(N.MESSAGE);
         SET N.SUBJECT = SUBJECT(N.MESSAGE);
       END

このようにして、新しい電子メールがメッセージ列に挿入されると常に、その差出人、宛先、送信日、および主題がメッセージから抽出され、別々の列に保管されます。

表における操作の妨害

送信した結果未送信だったメールと戻ってきたメール (おそらく電子メールのアドレスが誤っていたため) が、電子メールの表に保管されないようにしたいと仮定します。

そのようにするには、特定の SQL INSERT ステートメントを実行しないようにする必要があります。それには次の 2 とおりの方法があります。

制約の宣言上の特質の利点のため、制約は通常トリガーの代わりに定義されます。

業務規則の定義

顧客の苦情を扱う電子メールは、マーケティング管理者の Mr. Nelson にカーボン・コピー (CC) のリストで提出しなければならないという方針が会社にあるとします。これは規則であるため、制約として明記するほうがよいかもしれません (この場合は、これをチェックする CC_LIST UDF の存在が前提になる)。以下のような方法があります。

     ALTER TABLE ELECTRONIC_MAIL ADD
       CHECK (SUBJECT <> 'Customer complaint' OR
              CONTAINS (CC_LIST(MESSAGE), 'nelson@vnet.ibm.com') = 1)

ただしこの制約により、マーケティング管理者に CC リストで提出しない顧客の苦情を扱う電子メールは挿入できなくなります。このことは、この会社の業務規則の目的ではないことは明らかです。その目的とは、マーケティング管理者には複写されていない顧客の苦情を扱う電子メールをマーケティング管理者に転送することです。このような業務規則は、宣言上の制約により表すことのできないアクションを行うことを要求するので、トリガーを使ってのみ表すことができます。トリガーは、E_MAIL タイプのパラメーターと文字ストリングを持つ SEND_NOTE 関数があると仮定します。

     CREATE TRIGGER INFORM_MANAGER
       AFTER INSERT ON ELECTRONIC_MAIL
       REFERENCING NEW AS N
       FOR EACH ROW MODE DB2SQL
       WHEN (N.SUBJECT = 'Customer complaint' AND
         CONTAINS (CC_LIST(MESSAGE), 'nelson@vnet.ibm.com') = 0)
       BEGIN ATOMIC
         VALUES(SEND_NOTE(N.MESSAGE, 'nelson@vnet.ibm.com'));
       END

アクションの定義

総管理者が、72 時間以内に別々の表に 3 つ以上の苦情を送ってきた顧客の名前を保持したいとします。また、顧客名がこの表に複数回挿入されたら必ず総管理者に知らせるようにしたいと仮定します。

このようなアクションを定義するには、次のように定義します。


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