激活存储过程故障排除

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

方法:分析 Service Broker 配置

如果激活存储过程未成功运行,请使用 ssbdiagnose 实用工具在关联的服务中查找配置错误。有关详细信息,请参阅 ssbdiagnose 实用工具

方法:查看激活存储过程的输出

如果激活存储过程所生成的结果不正确,或者没有从队列读取,请查看 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 错误日志中的存储过程错误。手动停止激活并运行存储过程可能有助于排除该问题的故障。