オブジェクト指向、Javaを取り入れた
新しい業界標準「SQL99」詳細解説

第二章 柔軟さを増したデータ構造(4)


トリガー

 トリガーは、ある表のデータ行を変更するSQLデータ操作文(INSERT,UPDATE、DELETE)が要求されたことをきっかけにして、あらかじめCREATE TRIGGER文によって定義しておいた、別の1個以上の表を変更する操作を同じトランザクション中で自動的に行うことを可能にする機能である。変更するという事象が発生したときに定義しておいた操作を、DBMSが自動的に発火するという意味でトリガー(引き金)ということばが使われる。 トリガーの導入によって「受動的な」DBMSが「能動的な」DBMSに変身したとさえ言われる重要な機能である。

 トリガーそれ自身はリレーショナルDBMSにとって必ずしも目新しい機能ではなく、すでに幾つかの製品によって実装されている。しかし残念ながら、トリガーの操作を記述する方法は、製品によって異なり可換性がない。SQL99は、そのような問題を解決するためにトリガーの定義を標準化した。これによって、トリガーの処理も異なるベンダー製品間でソースレベルでの移植性が向上することが期待される。

 トリガーが起動されるのは、変更元の表への更新操作の前か後いずれでも可能である。トリガーの中では、別表へのINSERT文、UPDATE文、DELETE文だけでなくストアドプロシージャを呼び出すCALL文も実行可能なので、必要であれば複雑な業務ロジックをその中に組み込むことができ、かなり強力な機能といえる。もちろん、一連の処理の中で異常があれば、トリガー中の処理も含めて元となった変更処理もロールバックされるのでデータの整合性は自動的に維持される。

 ここでは、図29に示すような、あるトランザクションが在庫表から部品を引当てる典型的な在庫引当の例を考えてみよう。

図29 トリガーにより、在庫の変更が自動的にストアドプロシージャを呼び出す

 図30に、トリガーをCREATE TRIGGER文によって定義した例を示す。

図30 トリガー(AFTER トリガー)の定義例

この例では、次のような処理を行う。

  1. 部品表の在庫数列または最大在庫数列がUPDATE文によって更新された場合、「発注」という名前のトリガーが起動される。
  2. もし更新された後の在庫数列の値が最大在庫数列の値の10%よりも小さくなった場合には、発注表にその部品番号で最大在庫数と在庫数の差を発注量として1行を挿入する。そうでなければ、何も行わない。発注に際してもっと複雑な業務ロジックが必要な場合は、INSERT文の代わりにそのような処理を行うストアドプロシジャを呼び出してもよい。
  3. 発注処理を行ったことを示すメッセージを電子メールで発信するストアドプロシージャを呼び出す。

 最後に、BEFOREトリガーの簡単な例を示す。例えば、基本給の昇給を行うとき、昇給後の基本給額が、昇給前の基本給額よりも少なくとも1.2倍を超えるようにするにはどのようにすればよいだろうか。次のようなBEFOREトリガーを考えてみよう。

CREATE TIRGGER 昇給検査
BEFORE UPDATE OF 基本給額 ON 社員表
REFERENCING OLD AS oldrow NEW AS newrow
FOR EACH ROW
WHEN ( newrow.基本給額 < 1.2 * oldrow.基本給額 )
SET newrow.基本給額 = 1.2 * oldrow;

 この昇給検査トリガーは、社員表の基本給額列が更新されたとき、昇給後の基本給額(newrow.基本給額)が昇給前の基本給額(oldrow.基本給額)の1.2倍未満であれば、強制的に更新値を昇給前の1.2倍に変更しているのである。このようにトリガーは、更新前の入力データの妥当性検査を行うこともでき、プログラムの修正なしに正しい値に設定し直して更新操作を進めることもできるのである。

 トリガーは、あらかじめ指定した表のデータ行への変更操作に伴う共通の操作をDBMS中に格納するところに特徴がある。オブジェクト指向の言葉で言い替えれば、オブジェクト(表)に対する特定のメソッド(トリガー)の操作の内部処理ロジックをアプリケーションから分離し、隠蔽する。そしてそのメソッドをDBMS管理者が一元管理することができる。

 このようにトリガーを上手に活用すれば、アプリケーションプログラムからデータに密着した処理を分離し、その結果アプリケーションプログラムの工数を削減し、その品質と開発生産性を向上することが期待できるだろう。


とびら 新しい業界標準「SQL99」詳細解説

第一章 高度なデータ操作

SQL99の背景と特徴
SQL99の主な機能強化
  スキーマ定義の新機能
  データ操作と演算子の新機能
  整合性の新機能
  セキュリティ(機密保護)の新機能
  トランザクション管理の新機能
  クライアント/サーバの新機能
高度なリレーショナル操作
  共通表式 WITH句
  再帰SQL
OLAPによる分析手順
  ROLLUP
  CUBE
  GROUPING SETS
ユニオン(UNION)経由の更新
  結合(JOIN)経由の更新


第二章 柔軟さを増したデータ構造

ユーザー定義可能な新しいデータ
  新しい組込みデータ型
  真理値型(BOOLEAN型)
  配列型(ARRAY型)
LOBとは
  LOBデータ型の定義
  LOBデータ型の取り扱い
  LOBロケータの使用
  HOLD LOCATORとFREE LOCATOR
  LOBの挿入(更新)と検索方法の拡張
ユーザー定義型
  ユーザー定義DISTINCT型
ユーザー定義関数
関数のオーバーロード

オブジェクトリレーショナル
  ユーザー定義構造型と列オブジェクト
  ユーザー定義構造型と行オブジェクト
副表(サブテーブル)と継承(インヘリタンス)
  副型を持つ列オブジェクト
  行オブジェクトと経路式
オブジェクトビュー
トリガ


第三章 SQLJと今後の標準化動向

クライアント/サーバ環境のための機能強化
  ストアドプロシージャ
  新しいプロシージャ言語
静的埋め込みSQLを実現する「SQLJ」
  パフォーマンスの向上と移植性
  SQLJのコンパイル
  SQLJの記述方法
  SQLJ 対 JDBC
  イテレータの使用
  SQLデータ型としてのJavaクラス
オブジェクトリレーショナル機能の応用例
  SQL/MM全文検索(フルテキスト)
  SQL/MM地理情報(スペーシャル)
今後のSQL標準化動向
  コレクション型の拡張
  オブジェクトリレーショナル機能の拡張
  SQL/MED
  OLAP機能の拡張
  自由度が高まるデータアクセス



「Master of IP Network総合インデックス」


Master of IP Network フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Master of IP Network 記事ランキング

本日 月間