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

SAP Sybase SQL Anywhere 16.0 » 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 ローを挿入し、トランザクションの最後までチェックを延期することによって参照整合性違反を回避してください。

 参照