ダウンロードプロセスの参照整合性違反を解決できます。
名前 | 値 | 説明 |
---|---|---|
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 が競合の原因であるローを削除する前に、参照整合性違反を解決できます。
ダウンロードが完了すると、コミットされる前に、dbmlsync は参照整合性違反があるかどうかをチェックします。参照整合性違反が見つかると、参照整合性違反を含む外部キーを識別して、sp_hook_dbmlsync_download_log_ri_violation を呼び出します (実装されている場合)。次に、sp_hook_dbmlsync_download_ri_violation を呼び出します (実装されている場合)。それでも競合が解決されない場合は、dbmlsync がそのローを削除します。参照整合性違反を含む残りの外部キーに対して、このプロセスが繰り返されます。
このフックは、現在同期中のテーブルに関する参照整合性違反がある場合にのみ呼び出されます。同期中ではないテーブルに関する参照整合性違反がある場合、このフックは呼び出されず、同期が失敗します。
このフックは、dbmlsync がダウンロードに使用する接続と同じ接続で呼び出されます。データベースでデータの不整合が発生する可能性があるため、このフックに明示的または暗黙的なコミットが含まれないようにしてください。ダウンロードがコミットまたはロールバックされると、このフックのアクションがコミットまたはロールバックされます。
他のフックアクションとは異なり、このフック中に実行される操作は次の同期中にアップロードされません。
MANAGE REPLICATION システム権限を持つユーザが作成できるフックプロシージャ。ただし、フックによる情報のやり取りに使用される #hook_dict table にフックがアクセスできることを確認するには、フックが次のいずれかの要件を満たしている必要があります。
SELECT ANY TABLE および UPDATE ANY TABLE システム権限を持つユーザが所有します。
CREATE PROCEDURE 文の SQL SECURITY INVOKER 句を使用して定義されます。
この例は、次に示す Department テーブルと Employee テーブルを使用します。
CREATE TABLE Department( "department_id" INTEGER primary key ); CREATE TABLE Employee( "employee_id" INTEGER PRIMARY KEY, "department_id" INTEGER, FOREIGN KEY EMPLOYEE_FK1 (department_id) REFERENCES Department ); |
次の sp_hook_dbmlsync_download_ri_violation の定義は、Department テーブルと Employee テーブル間の参照整合性違反をクリーンアップします。この定義によって、外部キーの役割名が検証され、欠落している department_id の値が Department テーブルに挿入されます。
CREATE PROCEDURE sp_hook_dbmlsync_download_ri_violation() BEGIN IF EXISTS (SELECT * FROM #hook_dict WHERE name = 'role name' AND value = 'EMPLOYEE_FK1') THEN -- update the Department table with missing department_id values INSERT INTO Department SELECT distinct department_id FROM Employee WHERE department_id NOT IN (SELECT department_id FROM Department) END IF; END; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |