内部激活上下文

本主题介绍由内部激活启动的存储过程的执行上下文。

安全上下文

为激活配置的队列还必须指定用来运行激活存储过程的用户,因为 SQL Server 启动该存储过程前会模拟此用户。

如果存储过程还指定了 EXECUTE AS 子句,则会出现两次模拟。SQL Server 先会模拟为队列指定的用户,然后执行存储过程。存储过程执行时,该过程会模拟在其 EXECUTE AS 子句中指定的用户。

请注意,一般而言,为远程服务绑定指定的用户和为激活指定的用户不是同一用户。每一用户所需的权限也不同。远程服务绑定用户不需要读取队列或执行数据库中存储过程的权限,而为激活指定的用户不需要向服务发送消息的权限。有关用户权限的详细信息,请参阅 标识和访问控制 (Service Broker)Service Broker 对话安全设置

会话设置

Service Broker 在后台会话中执行从内部激活的服务程序,该会话不在创建相应消息的连接上。为此会话设置的选项为数据库的默认选项。

在由 Service Broker 启动的会话中,SQL Server 会将 PRINT 和 RAISERROR 语句的输出写入 SQL Server 错误日志中。Service Broker 不会向激活的存储过程提供参数。Service Broker 不会考虑来自激活的存储过程的返回值,也不会处理来自激活的存储过程的结果集。

事务上下文

激活的存储过程负责事务的管理。在激活存储过程之前,SQL Server 不会启动事务,而且该存储过程与激活它的内部操作运行在不同的事务上下文中。有关如何通过激活的存储过程来管理事务的说明,请参阅事务消息传送

故障检测

激活的存储过程必须接收来自将其激活的队列的消息。如果该存储过程虽然存在但未接收消息,或者队列监视器检测到该存储过程在短暂超时之后没有接收消息,则队列监视器会将该存储过程视为已经失败。在这种情况下,队列监视器会停止激活该存储过程。