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

SQL Anywhere 12.0.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 是一个销售代表,他刚刚和一个新客户商定了一个策略。他在 Customers 表中插入一个新行并在 Policy 表中也插入一行以将这个新客户指派给他自己。

Policy 表具有指向 Customers 表和 SalesReps 表的外键。

在统一数据库中,SQL Remote 会执行 Customers 行的插入操作,SQL Anywhere 会在插入操作执行时在事务日志中记录下预订值。

随后,当 SQL Remote 对事务日志进行扫描时,会从预订表达式生成一个预订者列表,但 Marc Dill 不在该列表中,因为还未应用 Policy 表中将客户指派给他的那个行。如果 subscribe_by_remote 被设置为 Off,则结果是将这个新客户作为一个 DELETE 语句发送回 Marc Dill。

只要 subscribe_by_remote 设置为 On,SQL Remote 就会假定该行与插入它的销售代表相关联,也不会将 INSERT 复制回 Marc Dill,并且复制系统保持原样。

如果 subscribe_by_remote 设置为 Off,则您必须确保 Policy 行在 Customers 行之前插入,并通过将检查推迟到事务结束来避免参照完整性违规。

 另请参见