您可以使用此存储过程处理所有类型的 dbmlsync 错误消息。例如,您可以实现 sp_hook_dbmlsync_all_error 挂接,从而在发生特定错误时记录错误或执行特定操作。
名称 | 值 | 说明 |
---|---|---|
publication_n (in) |
发布 |
不建议使用。改用 subscription_n。正被同步的发布,其中 n 是一个整数。每个正在同步的发布都有一个 publication_n 条目。n 的编号从零开始。 |
MobiLink user (in) |
MobiLink 用户名 |
您正在为其进行同步的 MobiLink 用户。 |
script version (in) |
脚本版本名称 |
用于同步的 MobiLink 脚本版本。 |
error message (in) | 错误消息文本 | 这与在 dbmlsync 日志中显示的文本相同。 |
error id (in) | 整数 | 唯一标识消息的 ID。使用此行来标识错误消息,因为错误消息文本可能发生变化。 |
error hook user state (in|out) | 整数 |
此值可由挂接设置,以便将状态信息传递到对 sp_hook_dbmlsync_all_error、sp_hook_dbmlsync_communication_error、sp_hook_dbmlsync_misc_error、sp_hook_dbmlsync_sql_error 或 sp_hook_dbmlsync_end 挂接的未来调用。第一次调用这些挂接的其中之一时,该行的值为 0。如果挂接更改了行值,则将在下一个挂接调用中使用新值。 |
subscription_n (in) | 预订名称 | 正在进行同步的预订的名称,其中 n 是一个整数。每个正在同步的预订都有一个 subscription_n 条目。n 的编号从零开始。 |
每次生成 dbmlsync 错误消息时,都将调用以下挂接:
首先,根据错误的类型,将调用以下的挂接之一:sp_hook_dbmlsync_communication_error、sp_hook_dbmlsync_misc_error 或 sp_hook_dbmlsync_sql_error。这些挂接包含错误类型的特定信息;例如,针对 SQL 错误提供的 sqlcode 和 sqlstate。
其次,调用 sp_hook_dbmlsync_all_error。此挂接对于记录所有已发生的错误非常有用。
如果在启动过程中还没有初始化同步的时候发生了错误,用于 Mobilink 用户和脚本版本的 #hook_dict 条目将被设置为一个空字符串,并且在 #hook_dict 表中不设置 publication_n 行或 subscription_n 行。
错误挂接用户状态行为您提供了一种有用的机制来将错误性质的相关信息传递到 sp_hook_dbmlsync_end 挂接,您可以在该挂接中使用这些信息确定是否重试同步。
此过程将在单独的连接上执行以确保它执行的操作不会在同步连接执行回退时丢失。如果 dbmlsync 无法建立单独的连接,则不调用该过程。
由于此挂接是在单独的连接上执行的,因此您在访问在挂接过程中正在同步的表时应谨慎使用,因为 dbmlsync 可能会锁定这些表。这些锁定可能会导致挂接中的操作失败或无限期等待。
此过程的操作将在挂接完成后立即被提交。
假定您使用下表记录远程数据库中的错误。
CREATE TABLE error_log ( pk INTEGER DEFAULT AUTOINCREMENT PRIMARY KEY, err_id INTEGER, err_msg VARCHAR(10240), ); |
以下示例设置 sp_hook_dbmlsync_all_error 以记录错误。
CREATE PROCEDURE sp_hook_dbmlsync_all_error() BEGIN DECLARE msg VARCHAR(10240); DECLARE id INTEGER; // get the error message text SELECT value INTO msg FROM #hook_dict WHERE name ='error message'; // get the error id SELECT value INTO id FROM #hook_dict WHERE name = 'error id'; // log the error information INSERT INTO error_log(err_msg, err_id) VALUES (msg, id); END; |
要查看可能存在的错误 ID 值,可测试运行 dbmlsync。例如,如果 dbmlsync 返回错误 [无法连接到 MobiLink 服务器],sp_hook_dbmlsync_all_error 将在 error_log 中插入以下的行。
1,14173, 'Unable to connect to MobiLink server' |
现在,您就可以将错误 "无法连接到 MobiLink 服务器" 同错误 ID 14173 相关联。
以下的示例设置挂接,以便在每当发生错误 14173 时,都能够重试该同步。
CREATE PROCEDURE sp_hook_dbmlsync_all_error() BEGIN IF EXISTS( SELECT value FROM #hook_dict WHERE name = 'error id' AND value = '14173' ) THEN UPDATE #hook_dict SET value = '1' WHERE name = 'error hook user state'; END IF; END; CREATE PROCEDURE sp_hook_dbmlsync_end() BEGIN IF EXISTS( SELECT value FROM #hook_dict WHERE name='error hook user state' AND value='1') THEN UPDATE #hook_dict SET value = 'sync' WHERE name='restart'; END IF; END; |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |