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