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 クライアントのイベント・フック

 

sp_hook_dbmlsync_all_error

このストアド・プロシージャを使用して、すべてのタイプの dbmlsync エラー・メッセージを処理します。たとえば、sp_hook_dbmlsync_all_error フックを実装すると、特定のエラーが発生した場合に、ログを取ったり特定のアクションを実行したりすることができます。

#hook_dict テーブルのロー

名前

説明

publication_n (in)

パブリケーション名

同期されているパブリケーション (n は整数)。アップロードされるパブリケーションごとに 1 つの publication_n エントリがあります。n の番号は 0 から始まります。

MobiLink user (in)

Mobile Link ユーザ名

同期対象となる Mobile Link ユーザ。

script version (in)

スクリプト・バージョン名

同期に使用される Mobile Link スクリプト・バージョン。

error message (in) エラー・メッセージ・テキスト これは、dbmlsync ログに表示されるテキストと同じです。
error id (in) 整数 メッセージをユニークに識別する ID。このローを使用すると、エラー・メッセージ・テキストが変更されたときに、エラー・メッセージを識別できます。
error hook user state (in|out) 整数

この値はフックによって設定して、今後の呼び出しに対するステータス情報を、sp_hook_dbmlsync_all_error、sp_hook_dbmlsync_communication_error、sp_hook_dbmlsync_misc_error、sp_hook_dbmlsync_sql_error、または sp_hook_dbmlsync_end フックに渡すことができます。これらのフックの 1 つが最初に呼び出されるとき、ローの値は 0 です。フックがローの値を変更した場合は、次回のフックの呼び出しには新しい値が使用されます。

このフックを使用して、sp_hook_dbmlsync_end フックにステータス情報を渡す場合は、sp_hook_dbmlsync_end フックにより同期のリトライなどのアクションを実行することができます。

備考

dbmlsync エラー・メッセージが生成されるたびに、次のフックが呼び出されます。

  • まず、エラーのタイプに応じて、sp_hook_dbmlsync_communication_error、sp_hook_dbmlsync_misc_error、sp_hook_dbmlsync_sql_error のいずれかのフックが呼び出されます。これらのフックには、エラーのタイプに固有の情報が含まれています。たとえば、SQL エラーでは sqlcode と sqlstate が返されます。

  • 次に、sp_hook_dbmlsync_all_error が呼び出されます。このフックには、発生したすべてのエラーのログを取る場合に役立ちます。

同期を開始する前の起動中にエラーが発生した場合、#hook_dict 内の Mobile Link ユーザとスクリプト・バージョンのエントリは空の文字列に設定され、#hook_dict テーブルで設定される publication_n ローはありません。

このプロシージャは別個の接続で実行されるため、同期接続でロールバックが実行されても、このプロシージャで実行する操作が失われることはありません。dbmlsync が別個の接続を確立できないと、プロシージャは呼び出されません。

Windows Mobile デバイスのデフォルトでは、同期テーブルは排他モードでロックされます。このため、同期テーブルへのアクセスが必要な場合、このフックは正常に実行されません。また、このフックは、同期テーブルへのアクセスが必要で、ユーザが dbmlsync 拡張オプション LockTables を EXCLUSIVE に設定している場合にも実行できません。LockTables (lt) 拡張オプションを参照してください。

このプロシージャのアクションは、フックが完了した直後にコミットされます。

参照

次のテーブルを使用して、リモート・データベース内のエラーのログを取るとします。

CREATE TABLE error_log
(
 pk INTEGER DEFAULT AUTOINCREMENT PRIMARY KEY,
 err_id INTEGER,
 err_msg VARCHAR(10240),
);

次の例では、sp_hook_dbmlsync_all_error を設定して、エラー・ログを取ります。

CREATE PROCEDURE sp_hook_dbmlsync_all_error()
BEGIN
 DECLARE msg VARCHAR(10240);
 DECLARE id INTEGER;

 // get the error message text
 SELECT value INTO msg
  FROM #hook_dict
  WHERE name ='error message';

 // get the error id
 SELECT value INTO id
  FROM #hook_dict
  WHERE name = 'error id';

 // log the error information
 INSERT INTO error_log(err_msg, err_id)
  VALUES (msg, id);
END;

可能性のあるエラーの ID 値を表示するには、dbmlsync をテスト実行します。たとえば、dbmlsync が「Mobile Link サーバに接続できません。」というエラーを返すと、sp_hook_dbmlsync_all_error が次のローを error_log に挿入します。

1,14173,
 'Unable to connect to MobiLink server'

これで、「Mobile Link サーバに接続できません。」というエラーとエラー ID 14173 を関連付けることができます。

次の例では、エラー 14173 が発生したときに必ず同期をリトライするようにフックを設定します。

CREATE PROCEDURE sp_hook_dbmlsync_all_error()
BEGIN
 IF EXISTS( SELECT value FROM #hook_dict 
    WHERE name = 'error id' AND value = '14173' )
 THEN
    UPDATE #hook_dict SET value = '1' 
       WHERE name = 'error hook user state';
   END IF;
END;

CREATE PROCEDURE sp_hook_dbmlsync_end()
BEGIN
 IF EXISTS( SELECT value FROM #hook_dict 
    WHERE name='error hook user state' AND value='1')
 THEN
    UPDATE #hook_dict SET value = 'sync' 
       WHERE name='restart';
   END IF;
END;

sp_hook_dbmlsync_endを参照してください。