オフィスじゅう器メーカの Y 社は、部品の入出庫, 発注を行う在庫管理システムを構築している。
〔RDBMS の主な仕様〕
在庫管理システムに用いている RDBMS の主な仕様は,次のとおりである。
1.ISOLATION レベル
選択できるトランザクションの ISOLATION レベルとその排他制御の内容は,表1のとおりである。 ただし, データ参照時に FOR UPDATE 句を指定すると, 対象行に専有ロックを掛け, トランザクション終了時に解放する。
ロックは行単位で掛ける。 共有ロックを掛けている間は,他のトランザクションからの対象行の参照は可能であり,更新は共有ロックの解放待ちとなる。 専有ロックを掛けている間は,他のトランザクションからの対象行の参照, 更新は専有ロックの解放待ちとなる。
索引を使わずに, 表探索で全ての行に順次アクセスする場合, 検索条件に合致するか否かにかかわらず全行をロック対象とする。 索引探索の場合, 索引から読み込んだ行だけをロック対象とする。
2.トリガ
テーブルに対する変更操作 (挿入・更新・削除) を契機に、 あらかじめ定義した処理を実行する。
(1) 実行タイミング (テーブルに対する変更操作の前又は後。 前者を BEFORE トリガ,後者を AFTER トリガという)を定義することができる。
(2) 列値による実行条件を定義することができる。
(3) トリガ内では, トリガを実行する契機となった変更操作を行う前と後の行を参照することができる。 挿入では操作後の行の内容を,更新では操作前と操作後の行の内容を削除では操作前の行の内容を参照することができる。 参照するには,操作前と操作後の行に対する相関名をそれぞれ定義し, 相関名で列名を修飾する。
(4) BEFORE トリガの処理開始から終了までの同一トランザクション内では,全てのテーブルに対して変更操作を行うことはできない。
(5) トリガ内で例外を発生させることによって,契機となった変更操作をエラーとして終了することができる。
〔在庫管理システムのテーブル〕
在庫管理システムの主なテーブルのテーブル構造は,図1のとおりである。 索引は,主キーだけに定義している。

〔在庫管理業務の概要〕
(1) 組立工場では, 複数の生産ラインが稼働し, それぞれ異なる製品を組み立てている。 各製品の組立てに必要な部品は倉庫に保管し、必要に応じて生産ラインに出庫する。
(2) 部品は,部品番号で識別する。 倉庫内に存在する在庫を, 実在庫と呼ぶ。 このうち, 出庫対象となったものを, 引当済在庫と呼ぶ。
(3) 部品の発注の方式は定量発注である。 Y 社の定量発注では、部品ごとの実在庫数量から引当済数量を差し引いた値が,基準在庫数量を下回った都度,部品ごとに決められた部材メーカに対して, 決められた数量 (補充ロットサイズ) を発注する。
(4) 出庫要求では,倉庫に対して部品の出庫を要求する。 “出庫要求” テーブル及び“出庫要求明細” テーブルに出庫要求の内容を登録し, “出庫要求” テーブルの処理状況に‘要求発生' を記録する。 出庫要求番号は、出庫要求の発生順に一意な連番である。組立てに必要な複数の部品を一つの出庫要求とし, 1 トランザクションで処理する。 生産ラインごとに様々な組合せの部品を要求する。 また, 部品の要求は生産ラインでの組立ての状況に応じて任意の契機で発生する。
(5) 在庫引当では, 出庫要求に応じて, “出庫要求明細” テーブルに指定した部品番号の部品について出庫要求数量の出庫が可能かどうか判定し, 出庫可能であれば"在庫” テーブルの引当済数量を更新する。 全ての部品の在庫引当が完了したら,“出庫要求” テーブルの処理状況を‘引当実施' に更新する。在庫引当できない部品が存在した場合は, 在庫引当を破棄して処理状況を‘引当失敗”に更新し、部品が入庫されるのを待って改めて出庫要求する。
(6) 出庫では,在庫引当が完了した部品を倉庫から搬出する。 毎朝, “出庫要求”テーブルの処理状況が ‘引当実施' のものを対象に実施する。 それぞれの部品の出庫が完了したら, “在庫” テーブルの実在庫数量及び引当済数量を更新し, “出庫要求”テーブルの処理状況を‘出庫実施' に更新する。 出庫は出庫要求単位に1トランザクションで処理し、 全ての部品をまとめて出庫する。
(7) 発注では,“発注” テーブルの処理状況に '要求発生” を記録し, “在庫” テーブルの発注済フラグをオンにする。
(8) 入庫では,部材メーカから納品される都度, “在庫” テーブルの実在庫数量を更新し、発注済フラグをオフにする。 また, “発注” テーブルの処理状況を‘入庫実施'に更新する。 納品された複数の部品をまとめて, 1 トランザクションで処理する。
〔トリガでの在庫引当処理の設計〕
出庫要求に連動した在庫引当を実行させたいので, トリガを利用するように処理を見直すことにした。 トリガでの在庫引当処理を図2に示す。
なお,引当失敗の場合は、出庫要求側でロールバックを行った後, “出庫要求” テーブルの処理状況を‘引当失敗’に更新する。
〔トリガでの定量発注の設計〕
在庫引当時の定量発注のために, 発注の具体的な処理はストアドプロシージャで用意し, トリガから呼び出すことにした。 ストアドプロシージャでは, “発注” テーブルと“在庫” テーブルに変更操作を行う。 トリガを定義する SQL を図 3 に示す。 さらに、図3の内容のレビューを行った。 レビューでの指摘内容と対策を表2に示す。