Я пытаюсь настроить аудит на своем 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, мог быть отключен уже до того, как сообщение будет прочитано из очереди).