ダウンロード・プロセスの参照整合性違反のログを取ります。
名前 |
値 |
説明 |
---|---|---|
publication_n (in) |
パブリケーション名 |
同期されているパブリケーション (n は整数)。アップロードされるパブリケーションごとに 1 つの publication_n エントリがあります。n の番号は 0 から始まります。 |
MobiLink user (in) |
Mobile Link ユーザ名 |
同期対象となる Mobile Link ユーザ。 |
foreign key table (in) |
テーブル名 |
フック呼び出し対象の外部キー・カラムを含むテーブル。 |
primary key table (in) |
テーブル名 |
フック呼び出し対象の外部キーが参照するテーブル。 |
role name (in) |
ロール名 |
フック呼び出し対象の外部キーのロール名。 |
script version (in) |
スクリプト・バージョン名 |
同期に使用される Mobile Link スクリプト・バージョン。 |
ダウンロード内のローがリモート・データベース上の外部キー関係に違反すると、ダウンロード参照整合性違反が発生します。このフックを使用すると、発生した参照整合性違反のログを取り、後でその原因を調べることができます。
ダウンロードが完了すると、コミットされる前に、dbmlsync は参照整合性違反があるかどうかをチェックします。参照整合性違反が見つかると、参照整合性違反を含む外部キーを識別して、sp_hook_dbmlsync_download_log_ri_violation を呼び出します (実装されている場合)。次に、sp_hook_dbmlsync_download_ri_conflict を呼び出します (実装されている場合)。それでも矛盾がある場合、dbmlsync は外部キー制約に違反するローを削除します。参照整合性違反を含む残りの外部キーに対して、このプロセスが繰り返されます。
このフックは、現在同期中のテーブルに関する参照整合性違反がある場合にのみ呼び出されます。同期中ではないテーブルに関する参照整合性違反がある場合、このフックは呼び出されず、同期が失敗します。
このフックは、dbmlsync がダウンロードに使用する接続とは別の接続で呼び出されます。このフックが使用する接続の独立性レベルは 0 のため、ダウンロードから適用されていてまだコミットされていないローを判別できます。フックのアクションは完了直後にコミットされるので、ダウンロードがコミットされるかロールバックされるかに関係なく、このフックによる変更は保存されます。
Windows Mobile デバイスのデフォルトでは、同期テーブルは排他モードでロックされます。このため、同期テーブルへのアクセスが必要な場合、このフックは正常に実行されません。また、このフックは、同期テーブルへのアクセスが必要で、ユーザが dbmlsync 拡張オプション LockTables を EXCLUSIVE に設定している場合にも実行できません。LockTables (lt) 拡張オプションを参照してください。
参照整合性違反の問題を解決するために、このフックを使用しないでください。このフックはロギングにのみ使用してください。参照整合性違反を解決するには、sp_hook_dbmlsync_download_ri_violation を使用します。
次のテーブルを使用して、参照整合性違反のログを取るとします。
CREATE TABLE DBA.LogRIViolationTable ( entry_time TIMESTAMP, pk_table VARCHAR( 255 ), fk_table VARCHAR( 255 ), role_name VARCHAR( 255 ) ); |
次に、リモート・データベース上で参照整合性違反が検出されたときに、外部キー・テーブル名、プライマリ・キー・テーブル名、役割名のログを取る例を示します。この情報は、リモート・データベースの LogRIErrorTable に格納されます。
CREATE PROCEDURE sp_hook_dbmlsync_download_log_ri_violation() BEGIN INSERT INTO DBA.LogRIViolationTable VALUES( CURRENT_TIMESTAMP, (SELECT value FROM #hook_dict WHERE name = 'Primary key table'), (SELECT value FROM #hook_dict WHERE name = 'Foreign key table'), (SELECT value FROM #hook_dict WHERE name = 'Role name' ) ); END; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |