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_log_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 违规。使用此挂接可以在发生下载 RI 违规时记录 RI 违规,以便在以后调查违规原因。

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

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

此挂接在 dbmlsync 用于下载的一个单独的连接上被调用。此挂接所使用的连接的隔离级别是 0,从而此挂接可以看到从尚未提交的下载中应用的行。此挂接的操作在其完成后立即提交,以便保留此挂接所做的更改,不论下载是被提交还是被回退。

缺省情况下,在 Windows Mobile 设备上,同步表以独占模式被锁定,这意味着如果此挂接需要访问任何同步表,它就不能成功执行。如果它需要访问同步表而您将 dbmlsync 扩展选项 LockTables 设置为 EXCLUSIVE,则它也无法执行。请参见LockTables (lt) 扩展选项

不要试图用此挂接修正 RI 违规问题。此挂接应该只用于记录。使用 sp_hook_dbmlsync_download_ri_violation 来解决 RI 违规。

另请参见
示例

假定您使用下面的表记录参照完整性违规。

CREATE TABLE DBA.LogRIViolationTable
(
    entry_time  TIMESTAMP,
    pk_table  VARCHAR( 255 ),
    fk_table  VARCHAR( 255 ),
    role_name  VARCHAR( 255 )
);

以下示例记录当在远程数据库上检测到参照完整性违规时的外键表名、主键表名和角色名。信息存储在远程数据库的 LogRIErrorTable 中。

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;