首页 > 解决方案 > SQL Server 2016 的服务代理。“is_activation_enabled”一直关闭

问题描述

服务代理似乎在为我们工作并处理大多数消息,除了is_activation_enabled从 0 切换到 1 并在一天中自行返回。我们找不到任何解释。为什么这样做?这是否意味着有问题?is_activation_enabled需要保持开启(=1),因为我们有一个activation_procedure。我们通过运行这个查询来观察这个标志:

SELECT * FROM sys.service_queues

有人可以解释可能导致这种情况的原因吗?

注意:我知道有害消息可以禁用队列。请不要将我的问题与 is_receive_enabled 或其他标志之一混淆。我要问的唯一标志是is_activaton_enabled

我可以通过运行此查询来查看队列何时主动处理消息,select * from sys.dm_broker_queue_monitors但是主动处理消息和启用消息处理的概念是不同的。

希望服务经纪人专家在某个地方!

我们的 Microsoft SQL Server 2016 (SP1) (KB3182545) 版本 - 13.0.4001.0 (X64) 2016 年 10 月 28 日 18:17:30 版权所有 (c) Microsoft Corporation Enterprise Edition:Windows Server 2012 上基于内核的许可(64 位) R2 标准 6.3(内部版本 9600:)(管理程序)

标签: sql-serverservice-broker

解决方案


我的第一个想法是扩展活动会议,但我没有看到合适的活动。但是,我认为您正在寻找 DDL 触发器。考虑以下:

create trigger tr_catch_queue_alter
on DATABASE
for alter_queue
AS
BEGIN
    select EVENTDATA();
END

触发器的主体不是您想要的;您将希望分解它输出的 XML 并将其存储在某个表中。当我刚才在本地实例上运行它时,我得到了:

<EVENT_INSTANCE>
  <EventType>ALTER_QUEUE</EventType>
  <PostTime>2018-09-12T20:17:22.497</PostTime>
  <SPID>54</SPID>
  <ServerName>«redacted»</ServerName>
  <LoginName>«redacted»</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>«redacted»</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>«redacted»</ObjectName>
  <ObjectType>QUEUE</ObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>alter queue «redacted» with activation (status = on, execute as owner, procedure_name = dbo.«redacted»)
</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

(显然«redacted»这只是我的特定环境的敏感数据;当你运行它时,你会得到实际的细节)。

注意:这只是第一步。alter queue但是从上面,你可以看到你得到了关于语句的以下信息:

  • 什么时候
  • 来自什么主机
  • 通过谁
  • 实际声明

因此,即使这是第一步,我认为它有可能成为一个相当大的一步。


推荐阅读