定义游标,MobiLink 同步服务器用该游标插入旧行值,这些值在远程数据库中已经更新,但它们与当前统一数据库中的值相冲突。该事件也用于在强制冲突模式中插入删除的行值。
对上载使用基于语句的事件已不支持使用此脚本。请用基于语句的事件 upload_old_row_insert。将来的版本中很可能会删除对 old_row_cursor 事件的支持。 |
在下表中,[说明] 部分提供 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。请参见 SQL-Java 数据类型和 SQL-.NET 数据类型。
| 项 | 参数 | 说明 |
|---|---|---|
| 1 | ml_username | VARCHAR(128) |
无。
在远程数据库上更新行时,MobiLink 客户端将保存原始值的副本。客户端将数据的旧值和新值一同发送到 MobiLink 同步服务器。
在 MobiLink 同步服务器接收到更新的行时,它会使用 upload_cursor 事件将原始值与统一数据库中的当前值进行比较。如果旧的上载值与统一数据库中的当前值不匹配,则该行发生冲突。MobiLink 同步服务器将分别使用 old_row_cursor 事件和 new_row_cursor 事件将旧值和新值插入到统一数据库中,而不是更新该行。
使用临时表存储冲突行的新旧版本是常用的做法。在 Adaptive Server Anywhere 中,您可以在前一个脚本中创建这些表。某些非 ASA 统一数据库支持临时表,但它们通常明显不同于 ASA 提供的临时表。有关详细信息,请参见您的 DBMS 文档。可以使用具有用于 MobiLink 用户名的额外列的基表代替临时表。这将在并发同步间有效地区分基表的行。
MobiLink 同步服务器使用游标将旧的上载值从冲突行插入到统一数据库。该脚本中包含用于定义此游标的 SELECT 语句。
您可以为远程数据库的每个表编写一个 old_row_cursor 脚本。
通常,SELECT 列表中的列必须与客户端表中的列具有相同的顺序和类型。但 MobiLink 同步服务器允许额外添加一列。如果您额外添加了一列,MobiLink 同步服务器将自动向第一列中插入用户名,接着继续照常使用其余的列插入新的行值。
下面的 SELECT 语句定义了适用于 Oracle 安装的 CustDB 示例应用程序的 old_row_cursor 脚本。ULOrder 表的主键是 order_id。
call ml_add_table_script(
'ver1',
'table1',
'old_row_cursor',
'SELECT order_id, cust_id, prod_id, emp_id,
disc, quant, notes, status
FROM ULOldOrder')而下面的 SELECT 语句将用于相同的客户端表。这种情况允许额外添加一列。MobiLink 同步服务器将自动在第一列中存储用户名。
SELECT user_name, order_id, cust_id, prod_id,
emp_id, disc, quant, notes, status
FROM ULOldOrder此脚本必须返回有效的 SQL。
下面的存储过程调用在同步脚本版本 ver1 时将名为 oldRowCursor 的 Java 方法注册为 old_row_cursor 事件的脚本。
call ml_add_java_table_script( 'ver1', 'table1', 'old_row_cursor', 'ExamplePackage.ExampleClass.oldRowCursor' )
下面是示例 Java 方法 oldRowCursor。它通过调用 Java 方法动态生成旧行游标语句。
public String oldRowCursor()
{ return( getRowCursor( _curTable ) ); }SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。