ダウンロードプロセスの参照整合性違反のログを取ります。
名前 | 値 | 説明 |
---|---|---|
publication_n (in) |
パブリケーション |
推奨されていません。代わりに subscription_n を使用します。同期されているパブリケーション (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 スクリプトバージョン。 |
subscription_n (in) | サブスクリプション名 | 同期されているサブスクリプションの名前 (n は整数)。これは、同期される各サブスクリプションの subscription_n エントリです。n の番号は 0 から始まります。 |
ダウンロード内のローがリモートデータベース上の外部キー関係に違反すると、ダウンロード参照整合性違反が発生します。このフックを使用すると、発生した参照整合性違反のログを取り、後でその原因を調べることができます。
ダウンロードが完了すると、コミットされる前に、dbmlsync は参照整合性違反があるかどうかをチェックします。参照整合性違反が見つかると、参照整合性違反を含む外部キーを識別して、sp_hook_dbmlsync_download_log_ri_violation を呼び出します (実装されている場合)。次に、sp_hook_dbmlsync_download_ri_violation を呼び出します (実装されている場合)。それでも矛盾がある場合、dbmlsync は外部キー制約に違反するローを削除します。参照整合性違反を含む残りの外部キーに対して、このプロセスが繰り返されます。
このフックは、現在同期中のテーブルに関する参照整合性違反がある場合にのみ呼び出されます。同期中ではないテーブルに関する参照整合性違反がある場合、このフックは呼び出されず、同期が失敗します。
このフックは、dbmlsync がダウンロードに使用する接続とは別の接続で呼び出されます。このフックが使用する接続の独立性レベルは 0 のため、ダウンロードから適用されていてまだコミットされていないローを判別できます。フックのアクションは完了直後にコミットされるので、ダウンロードがコミットされるかロールバックされるかに関係なく、このフックによる変更は保存されます。
このフックは別の接続で実行されるため、フックプロシージャで同期されているテーブルにアクセスする場合は注意してください。これらのテーブルは dbmlsync によってロックされている可能性があるためです。これらのロックが原因で、フック内の操作が失敗したり、無期限に待機したりすることがあります。
参照整合性違反の問題を解決するために、このフックを使用しないでください。このフックはロギングにのみ使用してください。参照整合性違反を解決するには、sp_hook_dbmlsync_download_ri_violation を使用します。
MANAGE REPLICATION システム権限を持つユーザが作成できるフックプロシージャ。ただし、フックによる情報のやり取りに使用される #hook_dict table にフックがアクセスできることを確認するには、フックが次のいずれかの要件を満たしている必要があります。
SELECT ANY TABLE および UPDATE ANY TABLE システム権限を持つユーザが所有します。
CREATE PROCEDURE 文の SQL SECURITY INVOKER 句を使用して定義されます。
次のテーブルを使用して、参照整合性違反のログを取ります。
CREATE TABLE DBA.LogRIViolationTable ( entry_time TIMESTAMP, pk_table VARCHAR( 255 ), fk_table VARCHAR( 255 ), role_name VARCHAR( 255 ) ); |
次に、リモートデータベース上で参照整合性違反が検出されたときに、外部キーテーブル名、プライマリキーテーブル名、役割名のログを取る例を示します。この情報は、リモートデータベースの LogRIViolationTable に格納されます。
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; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |