Получить имя хоста при чтении очереди Service Broker (SQL Server 2005)

Я пытаюсь настроить аудит на своем SQL Server с помощью Service Broker. Я выполнил всю настройку, необходимую для захвата событий DDL (очередь, маршруты, конечные точки, уведомление о событиях). Он работает правильно, за исключением того, что я не могу получить имя хоста клиента, откуда произошло событие DDL.

Используя процедуру активации сервисного брокера, я попытался прочитать значение из message_body, но там нет элемента xml, содержащего имя хоста. Я вижу значение SPID, но не могу его использовать. Выполнение sp_who и запрос sys.processes по этому SPID не возвращает никакого значения. И запуск sp_who без параметра показывает только один процесс (я думаю, что это фоновый процесс, используемый сервисным брокером). Это все из-за того, что сообщение было отправлено асинхронно? Но почему это приведет к тому, что контекст активации увидит разные данные в представлении sys.processes?

Я знаю, что есть триггеры DDL, которые могут достичь той же цели, но, похоже, они тесно связаны с командой, которая вызывает их срабатывание. Поэтому, если триггеры не работают, команда также не будет работать.

ОБНОВЛЕНИЕ: мне удалось получить имя хоста с помощью комбинации xp_cmdshell и sqlcmd (приложение командной строки). Но я также понял, что, поскольку сообщение асинхронно, оно не всегда надежно (SPID, который выдает команду DDL, мог быть отключен уже до того, как сообщение будет прочитано из очереди).


person Darnell    schedule 17.03.2010    source источник
comment
Прочитав мой вопрос, я понял, что сообщение с уведомлением о событии может быть с другого сервера sql, поэтому, если я собираюсь использовать SPID для разрешения имени хоста, я должен разрешить его с помощью этого (другого) сервера.   -  person Darnell    schedule 17.03.2010


Ответы (1)


Я не совсем уверен, что вы пытаетесь реализовать здесь, но ожидается, что активированная процедура будет видеть только подмножество строк в DMV. Это связано с контекстом активации, который часто олицетворяет другого пользователя, которого вы используете при отладке процедуры. Этот олицетворенный пользователь увидит только те строки представлений на уровне сервера и DMV, на которые у него есть разрешения. См. здесь и здесь для получения дополнительной информации.

person Pawel Marciniak    schedule 17.03.2010
comment
Спасибо за ответ. Чего я пытаюсь добиться, так это захватывать события DDL с помощью Event Notification и Service Broker. К сожалению, сообщения с уведомлением о событиях DDL, отправляемые сервис-брокеру, не содержат информации об имени хоста, откуда была отправлена ​​команда DDL, а содержат только SPID. Я могу проверить DMV, сбрасывая его содержимое в какую-либо таблицу, когда мой SP активируется очередью сообщений, а не запуская его в отладчике или SSMS. - person Darnell; 18.03.2010
comment
Разве вы не можете использовать элемент ‹ServerName/› EVENTDATA? - person Pawel Marciniak; 18.03.2010
comment
Но ServerName — это имя сервера базы данных, на котором выполняется команда DDL. Меня интересует имя хоста клиента, который фактически выдал команду. - person Darnell; 20.03.2010
comment
О, я вижу. Извините, я пропустил это в вашем первоначальном вопросе. Как вы сами правильно заметили, попытка разрешить spid из асинхронной активированной процедуры никогда не будет надежной, потому что нет гарантии, что клиентское соединение все еще будет существовать во время разрешения spid. Если это ваше требование, то я думаю, вам следует рассмотреть возможность использования триггеров или трассировки аудита профилировщика, а не асинхронного по своей сути компонента Service Broker. Или просто отправьте настроенное уведомление о событии (содержащее имя хоста клиента) из триггера с помощью компонента Service Broker. - person Pawel Marciniak; 22.03.2010