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 用 SQL Anywhere クライアント » SQL Anywhere クライアントのイベント・フック » dbmlsync のフックの概要 » イベント・フック・プロシージャの使用

 

#hook_dict テーブル

フックが呼び出される直前に、dbmlsync は次の CREATE 文を使用してリモート・データベースに #hook_dict テーブルを作成します。テーブル名の前の # は、そのテーブルがテンポラリであることを意味します。

CREATE TABLE #hook_dict(
name VARCHAR(128) NOT NULL UNIQUE,
value VARCHAR(10240) NOT NULL)

dbmlsync ユーティリティは #hook_dict テーブルを使用してフック関数に値を渡し、フック関数は #hook_dict テーブルを使用して dbmlsync に値を戻します。

各フックは、パラメータ値を受け取ります。パラメータ値の中には、新しい値を返すように変更できるものがあります。それ以外のものは、読み込み専用です。このテーブルの各ローには、1 つのパラメータの値があります。

たとえば、次の dbmlsync コマンド・ラインでは、sp_hook_dbmlsync_abort フックを呼び出す時点では、#hook_dict テーブルには次のようなローが含まれています。

dbmlsync -c 'dsn=MyDsn' -n pub1,pub2 -u MyUser

#hook_dict ロー

publication_0

pub1

publication_1

pub2

MobiLink user

MyUser

Abort synchronization

false

アボート・フックを使用して、#hook_dict テーブルから値を取り出したり、その動作をカスタマイズしたりできます。たとえば、Mobile Link ユーザを取り出すには、次のように SELECT 文を使用します。

SELECT value
FROM #hook_dict
WHERE name = 'MobiLink user'

In/out パラメータは、dbmlsync の動作をフックで修正することによって更新できます。たとえば、次のような文を使用してテーブルの abort synchronization ローを更新することで、同期のアボートをフックから dbmlsync に命令することができます。

UPDATE #hook_dict
SET value='true'
WHERE name='abort synchronization'

各フックの記述には、#hook_dict テーブルのローがリストされます。

次のサンプル sp_hook_dbmlsync_delay プロシージャは、#hook_dict テーブルを使用して引数を受け渡す様子を示します。このプロシージャでは、Mobile Link システムのスケジュールされたダウン時間 (18:00 ~ 19:00) 以外にのみ同期を行います。

CREATE PROCEDURE sp_hook_dbmlsync_delay()
BEGIN
   DECLARE delay_val integer;
 SET delay_val=DATEDIFF(
   second, CURRENT TIME, '19:00');
 IF (delay_val>0 AND
     delay_val<3600)
 THEN
 UPDATE #hook_dict SET value=delay_val
   WHERE name='delay duration';
 END IF;
END

次のプロシージャは、同期の開始時にリモート・データベース内で実行されます。現在の Mobile Link ユーザ名 (sp_hook_dbmlsync_begin イベントに使用可能なパラメータの 1 つ) を取り出して、SQL Anywhere のメッセージ・ウィンドウに出力します。

CREATE PROCEDURE sp_hook_dbmlsync_begin()
BEGIN
   DECLARE syncdef VARCHAR(150);
   SELECT '>>>syncdef = ' || value INTO syncdef
      FROM #hook_dict
      WHERE name ='MobiLink user name';
   MESSAGE syncdef TYPE INFO TO CONSOLE;
END