允许您在下载过程中解决参照完整性违规。
名称 |
值 |
说明 |
---|---|---|
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; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |