您可以使用此存储过程处理未被分类为数据库错误或通信错误的 dbmlsync 错误。例如,您可以实现 sp_hook_dbmlsync_misc_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 的编号从零开始。 |
如果在启动过程中还没有初始化同步的时候发生了错误,用于 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_misc_error 以记录所有错误消息的类型。
CREATE PROCEDURE sp_hook_dbmlsync_misc_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 命令行引用了一个无效的预订。
dbmlsync -c SERVER=custdb;UID=DBA;PWD=sql -s test |
现在 error_log 表包含以下行,从而将错误与错误 ID 9931 相关联。
1,19912, 'Subscription ''test'' not found.' |
若要进行自定义错误处理,请检查 sp_hook_dbmlsync_misc_error 中的错误 ID 19912。
ALTER PROCEDURE sp_hook_dbmlsync_misc_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); IF id = 19912 THEN // handle invalid subscription END IF; END; |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |