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 scons.db
dbinit sremote.db
dbinit sfdef.db

次のコマンドは、この 3 つのデータベースを起動し、統合データベースへの接続に使用する Mobile Link のデータ・ソース名を作成します。

dbeng11 -n sfdef_eng sfdef.db
dbeng11 -n scons_eng scons.db
dbeng11 -n sremote_eng sremote.db
dbdsn -y -w fbd_demo -c "eng=scons_eng;dbf=scons.db;uid=DBA;
   pwd=sql;astart=off;astop=off"

Interactive SQL を開き、scons.db に接続して、Mobile Link 設定スクリプトを実行します。次に例を示します。

read "c:\Program Files\SQL Anywhere 11\MobiLink\Setup\syncsa.sql"

Mobile Link サーバを起動します。

start mlsrv11 -v+ -c "dsn=fbd_demo" -zu+ -ot scons.txt
スナップショットの例で使用する統合データベースの設定

この例では、統合データベースには T1 というテーブルが 1 つあります。統合データベースに接続すると、次の 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' );

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 というテーブルが 1 つあります。リモート・データベースに接続し、次の SQL コマンドを実行して、テーブル T1、パブリケーション P1、ユーザ U1 を作成します。また、この SQL は 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 フックを作成して、ユーザ定義の検証論理をリモート・データベースに実装します。

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
スナップショット例で使用するファイル定義データベースの作成

ファイルベースのダウンロードを使用する Mobile Link システムには、ファイル定義データベースが必要です。このデータベースのスキーマはファイルベースのダウンロードで更新されるリモート・データベースのスキーマと同じですが、データとステータス情報は格納されていません。ファイル定義データベースは、ダウンロード・ファイルに格納されるデータの構造を定義するためだけに使用します。リモート・データベースの Mobile Link グループのユーザ名で定義された、多数のグループのリモート・データベースに対して、1 つのファイル定義データベースを使用できます。

次のコードは、この例で使用するファイル定義データベースを定義します。このコードはリモート・データベースと同じスキーマを作成し、さらに以下を作成します。

  • P1 という名前のパブリケーション。T1 テーブルのすべてのローをパブリッシュします。ファイル定義データベースとリモート・データベースでは、同じパブリケーション名を使用する必要があります。

  • G1 という名前の Mobile Link ユーザ。このユーザは、ファイルベースのダウンロードで更新されるすべてのリモート・データベースを表しています。

  • パブリケーションに対するサブスクリプション

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;eng=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;eng=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;eng=sremote_eng;
   dbf=sremote.db" -v+ -ba file1.df -ot remote.txt

これで、リモート・データベースに変更が適用されました。Interactive SQL を開いてリモート・データベースに接続し、次に示す SQL 文を実行して、リモート・データベースにデータがあることを確認します。

SELECT * FROM T1
スナップショット例のクリーンアップ

次のコマンドは、3 つのデータベース・サーバをすべて停止してから、ファイルを消去します。

del file1.df
mlstop -h -w
dbstop -y -c "eng=sfdef_eng; uid=DBA; pwd=sql"
dbstop -y -c "eng=scons_eng; uid=DBA; pwd=sql"
dbstop -y -c "eng=sremote_eng; uid=DBA; pwd=sql"
dberase -y sfdef.db
dberase -y scons.db
dberase -y sremote.db