スポーツ用品メーカのための倉庫システムがあるとします。製品情報のテーブルには、各製品の在庫数を記録する Quantity カラムがあります。このカラムへの更新は、通常は在庫数を引いていくことであり、新しく製品が搬入される場合は、在庫数を追加します。
リモート・データベースで営業担当者が受注を入力し、S サイズのタンクトップ T シャツの在庫を 5 枚差し引いて 28 から 23 としました。この在庫数も担当者のデータベースに入力されます。一方、この更新内容が統合データベースにレプリケートされる前に、別の営業担当者は T シャツの返品を 40 枚受け取りました。この営業担当者は、自分のリモート・データベースに返品を入力し、倉庫での変更を統合データベースにレプリケートして、Quantity カラムの値を 40 追加して 68 とします。
このエントリがデータベースに追加され、現在の Quantity カラムは、在庫に 68 枚の S サイズのタンクトップ T シャツがあることを示しています。ここで最初の営業担当者からの更新を受信すると、28 から 23 に変更するという内容にもかかわらず、実際のカラム値は 68 であるという競合が SQL Anywhere で検出されます。
デフォルトでは、より新しい更新が処理され、在庫レベルが間違った値 23 に設定されます。
この例の競合は、データベースの最終的な値が 63 になるように、在庫のカラムに対する変更を合計した結果を算出して解決してください。
このような状況に適した RESOLVE UPDATE トリガでは、2 つの更新内容による増加分を追加します。次に例を示します。
CREATE TRIGGER resolve_quantity RESOLVE UPDATE OF Quantity ON "DBA".Products REFERENCING OLD AS old_name NEW AS new_name REMOTE AS remote_name FOR EACH ROW BEGIN SET new_name.Quantity = new_name.Quantity + old_name.Quantity - remote_name.Quantity END; |
統合データベースの以前の値 (68) と、元の UPDATE 文が実行された時点のリモート・データベースの以前の値 (28) の差が、このトリガによって送信する新しい値に追加されてから、UPDATE 文が実行されます。したがって、new_name.Quantity は 63 (= 23 + 68 - 28) となり、この値が Quantity カラムに入力されます。
リモート・データベースでの一貫性は、次のように管理されます。
元のリモート UPDATE 文によって、値が 28 から 23 に変更されました。
倉庫システムのエントリがリモート・データベースにレプリケートされますが、以前の値が予測値と一致しないためにエラーが発生します。
RESOLVE UPDATE トリガによる変更内容が、リモート・データベースにレプリケートされます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |