Contact テーブルには、顧客の会社の社員名、顧客を参照するための外部キー、窓口を識別するユニークな整数が含まれています。また、last_modified タイムスタンプと、窓口がアクティブであるかどうかを示すマーカもあります。
このテーブルのビジネス・ルールは、次のとおりです。
窓口情報は、統合データベースでもリモート・データベースでも修正できる。
各リモート・データベースには、営業担当者が割り当てられている顧客の窓口のみが含まれる。
営業担当者間で顧客を再割り当てした場合は、窓口の再割り当てもする。
Customer テーブルのトリガは、顧客情報に変更があったときに窓口が確実に選択されるようにするために使用されます。トリガは、各窓口の last_modified カラムを、その窓口に対応する顧客の情報が変更されるたびに明示的に変更します。
CREATE TRIGGER UpdateCustomerForContact AFTER UPDATE OF rep_id ORDER 1 ON DBA.Customer REFERENCING OLD AS old_cust NEW as new_cust FOR EACH ROW BEGIN UPDATE Contact SET Contact.last_modified = new_cust.last_modified FROM Contact WHERE Contact.cust_id = new_cust.cust_id END |
顧客が修正されるたびにすべての窓口レコードを更新することで、トリガは顧客とその関連窓口を結合します。そのため、顧客が修正されるとすべての関連窓口も修正され、次回の同期時に顧客とその関連窓口が一括してダウンロードされます。
download_cursor Contact の download_cursor スクリプトを次に示します。
SELECT contact_id, contact.name, contact.cust_id FROM ( contact JOIN customer ) JOIN salesrep ON contact.cust_id = customer.cust_id AND customer.rep_id = salesrep.rep_id WHERE Contact.last_modified >= ? AND salesrep.ml_username = ? AND Contact.active = 1 |
このスクリプトは、アクティブな窓口、営業担当者が最後にダウンロードした後に (明示的に、または対応する顧客の修正によって) 変更された窓口、営業担当者に割り当てられている窓口をすべて取り出します。この営業担当者に関連付けられている窓口を識別するには、Customer テーブルと SalesRep テーブルのジョインが必要です。
download_delete_cursor Contact の download_delete_cursor スクリプトを次に示します。
SELECT contact_id FROM ( Contact JOIN Customer ) JOIN SalesRep ON Contact.cust_id = Customer.cust_id AND Customer.rep_id = SalesRep.rep_id WHERE Contact.last_modified >= ? AND Contact.active = 0 |
リモート・データベースから顧客が削除されると、Mobile Link クライアントでは、カスケード参照整合性が自動的に使用され、対応する窓口が削除されます。このため、download_delete_cursor スクリプトは、非アクティブのマークが付いている窓口のみを削除します。
リモート・データベース側で窓口情報を挿入、更新、または削除できます。これらの操作に対応するスクリプトは、次のとおりです。
upload_insert 次の upload_insert スクリプトは、Contact テーブルにローを 1 つ追加して、窓口にアクティブのマークを付けます。
INSERT INTO Contact ( contact_id, name, cust_id, active ) VALUES ( ?, ?, ?, 1 ) |
upload_update 次の upload_update スクリプトは、統合データベースにある窓口情報を修正します。
UPDATE Contact SET name = ?, cust_id = ? WHERE contact_id = ? |
このテーブルでは競合検出は実行されません。
upload_delete 次の upload_delete スクリプトは、統合データベースで窓口に非アクティブのマークを付けます。ローは削除されません。
UPDATE Contact SET active = 0 WHERE contact_id = ? |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |