Collection Contents 上一页 下一页 PDF

MobiLink 管理指南

同步事件

resolve_conflict 表事件


功能 

定义用于解决特定表中冲突的过程。

参数 

在下表中,[说明] 部分提供 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。请参见 SQL-Java 数据类型SQL-.NET 数据类型

只有当未指定任何后续参数时,事件参数才是可选的。如果要使用参数 2,您必须使用参数 1。

参数 说明
1 ml_username VARCHAR(128)
2 table VARCHAR(128)
缺省操作 

无。

说明 

在远程数据库上更新行时,MobiLink 客户端将保存原始值的副本。客户端将数据的旧值和新值一同发送到 MobiLink 同步服务器。

在 MobiLink 同步服务器接收到更新的行时,它会将原始值与统一数据库中的当前值进行比较。使用 upload_fetch 脚本执行比较。

如果旧的上载值与统一数据库中的当前值不匹配,则该行发生冲突。MobiLink 同步服务器会将旧值和新值同时插入到统一数据库中,而不是更新该行。分别使用 upload_old_row_insert 和 upload_new_row_insert 脚本处理旧行和新行。如果您使用基于游标的上载,则分别使用 old_row_cursor 和 new_row_cursor 来处理行。

一旦插入值,MobiLink 同步服务器将执行 resolve_conflict 脚本。它可用于解决冲突。您可以实现您选择的任何一种方案。

每发生一次冲突该脚本执行一次。

或者,您可以不定义 resolve_conflict 脚本,而是通过将冲突解决逻辑写入 end_upload_rows 脚本或 end_upload 表脚本以面向组的方式来解决冲突。

您可以为远程数据库的每个表编写一个 resolve_conflict 脚本。

另请参见 
SQL 示例 

下面的语句定义了适用于 Oracle 系统中 CustDB 示例应用程序的 resolve_conflict 脚本。它调用了 ULResolveOrderConflict 存储过程。

exec ml_add_table_script(
   'custdb', 'ULOrder', 'resolve_conflict',
   'begin ULResolveOrderConflict();
end; ')

CREATE OR REPLACE PROCEDURE ULResolveOrderConflict()
AS
  new_order_id integer;
  new_status   varchar(20);
  new_notes   varchar(50);
BEGIN
  -- approval overrides denial
  SELECT order_id, status, notes
    INTO new_order_id, new_status, new_notes
    FROM ULNewOrder
   WHERE syncuser_id = SyncUserID;
  IF new_status = 'Approved' THEN
    UPDATE ULOrder o
       SET o.status = new_status, o.notes =
new_notes
     WHERE o.order_id = new_order_id;
  END IF;
  DELETE FROM ULOldOrder;
  DELETE FROM ULNewOrder;
END;
Java 示例 

下面的存储过程调用在同步脚本版本 ver1 时将名为 resolveConflict 的 Java 方法注册为 resolve_conflict 表事件的脚本。

call ml_add_java_table_script(
   'ver1',
   'table1',
   'resolve_conflict',
   'ExamplePackage.ExampleClass.resolveConflict' )

下面是示例 Java 方法 resolveConflict。它调用的 Java 方法将使用 MobiLink 提供的 JDBC 连接。它还将设置动作代码。

public String resolveConflict( String user,
 String table)
{  resolveRows(_syncConn, user ); }

Collection Contents 上一页 下一页 PDF