- 第1回:いつでもどこでも使えるデータベース 「SQL Anywhere Studio」
- 第2回:SQL Anywhereのインストールと概要
- 第3回:SQL Anywhereのデータベース管理の基礎
- 第4回:SQL Anywhereでの主キー/スケジュール処理/暗号化
- 第5回:SQL Anywhereのデータベース再構築/アップデート
- 第6回:省リソースで軽快に動作する組込向けデータベース「Ultra Light」
- 第7回:モバイル環境に分散したデータを同期する「Mobile Link」
7.3 同期スクリプトと同期イベント
前節では4つの同期スクリプトが登場した。後述するようにほかにもいろいろな種類があるが、この4つがMobile Link同期の基本となる。
- upload_insert
- upload_delete
- upload_update
- download_cursor
名前が「upload_」から始まる3つがアップロード用のスクリプトで、download_cursorがダウンロード用のスクリプトだ。それぞれの意味を順に解説するが、その前に、スクリプトを登録する方法について説明する。
7.3.1 ml_add_table_scriptストアドプロシージャ
同期スクリプトの種類にかかわらず、同期スクリプトの登録はml_add_table_scriptストアドプロシージャを利用する。
ml_add_table_scriptの引数は4つの項目がある。
引数名 | 説明 |
スクリプトバージョン | 複数のスクリプトをグループ化するグループ名(※1) |
テーブル名 | パブリケーションで指定した同期対象のテーブル名。リモートデータベースの各テーブルに対して一致したものが実行される |
同期イベント名 | SQLスクリプトが実行されるための同期イベント |
SQLスクリプト | SQLで書かれた同期ロジック |
CALL ML_ADD_TABLE_SCRIPT( 'default', --スクリプトバージョン 'product', --リモートデータベースのテーブル名 'upload_insert', --リモートデータベースでINSERTされた行を --アップデータさせるためのイベント 'INSERT INTO product (product_id, quantity) VALUES (?, ?)' --統合データベース上で実行されるSQL文 );
Mobile Linkでは同期対象のテーブル名を統合データベースとリモートデータベースとで同一にする必要はないので、統合データベースではなくリモートデータベースのテーブル名を指定する。このテーブル名がパブリケーションに含まれていれば、同期時のイベントに従ってSQLスクリプトが実行される(このSQL内で統合データベースのテーブル名を指定する)。
では、4つの同期イベント名に対応するSQLスクリプトの解説に入ろう。
7.3.2 アップロードストリーム
名前が「upload_ 」から始まる3つのスクリプトは、アップロードストリームに対する同期ロジックである。同期クライアントからMobile Linkサーバに送信されたアップロードストリームは、追加された行・更新された行・削除された行に仕分けされ、3つのスクリプトを雛形としたSQL文として統合データベースに送信される(図7.12)。
upload_insertイベント
INSERT INTO product (product_id, quantity) VALUES (?, ?)
スクリプト内の「?」はプレースホルダで、Mobile Linkサーバの機能により、アップロードされたデータに置き換わる。プレースホルダの順序は、リモートデータベースのテーブルにおいてCREATE文で定義された順序だ。
プレースホルダの置換を先の例で見ると、追加された「durian」に対し、upload_insertスクリプトを雛形として、次のSQL文が統合データベースへ送信される。
INSERT INTO product (product_id, quantity) VALUES ('durian', 40)
upload_updateイベント
UPDATE product SET quantity = ? WHERE product_id = ?
WHERE句には主キーを含め、それ以外のカラムをSET句で更新する。プレースホルダの置換は、主キーの選別も含めてMobile Linkサーバが自動的に行う。先の例では、「apple」のデータを更新したが、upload_updateスクリプトに従って、次のSQL文が統合データベースで実行される。
UPDATE product SET quantity = 11 WHERE product_id = 'apple'
upload_deleteイベント
DELETE FROM product WHERE product_id = ?
WHERE句には主キーを含める。削除された行の主キーが自動的に置換される。