内部激活上下文

适用于SQL ServerAzure SQL 托管实例

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

安全上下文

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

当存储过程还指定一个子句时,会发生两个 EXECUTE AS 模拟。 SQL Server 首先模拟为队列指定的用户并执行存储过程。 执行存储过程时,该过程将模拟过程子句中指定的 EXECUTE AS 用户。

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

会话设置

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

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

事务上下文

激活的存储过程负责管理事务。 在激活存储过程之前,SQL Server 不会启动事务,并且存储过程在与激活过程的内部作不同的事务上下文中运行。 有关存储过程激活中管理事务的讨论,请参阅 事务消息传送

故障检测

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

Monitor

若要检查运行激活过程的用户,可以使用扩展事件(事件broker_activation以及usernameserver_principal_name作)或sys.dm_broker_activated_tasks动态管理视图,该视图返回队列中配置的数据库principal_id