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

SQL Anywhere 11.0.1 (中文) » MobiLink - 入门 » MobiLink 技术简介 » 研究 MobiLink Contact 示例 » 同步 Contact 示例

 

同步 Contact 示例中的联系人

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

    由于 MobiLink 客户端将自动使用级联参照完整性,因此在从远程数据库中删除客户时,相应的联系人也将删除。所以 download_delete_cursor 脚本必须仅删除标记为非活动的那些联系人。

上载

可以在远程数据库中插入、更新或删除联系人信息。与这些操作对应的脚本如下:

  • upload_insert   以下 upload_insert 脚本将在 Contact 表中添加一行,并将联系人标记为活动:
    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 = ?