InterBase クイック スタート:Part V - 変更レコードを保持するトリガを作成する
InterBase クイック スタート:Part V - 応用トピック へ戻る
次の CREATE TRIGGER
文を入力して、save_salary_change
トリガを作成します。
このトリガは、Salary_history
テーブルでの社員の給与に対する変更記録を保持します:
CREATE TRIGGER save_salary_change FOR employee
AFTER UPDATE AS
BEGIN
IF (OLD.salary <> NEW.salary) THEN
INSERT INTO salary_history
(emp_no,
change_date,
updater_id,
old_salary,
percent_change)
VALUES
(OLD.emp_no,
'NOW',
USER,
OLD.salary,
(NEW.salary - OLD.salary) * 100 / OLD.salary);
END
このトリガは、Employee
テーブルの AFTER UPDATE
を発生させます。これは、salary 列の値を更新前のものと更新後のものとで比較し、それらが異なっている場合には、Salary_history
にレコードを追加します。このテーブルは、社員番号、日付、前の給与、給与における変更の割合から構成されています。
Salary_history
テーブルに入力され、Employee
テーブルから取り出される値は、常に、Old
または New
のコンテキスト変数が前にきます。これは、InterBase が更新処理の間、1 つのレコードに対して 2 つのバージョンを作成しており、値がどちらのバージョンのものか指定しなければならないからです。
さらにこの例では、他にも InterBase の機能を 2 つ利用している点に注目してください: 現在日を DATE
データ型の列に、単一引用符に囲まれた文字列 'NOW'
を指定することで、挿入しています。また、データベースに現在接続しているユーザーの名前を、キーワード USER
を指定することにより、挿入しています。
このトリガをテストするには、社員レコードを更新し、給与を変更します。
イベントを送信するトリガを作成する
次の CREATE TRIGGER
文を実行して、トリガ post_new_order
を作成します。このトリガは、Sales
テーブルにレコードが挿入された際に、「new_order
」という名のイベントを送信します。
CREATE TRIGGER post_new_order FOR sales
AFTER INSERT AS
BEGIN
post_event 'new_order';
END
イベントは、トリガまたはストアド プロシージャによって、InterBase イベント マネージャに渡されるメッセージで、特定の条件の発生に関与するアプリケーションに通知します。 イベントへの関与を登録したアプリケーションは、実行を一時保留し、指定したイベントが発生するのを待機することができます。
post_new_order
トリガは、新しいレコードが Sales
テーブルに挿入された後に発生します。このイベントが発生すると、関与するアプリケーションはアクション(請求書の印刷や発送部署への通知など)を起こします。