编写 download_delete_cursor 脚本以从远程数据库中删除行。您必须为远程数据库中每个需要在同步过程中删除行的表,编写一个此类型的脚本。
仅在统一数据库中删除行,不能使它们在远程数据库中消失。您需要跟踪已删除行的主键,以便使用 download_delete_cursor 选择这些主键。有两种常用技术可以实现这一点:
逻辑删除 不在统一数据库中物理删除行。而是用一个状态列来跟踪行是否有效。这简化了 download_delete_cursor。但是,可能需要对 download_cursor 和其它应用程序进行修改,以使它们能识别和使用状态行。如果您有一个记录删除时间的上次修改列,而且您还对每个远程数据库的上次下载时间进行跟踪,则在所有远程下载时间都晚于删除时间时,即可物理地删除该行。
影子表 为您想要跟踪其删除操作的每个表创建一个包含两个列的影子表:一个列存放该表的主键,另一列存放时间戳。创建一个只要行被删除就会向影子表中插入主键和时间戳的触发器。然后,您的 download_delete_cursor 就可以从这个影子表中进行选择。与逻辑删除一样,一旦所有远程数据库都下载了相应的数据,您就可以将该行从影子表中删除。
MobiLink 服务器通过从统一数据库选择主键值并将这些值传递到远程数据库,来实现远程数据库中行的删除。如果这些值与远程数据库中的主键值相匹配,则该行将被删除。
每个 download_delete_cursor 脚本必须包含一个 SELECT 语句,或者一个对返回结果集的存储过程的调用。MobiLink 服务器将使用此语句在统一数据库中定义游标。
此语句必须选择与远程数据库表中的主键列对应的所有列。统一数据库中的列可以与远程数据库中相应的列具有不同的名称,但是列的类型必须相互兼容。
必须按照与值对应的列在远程数据库中定义的顺序选择值。此顺序是用于创建表的 CREATE TABLE 语句中的列顺序,而不是列在定义主键的语句中出现的顺序。
如果删除父记录,则子记录也会自动删除。
有关删除子记录的详细信息,请参见参照完整性与同步。
尽管每个 download_delete_cursor 脚本必须选择在相应远程表的主键中出现的所有列值,但它也可以选择所有其它列。此功能的目的是为了与旧客户端的兼容。选择更多列会降低效率,因为数据库服务器必须检索更多的数据。如果客户端的设计不是旧式的,MobiLink 服务器会立即放弃多余的值。多余的值只能下载到旧的客户端。
当 MobiLink 检测到 download_delete_cursor 中的某行全部为空时,它将删除远程表中的所有数据。download_delete_cursor 中的空值数可以是表中的主键列数或总列数。
例如,以下 download_delete_cursor SQL 脚本删除具有两个主键列的表中的每一行。此示例适用于 SQL Anywhere、Adaptive Server Enterprise 和 Microsoft SQL Server 数据库。
SELECT NULL, NULL |
在 IBM DB2 LUW 和 Oracle 统一数据库中,必须指定一个虚表来选择空列。对于 IBM DB2 LUW 7.1,可以使用以下语法:
SELECT NULL, NULL FROM SYSIBM.SYSDUMMY1 |
对于 Oracle 统一数据库,可以使用以下语法:
SELECT NULL, NULL FROM DUAL |
以下示例是用于保存雇员信息的远程表的 download_delete_cursor 脚本。MobiLink 服务器使用此 SQL 语句定义删除游标。此脚本在执行时删除既在统一数据库中又在远程数据库中的所有雇员的信息。
SELECT emp_id FROM employee |
download_delete_cursor 接受参数 last_download 和 ml_username。以下脚本说明如何使用每个参数来缩小选择范围。
SELECT order_id FROM ULOrder WHERE last_modified >= {ml s.last_table_download} AND status = 'Approved' AND user_name = {ml s.username} |
对于某些统一数据库,您可能需要转换为适当的数据类型。请参见CAST 函数 [Data type conversion]。
这些示例在拥有大量雇员的组织中工作效率可能会很低。您可以只选择远程数据库中可能存在的行,从而提高删除过程的效率。例如,可以仅选择新近被指派为经理的人员,从而限制所选行的数目。另一个策略是允许客户端应用程序删除行本身。此方法只有当规则标识出不需要的行时才可能使用。例如,行可以包含一个指示失效日期的时间戳。在删除行之前,使用 STOP SYNCHRONIZATION DELETE 语句在下一次同步过程中停止这些要上载的删除操作。如果要以正常的方式同步其它删除,请确保之后立即执行 START SYNCHRONIZATION DELETE。
download_delete_cursor 脚本必须包含按远程数据库中所定义的顺序排列的主键列。
您可以使用所有 MobiLink 客户端内置的参照完整性检查来删除行,这是一种高效的方法。请参见参照完整性与同步。
有关使用 download_delete_cursor 脚本的详细信息,请参见:
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |