Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » Mobile Link - サーバ管理 » Mobile Link サーバ・テクノロジの使用 » Mobile Link ファイルベースのダウンロード » ファイルベースのダウンロード例

 

タイムスタンプベースの例

この例では、タイムスタンプベースの同期のファイルベースのダウンロードを実行します。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