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 复制设计和设置

 

使用无交集数据分区

当远程数据库不共享数据时,数据分区是无交集的。例如,每个销售代表都有自己的一组客户,并且他们不与其他销售代表共享客户。

在下面的示例中,有三个表存储着销售代表和客户之间的交互信息:Customers、Contacts 和 SalesReps。每个销售代表都向若干个客户销售产品。某些客户只有一个联系人,而另一些客户则有多个联系人。

Contacts 表具有一个指向 Customers 表的外键。Customer 表具有一个指向 SalesRep 表的外键。
Contacts、Customers 和 SalesReps 表的说明

下表介绍了 Customers、Contacts 和 SalesReps 数据库表,详见使用无交集数据分区

说明 表定义

Contacts

与该公司有业务来往的所有单独联系人。每个联系人都属于单个客户。Contacts 表包含以下几列:

  • contact_key   每个联系人的标识符。这是主键。

  • name   每个联系人的姓名。

  • cust_key   该联系人所属客户的标识符。这是一个指向 Customers 表的外键。

CREATE TABLE Contacts (
   contact_key  CHAR(12) NOT NULL,
   name  CHAR(40) NOT NULL,
   cust_key  CHAR(12) NOT NULL,
   FOREIGN KEY  REFERENCES Customers,
   PRIMARY KEY  (contact_key)
);

Customers

与该公司有业务来往的所有客户。Customers 表包含以下几列:

  • cust_key   每个客户的标识符。这是主键。

  • name   每个客户的名称。

  • rep_key   某销售关系中销售代表的标识符。这是一个指向 SalesReps 表的外键。

CREATE TABLE Customers (
   cust_key CHAR(12) NOT NULL,
   name CHAR(40) NOT NULL,
   rep_key CHAR(12) NOT NULL,
   FOREIGN KEY REFERENCES SalesReps,
   PRIMARY KEY (cust_key)
);

SalesReps

在该公司工作的所有销售代表。SalesReps 表包含以下几列:

  • rep_key   每个销售代表的标识符。这是主键。

  • name   每个销售代表的姓名。

CREATE TABLE SalesReps (
   rep_key CHAR(12) NOT NULL,
   name CHAR(40) NOT NULL,
   PRIMARY KEY (rep_key)
);

销售代表必须预订提供以下信息的发布:

  • 为公司工作的所有销售代表的列表   以下语句将创建一个发布整个 SalesRep 表的发布:
    CREATE PUBLICATION SalesRepData (
       Table SalesReps ...)
    );  

  • 指派给他们的客户列表    此信息可在 Customers 表中找到。以下语句将创建一个发布 Customers 表的发布,该发布包含与 Customers 表中的 rep_key 列值匹配的行:
    CREATE PUBLICATION SalesRepData (
       TABLE Customers SUBSCRIBE BY rep_key ...
    );

  • 他们的被指派客户的联系信息列表    此信息可在 Contacts 表中找到。Contacts 表必须在销售代表之间进行分区,但没有对 SalesRep 表中的 rep_key 值的任何引用。要解决此问题,可以在 Contacts 项目中使用一个引用 Customers 表的 rep_key 列的子查询。

    以下语句将创建一个发布 Contacts 表的发布,该发布包含引用 Customers 表的 rep_key 列的行。

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

    Customers 表中的某一行含有 Contacts 表的当前行中的 cust_key 值;SUBSCRIBE BY 语句中的 WHERE 子句可确保该子查询只返回一个值。

以下语句创建完整的发布:

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

使用 BEFORE UDPATE 触发器