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