この例では、タイムスタンプベースの同期のファイルベースのダウンロードを実行します。3 つのデータベースを設定し、次に、ファイルによってデータをダウンロードする方法を示します。この例は、参考にするだけでもかまいませんし、テキストをコピー・アンド・ペーストしてサンプルを実行することもできます。
次のコマンドは、この例で使用される統合データベース、リモート・データベース、ファイル定義データベースの 3 つのデータベースを作成します。
dbinit tcons.db dbinit tremote.db dbinit tfdef.db |
次のコマンドは、この 3 つのデータベースを起動し、統合データベースへの接続に使用する Mobile Link のデータ・ソース名を作成します。
dbeng11 -n tfdef_eng tfdef.db dbeng11 -n tcons_eng tcons.db dbeng11 -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" |
Interactive SQL を開き、tcons.db に接続して、Mobile Link 設定スクリプトを実行します。次に例を示します。
read "c:\Program Files\SQL Anywhere 11\MobiLink\setup\syncsa.sql" |
Mobile Link サーバを起動します。
start mlsrv11 -v+ -c "dsn=tfbd_demo" -zu+ -ot tcons.txt |
この例では、統合データベースには T1 というテーブルが 1 つあります。統合データベースに接続すると、次のコードを実行してテーブル 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( {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 WHERE last_modified >= {ml s.last_table_download}' ); |
次のコードは、すべてのサブスクリプションの世代番号を 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( {ml s.generation_number}, {ml s.username}, {ml s.publication_name}, {ml s.last_publication_upload}, {ml s.last_publication_download} ) }' ); COMMIT; |
次のコードは、filebased というスクリプト・バージョンを定義します。このスクリプト・バージョンは、ファイルベースのダウンロードの作成に使用されます。
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_table_script( 'filebased', 'T1', 'download_cursor', 'SELECT pk, c1 FROM T1 WHERE last_modified >= {ml s.last_table_download}' ); |
次のコードは、最後の 5 日間に発生したすべての変更がダウンロード・ファイルに追加されるように最終ダウンロード時刻を設定します。最後の 5 日間に作成されたどのダウンロード・ファイルも取得していないリモートは、通常の同期を実行しないと、これよりも後のファイルベースのダウンロードを適用することはできません。
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( {ml s.last_download}, {ml s.username} )' ); COMMIT; |
この例では、リモート・データベースにも T1 というテーブルが 1 つあります。リモート・データベースに接続した後、次の SQL コマンドを実行して、テーブル T1、パブリケーション P1、ユーザ U1 を作成します。また、このコードは P1 に対する U1 のサブスクリプションも作成します。
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 というスクリプト・バージョンを定義します。このスクリプト・バージョンには、1 つの 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( {ml s.generation_number}, {ml s.username}, {ml s.publication_name} ) }' ); 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 |
次のコマンドは、3 つのデータベース・サーバをすべて停止してから、ファイルを消去します。
del tfile1.df mlstop -h -w dbstop -y -c "eng=tfdef_eng; uid=DBA; pwd=sql" dbstop -y -c "eng=tcons_eng; uid=DBA; pwd=sql" dbstop -y -c "eng=tremote_eng; uid=DBA; pwd=sql" dberase -y tfdef.db dberase -y tcons.db dberase -y tremote.db |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |