此示例实现基于文件的下载以便进行基于时间戳的同步。它将建立基于文件的下载所要求的三个数据库,然后演示如何使用此功能下载数据。此示例的提供方式:您可以只阅读它,也可以剪切和粘贴文本来运行该示例。
以下命令创建三个在示例中使用的数据库:一个统一数据库、一个远程数据库和一个文件定义数据库。
dbinit tcons.db dbinit tremote.db dbinit tfdef.db
以下命令启动这三个数据库,创建一个 MobiLink 连接到统一数据库所使用的数据源名称,然后启动 MobiLink 同步服务器。
dbeng9 -n tfdef_eng tfdef.db dbeng9 -n tcons_eng tcons.db dbeng9 -n tremote_eng tremote.db dbdsn -y -w tfbd_demo -c "eng=tcons_eng;dbf=tcons.db;uid=dba; pwd=sql;astart=off;astop=off" start dbmlsrv9 -v+ -c "dsn=tfbd_demo" -zu+ -ot tcons.txt
在此示例中,统一数据库包含一个名为 T1 的表。连接到统一数据库后,您可以运行以下代码来创建 T1:
CREATE TABLE T1 ( pk INTEGER PRIMARY KEY, c1 INTEGER, last_modified TIMESTAMP DEFAULT TIMESTAMP );
下列代码定义名为 normal 的脚本版本,该脚本版本中包含最少量的脚本。该脚本版本用于不 使用基于文件的下载的同步。
CALL ml_add_table_script( 'normal', 'T1',
'upload_insert',
'INSERT INTO T1( pk, c1) VALUES( ?, ? )' );
CALL ml_add_table_script( 'normal', 'T1',
'upload_update',
'UPDATE T1 SET c1 = ? WHERE pk = ? ' );
CALL ml_add_table_script( 'normal', 'T1',
'upload_delete',
'DELETE FROM T1 WHERE pk = ?' );
CALL ml_add_table_script( 'normal', 'T1',
'download_cursor',
'SELECT pk, c1 FROM T1 WHERE last_modified >= ?' );下列代码将所有预订的世代号设置为 1。使用世代号是个很好的做法,可备用于统一数据库丢失或损坏而您需要强制实施上载的情形。
CREATE PROCEDURE begin_pub (
INOUT generation_num integer,
IN username varchar(128),
IN pubname varchar(128) )
BEGIN
SET generation_num = 1;
END;
CALL ml_add_connection_script( 'normal',
'begin_publication',
'{ call begin_pub( ?, ?, ? ) }' );
COMMIT;下列代码定义名为 filebased 的脚本版本。此脚本版本用于创建基于文件的下载。
CALL ml_add_connection_script( 'filebased',
'begin_publication',
'{ call begin_pub( ?, ?, ? ) }' );
CALL ml_add_table_script( 'filebased', 'T1',
'download_cursor',
'SELECT pk, c1 FROM T1 WHERE last_modified >= ?' );下列代码设置上次下载时间,以便将过去的五天里发生的所有更改包含在下载文件中。任何缺少过去的五天里创建的所有下载文件的远程数据库将必须先执行常规同步,然后才能应用其它基于文件的下载。
CREATE PROCEDURE ModifyLastDownloadTimestamp(
INOUT last_download_timestamp TIMESTAMP,
IN ml_username VARCHAR(128) )
BEGIN
SELECT dateadd( day, -5, CURRENT TIMESTAMP )
INTO last_download_timestamp;
END;
CALL ml_add_connection_script( 'filebased',
'modify_last_download_timestamp',
'CALL ModifyLastDownloadTimestamp( ?, ? )' );
COMMIT;在此示例中,远程数据库也包含一个名为 T1 的表。连接到远程数据库后,运行下列代码以创建表 T1、一个名为 P1 的发布和一个名为 U1 的用户。该代码还会为 U1 创建 P1 的预订。
CREATE TABLE T1 (
pk INTEGER PRIMARY KEY,
c1 INTEGER
);
CREATE PUBLICATION P1 (
TABLE T1
);
CREATE SYNCHRONIZATION USER U1;
CREATE SYNCHRONIZATION SUBSCRIPTION
TO P1
FOR U1;下列代码定义 sp_hook_dbmlsync_validate_download_file 存储过程。此存储过程可防止应用其中未嵌入字符串"ok"的下载文件。
CREATE PROCEDURE sp_hook_dbmlsync_validate_download_file()
BEGIN
DECLARE udata varchar(256);
SELECT value
INTO udata
FROM #hook_dict
WHERE name = 'user data';
IF udata <> 'ok' THEN
UPDATE #hook_dict
SET value = 'FALSE'
WHERE name = 'apply file';
END IF;
END下列代码为此时间戳示例定义文件定义数据库。它创建一个表、一个发布、一个用户和该用户的一个发布预订。
CREATE TABLE T1 (
pk INTEGER PRIMARY KEY,
c1 INTEGER
);
CREATE PUBLICATION P1 (
TABLE T1
);
CREATE SYNCHRONIZATION USER G1;
CREATE SYNCHRONIZATION SUBSCRIPTION
TO P1
FOR G1;要对新的远程数据库进行准备以便应用下载文件,您需要执行常规同步或使用 dbmlsync -bg 选项创建下载文件。此示例说明如何使用 -bg。
下列代码为统一数据库定义名为 filebased_init 的脚本版本。此脚本版本有一个 begin_publication 脚本。
CALL ml_add_table_script(
'filebased_init', 'T1', 'download_cursor',
'SELECT pk, c1 FROM T1' );
CALL ml_add_connection_script(
'filebased_init',
'begin_publication',
'{ call begin_pub( ?, ?, ? ) }' );
COMMIT;下列两个命令行使用名为 filebased_init 的脚本版本和 -bg 选项,创建并应用初始下载文件。
dbmlsync -c "uid=dba;pwd=sql;eng=tfdef_eng;dbf=tfdef.db" -v+ -e "sv=filebased_init" -bc tfile1.df -be ok -bg -ot tfdef1.txt dbmlsync -c "uid=dba;pwd=sql;eng=tremote_eng;dbf=tremote.db" -v+ -ba tfile1.df -ot tremote.txt
连接到统一数据库,并插入一些由基于文件的下载进行同步的数据(例如以下数据):
INSERT INTO T1(pk, c1) VALUES( 1, 1 ); INSERT INTO T1(pk, c1) VALUES( 2, 4 ); INSERT INTO T1(pk, c1) VALUES( 3, 9 ); commit;
下列命令行创建包含新的数据的下载文件。
dbmlsync -c "uid=dba;pwd=sql;eng=tfdef_eng;dbf=tfdef.db" -v+ -e "sv=filebased" -bc tfile2.df -be ok -ot tfdef2.txt
下列命令行将下载文件应用到远程数据库。
dbmlsync -c "uid=dba;pwd=sql;eng=tremote_eng;dbf=tremote.db" -v+ -ba tfile2.df -ot tfdef3.txt
现在,就将更改应用到远程数据库了。打开 Interactive SQL,连接到远程数据库,然后运行以下 SQL 命令,检查远程数据库中是否有这些数据:
SELECT * FROM T1
下列命令停止所有三个数据库引擎,然后消除文件。
del file1.df dbmlstop -h -w dbstop -y -c eng=tfdef_eng dbstop -y -c eng=tcons_eng dbstop -y -c eng=tremote_eng dberase -y tfdef.db dberase -y tcons.db dberase -y tremote.db
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。