为检测行级冲突的目的从统一数据库的已同步表中读取行。
SQL 脚本的参数名称 |
顺序 |
---|---|
r.primary-key-1 |
1 |
r.primary-key-2 |
2 |
... |
... |
r.primary-key-N |
N |
无。
基于语句的 upload_fetch 脚本用于从同步表中读取行以便检测冲突。它随 upload_update 事件使用。
结果集的列数必须与从远程数据库为此表上载的列数相匹配。如果返回值与上载的行中的前映像不匹配,则发生冲突。
不要在 upload_fetch 脚本中使用 READPAST 表提示。如果该脚本使用 READPAST 跳过锁定行,则同步逻辑会认为该行已被删除。根据您所定义的脚本,这会造成忽略上载的更新或触发冲突解决。忽略更新可能是不可接受的行为并可能是有害的。触发冲突解决可能不是一个问题,它取决于您已实现的解决逻辑。
您只能为远程数据库中的每个表编写一个 upload_fetch 脚本或一个 upload_fetch_column_conflict 脚本。
此脚本在未定义以下脚本时可以被忽略:upload_new_row_insert、upload_old_row_insert 和 resolve_conflict。
以下 SQL 脚本来自 Contact 示例,并可在 samples-dir\MobiLink\Contact\build_consol.sql 中找到。它用于识别在上载远程数据库中 Product 表的更新行时发生的冲突。此脚本从名称也为 Product 的表中选择行,这两个表的名称也可以不匹配,匹配与否取决于统一数据库与远程数据库的模式。
CALL ml_add_table_script( 'ver1', 'Product', 'upload_fetch', 'SELECT id, name, size, quantity, unit_price FROM Product WHERE id={ml r.id}' ) |
此脚本必须返回有效的 SQL。
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时将名为 uploadFetchTable 的 Java 方法注册为 upload_fetch 表事件的脚本。
CALL ml_add_java_table_script( 'ver1', 'Product', 'upload_fetch', 'ExamplePackage.ExampleClass.uploadFetchTable' ) |
以下是 Java 方法 uploadFetchTable 示例。它调用 genUF 来动态生成一条 UPLOAD 语句。
public String uploadFetchTable() { return( genUF(_curTable) ); } |
此脚本必须返回有效的 SQL。
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时将名为 UploadFetchTable 的 .NET 方法注册为 upload_fetch 表事件的脚本。
CALL ml_add_dnet_table_script( 'ver1', 'Product', 'upload_fetch', 'TestScripts.Test.UploadFetchTable' ) |
以下是 .NET 方法 UploadFetchTable 示例。它调用 GenUF 来动态生成一条 UPLOAD 语句。
public string UploadFetchTable() { return( GenUF(_curTable) ); } |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |