激活存储过程故障排除

已激活的存储过程在后台会话上运行。因此,激活存储过程的故障排除技术与作为交互式会话一部分的存储过程所使用的故障排除技术稍有不同。

技术:查看激活存储过程的输出

数据库引擎将来自已激活存储过程的输出写入 SQL Server 错误日志中。如果已激活的存储过程所生成的结果不正确,或者无法从队列读取,请查看 SQL Server 错误日志中该过程的输出。通常,存储过程的输出会提供足够的信息用于查找问题。

技术:从交互式会话运行存储过程

排除激活存储过程故障的最佳方法之一是对队列关闭激活,然后从 SQL Server Management Studio(或 sqlcmd 实用工具)运行存储过程。从交互式会话运行存储过程可以查看存储过程返回的所有错误。

但是,当存储过程是由数据库引擎所激活时,数据库设置和安全上下文可能不同。运行该过程前,请使用 EXECUTE AS 将会话的用户设置为为激活而指定的用户,并将会话的选项设置为数据库默认值。

有关详细信息,请参阅Internal Activation Context

故障:激活存储过程不运行

有多种常见原因会导致此故障。

队列的设置可能发生了更改。使用目录视图 sys.service_queues 可确认队列的设置。特别是,应检查以确保对该队列启用了激活,并确保队列指定了正确的存储过程和正确的安全主体。确认安全主体对存储过程具有执行权限。

存储过程可能无法启动,也可能启动后立即退出。在这种情况下,请查看 SQL Server 错误日志中的存储过程错误。还可以从 SQL Server Management Studio 运行存储过程,并检查结果。

故障:消息留在队列中

确保激活存储过程正确启动:

  • 查看动态管理视图 sys.dm_broker_queue_monitors,确保该队列的队列监视器处于活动状态。如果没有处于活动状态,则队列的激活状态不为 ON。请使用 ALTER QUEUE 语句将激活的状态打开为 ON。
  • 队列的队列监视器状态应为 RECEIVES_OCCURRING。如果队列监视器不处于这种状态,请查看动态管理视图 sys.dm_broker_activated_tasks,确保队列的已激活任务当前正在运行。如果没有已激活的任务,则激活失败。请参阅本部分中的“故障:激活存储过程不运行”。

如果已激活的任务正在运行,但消息仍留在队列中,则该任务或者无法 RECEIVE,或者无法提交事务。查看 SQL Server 错误日志中的存储过程错误。手动停止激活并运行存储过程可能有助于排除该问题的故障。

请参阅

其他资源

sys.service_queues (Transact-SQL)
sys.dm_broker_queue_monitors
sys.dm_broker_activated_tasks

帮助和信息

获取 SQL Server 2005 帮助