このストアドプロシージャーを使用して、すべてのタイプの dbmlsync エラーメッセージを処理します。たとえば、sp_hook_dbmlsync_all_error フックを実装すると、特定のエラーが発生した場合に、ログを取ったり特定のアクションを実行したりすることができます。
名前 | 値 | 説明 |
---|---|---|
publication_n (in) |
パブリケーション |
廃止予定。代わりに subscription_n を使用します。同期されているパブリケーション (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 です。フックがローの値を変更した場合は、次回のフックの呼び出しには新しい値が使用されます。 |
subscription_n (in) | サブスクリプション名 | 同期されているサブスクリプションの名前 (n は整数)。これは、同期される各サブスクリプションの subscription_n エントリです。n の番号は 0 から始まります。 |
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 ローや subscription_n ローはありません。
error hook user state ローは、エラーの内容を sp_hook_dbmlsync_end フックに渡す場合に役立つメカニズムを提供します。フックでは、この情報を使用して同期をリトライするかどうかを決定できます。
このプロシージャーは別個の接続で実行されるため、同期接続でロールバックが実行されても、このプロシージャーで実行する操作が失われることはありません。dbmlsync が別個の接続を確立できないと、プロシージャーは呼び出されません。
このフックは別の接続で実行されるため、フックプロシージャーで同期されているテーブルにアクセスする場合は注意してください。これらのテーブルは dbmlsync によってロックされている可能性があるためです。これらのロックが原因で、フック内の操作が失敗したり、無期限に待機したりすることがあります。
このプロシージャーのアクションは、フックが完了した直後にコミットされます。
次のテーブルを使用して、リモートデータベース内のエラーのログを取ります。
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を参照してください。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |