此示例将实现基于文件的下载以便进行快照同步。它将建立基于文件的下载所要求的三个数据库,然后演示如何下载数据。所提供的示例既可以只用于阅读,也通过剪切和粘贴文本来运行该示例。
以下命令将创建示例中使用的三个数据库:统一数据库、远程数据库和文件定义数据库。
dbinit scons.db dbinit sremote.db dbinit sfdef.db |
以下命令将启动这三个数据库,并创建 MobiLink 连接到统一数据库时使用的数据源名。
dbeng12 -n sfdef_eng sfdef.db dbeng12 -n scons_eng scons.db dbeng12 -n sremote_eng sremote.db dbdsn -y -w fbd_demo -c "SERVER=scons_eng;DBF=scons.db;UID=DBA;PWD=sql;ASTART=off;ASTOP=off" |
打开 Interactive SQL,连接到 scons.db,并运行 MobiLink 安装脚本。例如:
read "C:\Program Files\SQL Anywhere 12\MobiLink\setup\syncsa.sql" |
启动 MobiLink 服务器:
start mlsrv12 -v+ -c "DSN=fbd_demo" -zu+ -ot scons.txt |
在此示例中,统一数据库包含一个名为 T1 的表。连接到统一数据库后,您可以运行以下 SQL 来创建表 T1:
CREATE TABLE T1 ( pk INTEGER PRIMARY KEY, c1 INTEGER ); |
以下代码将创建一个名为 filebased 的脚本版本,并为该脚本版本创建一个下载脚本。
CALL ml_add_table_script( 'filebased', 'T1', 'download_cursor', 'SELECT pk, c1 FROM T1' ); |
以下代码将创建一个名为 normal 的脚本版本,并为该脚本版本创建上载和下载脚本。
CALL ml_add_table_script ( 'normal', 'T1', 'upload_insert', 'INSERT INTO T1 VALUES ({ml r.pk}, {ml r.c1})'); CALL ml_add_table_script( 'normal', 'T1', 'upload_update', 'UPDATE T1 SET c1 = {ml r.c1} WHERE pk = {ml r.pk} ' ); CALL ml_add_table_script( 'normal', 'T1', 'upload_delete', 'DELETE FROM T1 WHERE pk = {ml r.pk}' ); CALL ml_add_table_script( 'normal', 'T1', 'download_cursor', 'SELECT pk, c1 FROM T1' ); CALL ml_add_table_script( 'normal', 'T1', 'download_delete_cursor', '--{ml_ignore}' ); COMMIT; |
以下命令将创建存储过程 begin_pub,并指定 begin_pub 为 "normal" 和 "filebased" 脚本版本的 begin_publication 脚本:
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( 'filebased', 'begin_publication', '{ call begin_pub( {ml s.generation_number}, {ml s.username}, {ml s.publication_name} ) }' ); CALL ml_add_connection_script( 'normal', 'begin_publication', '{ call begin_pub( {ml s.generation_number}, {ml s.username}, {ml s.publication_name} ) }' ); |
在此示例中,远程数据库也包含一个名为 T1 的表。连接到远程数据库并运行下列 SQL 以创建表 T1、一个名为 P1 的发布和一个名为 U1 的用户。该 SQL 语句还会为 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 挂接,以在远程数据库中实现用户定义的校验逻辑:
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 |
在使用基于文件的下载的 MobiLink 系统中,需要文件定义数据库。此数据库与基于文件的下载所更新的远程数据库具有相同的模式,且不包含任何数据或状态信息。文件定义数据库仅用于定义即将包含在下载文件中的数据的结构。一个文件定义数据库可用于多个远程数据库组,每个组都由其自己的 MobiLink 组用户名定义。
以下代码将为此示例定义文件定义数据库。它将创建一个与远程数据库相同的模式,还将创建:
一个名为 P1 的发布,以发布表 T1 的所有行。文件定义数据库和远程数据库必须使用相同的发布名称。
一个名为 G1 的 MobiLink 用户。此用户代表即将在基于文件的下载中更新的所有远程数据库。
一个发布的预订。
您必须先连接到 sfdef.db 然后才能运行此代码。
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 选项创建下载文件。此示例说明如何通过执行常规同步来初始化新的远程数据库。
您可以使用先前创建的名为 normal 的脚本版本对远程数据库进行初始同步:
dbmlsync -c "UID=DBA;PWD=sql;SERVER=sremote_eng;DBF=sremote.db" -v+ -e "sv=normal" |
连接到统一数据库,并插入一些由基于文件的下载进行同步的数据(例如以下数据):
INSERT INTO T1 VALUES( 1, 1 ); INSERT INTO T1 VALUES( 2, 4 ); INSERT INTO T1 VALUES( 3, 9 ); COMMIT; |
以下命令必须在具有文件定义数据库的计算机上运行。此命令执行以下操作:
dbmlsync -bc 选项将创建下载文件,并将其命名为 file1.df。
-be 选项将把字符串 "OK" 纳入将要由 sp_dbmlsync_validate_download_file 挂接访问的下载文件。
dbmlsync -c "UID=DBA;PWD=sql;SERVER=sfdef_eng;DBF=sfdef.db" -v+ -e "sv=filebased" -bc file1.df -be ok -ot fdef.txt |
要应用该下载文件,可在远程数据库上使用 -ba 选项运行 dbmlsync,并提供要应用的下载文件的名称:
dbmlsync -c "UID=DBA;PWD=sql;SERVER=sremote_eng; DBF=sremote.db" -v+ -ba file1.df -ot remote.txt |
现在已将更改应用到远程数据库。打开 Interactive SQL,连接到远程数据库,然后运行以下 SQL 语句,检查远程数据库中是否有这些数据:
SELECT * FROM T1 |
以下命令停止所有三个数据库服务器并消除文件。
del file1.df mlstop -h -w dbstop -y -c "SERVER=sfdef_eng; UID=DBA; PWD=sql" dbstop -y -c "SERVER=scons_eng; UID=DBA; PWD=sql" dbstop -y -c "SERVER=sremote_eng; UID=DBA; PWD=sql" dberase -y sfdef.db dberase -y scons.db dberase -y sremote.db |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |