SQL Server: изменение свойства имени приложения в целях аудита

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

Это создает проблему аудита. Используя триггеры, мы хотим хранить каждое обновление, вставлять и удалять и приписывать каждое конкретному пользователю. Одним из возможных решений является добавление столбца «обновлено пользователем» в каждую таблицу и обновлять его каждый раз. Это означает новый столбец в каждой таблице и новый параметр в каждой хранимой процедуре. Это также означает, что вы можете выполнять только мягкое удаление.

Вместо этого я предлагаю использовать свойство Application Name строки подключения и читать его с помощью свойства App_Name() внутри триггера. Я протестировал это с помощью простого приложения, и оно, похоже, работает (формат может быть таким: App=MyApp|User=100).

Вопрос к вам, ребята, это плохая идея, и есть ли у вас идея получше?


person Chris Simpson    schedule 27.11.2008    source источник
comment
Как вы решили это? Вы смогли прочитать App=MyApp|User=100 из триггера, используя CONTEXT_INFO? Мне нужно изменить триггеры, используемые ApexSQL Audit 2008, и сохранить пользователя, переданного через «Имя приложения».   -  person AMissico    schedule 27.07.2013


Ответы (3)


Для этого я использую SET CONTEXT_INFO. Это как раз то, что вам нужно.

person Dave Markle    schedule 27.11.2008
comment
Ага, это похоже на билет. varbinary немного раздражает, но не должно быть большой головной болью. Ваше здоровье. - person Chris Simpson; 27.11.2008
comment
Спасибо! Самое замечательное: вы можете заставить его работать даже с одновременным прямым доступом к базе данных, например, из MS Access, и используя имя пользователя исходного соединения, используя что-то вроде этого: COALESCE(CONVERT(VARCHAR(128), CONTEXT_INFO()), ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ) - person realMarkusSchmidt; 22.10.2009

Это, безусловно, похоже на осуществимое решение, хотя вам нужно будет вводить имя пользователя в строку подключения каждый раз, когда ваше приложение загружается. Обратите внимание, что это решение, вероятно, не будет работать с веб-приложением, поскольку ваша строка подключения будет каждый раз отличаться, что может привести к огромным проблемам с пулом подключений.

Другой вариант — получить имя хоста/IP-адрес (SELECT host_name()) и сохранить его.

Вам не обязательно нужен новый параметр для каждой хранимой процедуры, поскольку вы можете изменить каждую хранимую процедуру (или триггер) для автоматической вставки App_Name/Hostname.

Потенциальным недостатком является то, что любые изменения, выполняемые через Management Studio, не будут иметь пользовательского App_Name, и вы останетесь с «Microsoft Management Studio» в качестве пользователя.

person Jim McLeod    schedule 27.11.2008
comment
Хотя раньше мы это делали, мы больше не используем пулы соединений, поэтому каждое установленное соединение индивидуально. Имя хоста/IP-адрес не будет работать, потому что это будет исходить от сервера приложений, а не от клиента. - person Chris Simpson; 27.11.2008
comment
Если бы я только наткнулся на этот ответ несколько лет назад... Мы используем имя приложения именно для этой цели, именно по этой причине, и у нас есть проблемы с пулом соединений точно так, как описано... Сейчас я пытаюсь найти способ чтобы установить имя приложения из открытого соединения, чтобы мы могли сохранить постоянную строку подключения и покончить с гадостями ползучести пула. - person Tao; 13.10.2009

Мы используем свойство Application Name для управления триггерами аудита и не заметили никаких проблем с его использованием и не заметили каких-либо проблем со скоростью (хотя в нашем случае мы специально не проверяем определенные приложения, поэтому трудно измерить, сколько время ничего не делать занимает :))

person David Wengier    schedule 27.11.2008
comment
Приятно слышать. Судя по всему, вы каждый раз используете одно и то же имя приложения. Я предлагаю изменить имя приложения для каждого соединения, чтобы идентифицировать текущего пользователя. Видите ли вы какие-либо проблемы с этим (мы не объединяем соединения)? - person Chris Simpson; 27.11.2008
comment
Мы используем два разных имени приложения: одно, когда нам нужен аудит, и одно, когда мы этого не делаем (поскольку все, что использует соединение, обрабатывает аудит вручную). - person David Wengier; 28.11.2008