Брокер служб для SQL Server 2016. «is_activation_enabled» продолжает отключаться - PullRequest
0 голосов
/ 12 сентября 2018

Сервисный брокер, похоже, работает на нас и обрабатывает большинство сообщений, за исключением того, что 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) 28 октября 2016 г. 18:17:30 Авторские права (c) Microsoft Corporation Enterprise Edition: лицензирование на основе ядра (64-разрядное) на Windows Server 2012 R2 Standard 6.3 (сборка 9600:) (гипервизор)

1 Ответ

0 голосов
/ 13 сентября 2018

Моей первой мыслью была расширенная сессия событий, но я не вижу подходящего события.Тем не менее, я думаю, что триггер 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:

  • при
  • с какого хоста
  • кем
  • фактическое утверждение

Так что, хотя это и первый шаг, я бы сказал, что он может быть довольно большим.

...