已激活的存储过程在后台会话上运行。 因此,激活存储过程的故障排除方法和作为交互式会话一部分的存储过程的故障排除方法稍有不同。
技术:分析 Service Broker 配置
如果激活的存储过程未成功运行,请使用 ssbdiagnose 实用工具在关联的服务中查找配置错误。 有关详细信息,请参阅 ssbdiagnose 实用工具(Service Broker)。
技术:查看激活存储过程输出
如果激活的存储过程生成错误的结果或未从队列中读取,请检查 SQL Server 错误日志中是否存在有助于查找问题的错误和消息。 激活的存储过程不与任何应用程序关联。 信息通常会返回到调用应用程序中,但此信息将被记录在 SQL Server 错误日志中。 这包括错误、消息以及PRINT和RAISERROR语句的输出。
方法:从交互式会话中运行存储过程
若要排除激活存储过程的故障,可以对队列关闭激活,然后通过 SQL Server Management Studio 或 sqlcmd 实用工具运行存储过程。 如果从交互式会话运行存储过程,可查看存储过程返回的所有错误。
但是,如果交互式会话中的安全上下文和数据库设置不同于存储过程由数据库引擎激活时的安全上下文和数据库设置,你可能会看到不同的结果。 运行该过程之前,请执行下列操作:
使用
EXECUTE AS将交互式会话的用户设置为指定用于激活的用户。将会话的选项设置为数据库默认值
有关详细信息,请参阅 内部激活上下文。
症状:激活存储过程未运行
以下是导致此故障的常见原因:
队列的设置可能发生了更改。 使用
sys.service_queues目录视图来核实队列设置。 确保对该队列启用了激活,并确保队列指定了正确的存储过程和正确的安全主体。 确认该安全主体对存储过程具有执行权限。该存储过程可能不会启动或在启动后立即退出。 在这种情况下,请查看 SQL Server 错误日志中的存储过程错误。 还可以从 SQL Server Management Studio 运行存储过程,并检查结果。
症状:消息仍留在队列中
确保激活存储过程正确启动:
检查动态管理视图
sys.dm_broker_queue_monitors,确保队列监视器处于活动状态。 否则,请使用ALTER QUEUE语句来开启激活ON。队列监视器的状态应为
RECEIVES_OCCURRING。 如果队列监视器未处于此状态,请检查动态管理视图sys.dm_broker_activated_tasks,确保队列的已激活任务当前正在运行。 如果没有已激活的任务,则激活失败。 有关详细信息,请参阅本主题前面的“故障:激活存储过程不运行”部分。
如果激活的任务正在运行,但消息仍保留在队列中,则任务可能未成功RECEIVE或提交事务。 检查 SQL Server 错误日志中是否有存储过程错误。 手动停止激活并运行存储过程可能有助于排除该问题的故障。