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_download_ri_violation

ダウンロード・プロセスの参照整合性違反を解決できます。

#hook_dict テーブルのロー

名前

説明

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 が競合の原因であるローを削除する前に、参照整合性違反を解決できます。

ダウンロードが完了すると、コミットされる前に、dbmlsync は参照整合性違反があるかどうかをチェックします。参照整合性違反が見つかると、参照整合性違反を含む外部キーを識別して、sp_hook_dbmlsync_download_log_ri_violation を呼び出します (実装されている場合)。次に、sp_hook_dbmlsync_download_ri_conflict を呼び出します (実装されている場合)。それでも競合が解決されない場合は、dbmlsync がそのローを削除します。参照整合性違反を含む残りの外部キーに対して、このプロセスが繰り返されます。

このフックは、現在同期中のテーブルに関する参照整合性違反がある場合にのみ呼び出されます。同期中ではないテーブルに関する参照整合性違反がある場合、このフックは呼び出されず、同期が失敗します。

このフックは、dbmlsync がダウンロードに使用する接続と同じ接続で呼び出されます。データベースでデータの不整合が発生する可能性があるため、このフックに明示的または暗黙的なコミットが含まれないようにしてください。ダウンロードがコミットまたはロールバックされると、このフックのアクションがコミットまたはロールバックされます。

他のフック・アクションとは異なり、このフック中に実行される操作は次の同期中にアップロードされません。

参照

この例は、次に示す 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