Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Remote » SQL Remote のレプリケーション設計 » SQL Remote のレプリケーション設計と設定 » 重複分割の使用

 

多対多の関係における subscribe_by_remote オプションの使用

subscribe_by_remote オプションを On に設定すると、SUBSCRIBE BY 値が NULL または空の文字列であるローに対してリモート・データベースから操作が行われた場合、リモート・ユーザがローに対するサブスクリプションを作成するとみなされます。デフォルトでは、subscribe_by_remote オプションは On に設定されています。

subscribe_by_remote オプションは、これを使用しない場合にいくつかのパブリケーションで発生する問題を解決します。顧客が複数の営業担当者に所属できるため、次のパブリケーションでは、Customers テーブルのサブスクリプション式にサブクエリを使用します。

CREATE PUBLICATION SalesRepData (
   TABLE SalesReps,
   TABLE Policy SUBSCRIBE BY rep_key,
   TABLE Customers SUBSCRIBE BY (
      SELECT rep_key FROM Policy
      WHERE Policy.cust_key =
         Customers.cust_key
   ),
);

たとえば、営業担当者 Marc Dill が、新しい顧客との取り引きをデータに入力します。まず、Marc Dill は Customers テーブルに新しいローを挿入し、Policy テーブルにもローを挿入して新規の顧客を自分自身に割り当てます。

Policy テーブルには、Customers と SalesReps の両テーブルへの外部キーがあります。

統合データベースでは、SQL Remote によって Customers ローの挿入が実行され、この挿入の実行時に SQL Anywhere によってトランザクション・ログにサブスクリプション値が記録されます。

あとで SQL Remote がトランザクション・ログをスキャンすると、サブスクリプション式からサブスクライバのリストが構築されます。顧客を割り当てた Policy テーブルでローがまだ適用されていないため、この場合 Marc Dill はリストされません。subscribe_by_remote が Off に設定されていると、この新しい顧客は DELETE 文として Marc Dill に送信されます。

subscribe_by_remote が On に設定されているかぎり、SQL Remote は、ローの所属先はローを挿入した営業担当者であるとみなし、INSERT 文は Marc Dill にレプリケートされません。また、レプリケーション・システムは影響を受けません。

subscribe_by_remote オプションが Off に設定されている場合は、必ず Policy ローを挿入してから Customers ローを挿入し、トランザクションの最後までチェックを延期することによって参照整合性違反を回避してください。

参照