本课假定您已完成前面的所有课程。 请参见第 1 课:创建统一数据库。
使用连接到远程数据库的 Interactive SQL 实例,创建一个触发器,此触发器使用下列 SQL 在插入每一行时为其设置 insert_time。
CREATE TRIGGER emp_ins AFTER INSERT ON employee REFERENCING NEW AS newrow FOR EACH ROW BEGIN UPDATE employee SET insert_time = CURRENT TIMESTAMP WHERE id = newrow.id END; |
此时间戳用于确定自上次同步以来是否插入了行。在 dbmlsync 应用从统一数据库下载的插入时将不触发此触发器,因为在此示例中稍后会将 FireTriggers 扩展选项设置为 off。通过下载插入的行所获得的 insert_time 值为 1900-01-01,这是创建 employee 表时定义的缺省值。此值应始终早于开始进度,以使这些行不会被视为新插入行,也不会在下一同步期间上载。
仍然在远程数据库中创建一个以结果集形式返回所有要上载的插入行的过程。
CREATE PROCEDURE employee_insert() RESULT( id unsigned integer, name varchar( 256 ), salary numeric( 9,2 ) ) BEGIN DECLARE start_time timestamp; SELECT value INTO start_time FROM #hook_dict WHERE name = 'start progress as timestamp'; // Upload as inserts all rows inserted after the start_time // that were not subsequently deleted SELECT id, name, salary FROM employee e WHERE insert_time > start_time AND NOT EXISTS( SELECT id FROM employee_delete ed WHERE ed.id = e.id ); END; |
此过程返回所有自上次成功上载以来(根据 insert_time)插入但随后未删除的行。上次成功上载的时间由 #hook_dict 表中的 start progress 值确定。此示例使用 dbmlsync 扩展选项 LockTables 的缺省设置,该设置可使 dbmlsync 锁定正在同步的表。因此,不必排除结束进度后插入的行:在构建上载时,表锁定可防止在结束进度后发生任何操作。
前进至第 4 课:处理更新。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |