定义用于解决特定表中冲突的过程。
在下表中,[说明] 部分提供 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 脚本。
下面的语句定义了适用于 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;下面的存储过程调用在同步脚本版本 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 ); }SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。