この例では、タイムスタンプベースの同期のファイルベースのダウンロードを実行します。3 つのデータベースを設定し、次に、ファイルによってデータをダウンロードする方法を示します。この例は、参考にするだけでもかまいませんし、テキストをコピーアンドペーストしてサンプルを実行することもできます。
次のコマンドは、この例で使用する 3 つのデータベース (統合データベース、リモートデータベース、ファイル定義データベース) を作成します。
dbinit -dba DBA,sql tcons.db dbinit -dba DBA,sql tremote.db dbinit -dba DBA,sql tfdef.db |
次のコマンドは、この 3 つのデータベースを起動し、統合データベースへの接続に使用する Mobile Link のデータソース名を作成します。
dbeng16 -n tfdef_eng tfdef.db dbeng16 -n tcons_eng tcons.db dbeng16 -n tremote_eng tremote.db dbdsn -y -w tfbd_demo -c "SERVER=tcons_eng;DBF=tcons.db;UID=DBA;PWD=sql;START=off;ASTOP=off" |
Interactive SQL を開き、tcons.db に接続して、Mobile Link 設定スクリプトを実行します。次に例を示します。
read "C:\Program Files\SQL Anywhere 16\MobiLink\setup\syncsa.sql" |
Mobile Link サーバを起動します。
start mlsrv16 -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;SERVER=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;SERVER=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;SERVER=tfdef_eng;DBF=tfdef.db" -v+ -e "sv=filebased" -bc tfile2.df -be ok -ot tfdef2.txt |
次のコマンドラインは、ダウンロードファイルをリモートデータベースに適用します。
dbmlsync -c "UID=DBA;PWD=sql;SERVER=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 "SERVER=tfdef_eng; UID=DBA; PWD=sql" dbstop -y -c "SERVER=tcons_eng; UID=DBA; PWD=sql" dbstop -y -c "SERVER=tremote_eng; UID=DBA; PWD=sql" dberase -y tfdef.db dberase -y tcons.db dberase -y tremote.db |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |