Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » MobiLink - 客户端管理 » 用于 MobiLink 的 SQL Anywhere 客户端 » SQL Anywhere 客户端的事件挂接

 

sp_hook_dbmlsync_download_ri_violation

允许您在下载过程中解决参照完整性违规。

#hook_dict 表中各行

名称

说明

publication_n (in)

发布

正被同步的发布,其中 n 是一个整数。每个正在上载的发布都有一个 publication_n 条目。n 的编号从零开始。

MobiLink user (in)

MobiLink 用户名

您正在为其进行同步的 MobiLink 用户。

foreign key table (in)

表名

包含为其调用挂接的外键列的表。

primary key table (in)

表名

为其调用挂接的外键所引用的表。

role name (in)

角色名

为其调用挂接的外键的角色名。

script version (in)

脚本版本名称

将用于同步的 MobiLink 脚本版本。

注释

当下载中的行违反了远程数据库的外键关系时,会发生下载 RI 违规。使用此挂接可以尝试在 dbmlsync 删除导致冲突的行之前解决 RI 违规。

下载完成后,但在提交之前,dbmlsync 将检查 RI 违规。如果 dbmlsync 发现任何 RI 违规,它将确定有 RI 违规的外键并调用 sp_hook_dbmlsync_download_log_ri_violation(如果实现了此存储过程)。然后调用 sp_hook_dbmlsync_download_ri_conflict(如果实现了此存储过程)。如果仍然有冲突,dbmlsync 将删除行。对剩下的有 RI 违规的外键重复此过程。

只有在 RI 违规涉及当前正在同步的表时,才调用此挂接。如果 RI 违规涉及的表当前没有同步,则不调用此挂接并且同步失败。

此挂接在 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;