В этом ответе говорится:
Существует идентификатор разговора, который одинаков на обеих конечных точках.
И есть talk_handle, который должен быть разным на каждой конечной точке.
Поэтому я подумал, что для устранения неполадок было бы полезно записать идентификатор разговора в таблицу аудита на каждой конечной точке разговора. Таким образом, я мог легко отслеживать информацию аудита на каждой конечной точке для данного диалога.
Проблема в том, откуда взять id_беседы. Первоначально я думал, что смогу найти его в sys.conversation_endpoints по дескриптору разговора только что отправленного или полученного сообщения. Однако пользователи базы данных, отправляющие и получающие сообщения, не имеют разрешений на просмотр метаданных в sys.conversation_endpoints.
Я мог бы обойти это, сделав пользователей, отправляющих и получающих сообщения, владельцами базы данных, но я бы предпочел этого не делать из соображений безопасности. Каковы минимальные разрешения, необходимые им для просмотра записей в sys.conversation_endpoints? В качестве альтернативы, как еще я мог прочитать talk_id сообщения, которое только что было отправлено или получено (из кода, выполняющего отправку или получение, который не имеет разрешений dbo или sysadmin)?
Изменить. Я прочитал в электронной документации статью о видимости метаданных. Конфигурация, в которой указано
видимость метаданных ограничена защищаемыми объектами, которыми пользователь владеет или на которые ему предоставлены определенные разрешения.
Для представлений каталога, таких как sys.tables или sys.procedures, достаточно очевидно, какие защищаемые объекты должны быть разрешены пользователю. Но какие защищаемые объекты перечислены в sys.conversation_endpoints: диалоги, конечные точки диалогов? И как вы даете им права? У пользователя уже есть разрешение начать диалог или завершить разговор, поэтому я подумал, что у него уже есть адекватное разрешение на разговор.