Триггер DDL для получения имени пользователя в SQL Server

У меня есть требование «кто-что-с-каким-каким-каким-то-столом-и-когда» от одного из моих клиентов. Краткое описание системы выглядит следующим образом:

  • Нет исходного кода программного обеспечения
  • Программное обеспечение не отслеживает события
  • Все пользователи используют приложение под логином "sa"
  • В базе данных есть таблица входа, которая проверяет учетные данные пользователя при запуске приложения.
  • Аутентификация SQL, а не аутентификация Windows. Создание отдельных пользователей/ролей в SQL невозможно, так как строка подключения от внешнего интерфейса к внутреннему жестко запрограммирована и не может быть отредактирована.

Моя проблема заключается в следующем:

  • Я могу получить HostName, IP,Suser_Name(),MAC-адрес и т. д. Но клиент не доволен ни одним из них
  • Я могу сопоставить IP-адреса с таблицей входа пользователя. Клиент снова недоволен.

Мой вопрос:

Могу ли я в любом случае связать имя пользователя из таблицы входа в триггер DDL? В таблице входа есть 2 столбца: имя пользователя и пароль. Есть ли какое-то соединение/любая другая операция, которую я, возможно, упускаю из виду?

Система работает на SQL Server 2008


person Rizzy    schedule 01.05.2016    source источник
comment
Я почти уверен, что ответ со всеми ограничениями, вызванными вашей настройкой, - нет. Если процедура входа в систему обновила таблицу входа пользователя (скажем, со значением даты последнего входа), вы могли бы что-то сделать с CONTEXT_INFO и триггером в этой таблице, но поскольку ваша таблица входа имеет только два столбца, которые приложение, очевидно, читает только для проверки личность пользователя, я думаю, вам не повезло. То, что вы пробовали с сопоставлением IP-адресов с логинами пользователей или получением сведений о HostName/IP/SUser_Name/MAC-адресе, вероятно, будет лучшим, что может получить клиент.   -  person MartW    schedule 01.05.2016
comment
во время входа в приложение сохраните информацию о SPID — имени пользователя в другой таблице. При срабатывании на основе SPID и получения имени пользователя   -  person Squirrel    schedule 02.05.2016
comment
@MartW, да, похоже, мне не повезло. Спасибо за ваш комментарий.   -  person Rizzy    schedule 02.05.2016
comment
@Squirrel, я попробую. Я предполагаю, что должен создать триггер для этого, так как я не могу редактировать никакие команды, поступающие из интерфейса в серверную часть.   -  person Rizzy    schedule 02.05.2016
comment
таблица входа связана с AD?   -  person Yuval Perelman    schedule 28.05.2018
comment
Ваша установка проблематична, если не сказать больше. Во-первых, вы ни при каких обстоятельствах не должны позволять своему пользователю использовать логин sa. (или любой логин с привилегиями системного администратора). Во-вторых, вы никогда не должны жестко кодировать строку подключения или сохранять ее во внешнем интерфейсе (при условии, что приложение разделено на клиентскую и внутреннюю части). В-третьих, с июля прошлого года расширенная поддержка SQL Server 2008 прекращена. При этом зачем нужны триггеры DDL? Разрешено ли вашим пользователям вносить структурные изменения в базу данных? это также сильный показатель проблемного дизайна....   -  person Zohar Peled    schedule 02.02.2020
comment
@AaronBertrand Я поздно принял систему, созданную кем-то другим. Как уже упоминалось, не контролировал большинство вещей   -  person Rizzy    schedule 14.02.2020


Ответы (1)


Возможно, вы сможете отследить оператор select таблицы user/password, а затем присоединиться к spid и временным рамкам.

https://docs.microsoft.com/en-us/sql/relational-databases/sql-trace/sql-trace

  • Создайте трассировку с помощью sp_trace_create.
  • Добавьте события элемента с помощью sp_trace_setevent. Пакетное завершение должно работать в этом случае.
  • Установите фильтр с помощью sp_trace_setfilter. Отфильтруйте его до таблицы user/password.
  • Начните трассировку с sp_trace_setstatus.
  • Остановите трассировку с помощью sp_trace_setstatus.
  • Закройте трассировку с помощью sp_trace_setstatus.

https://docs.microsoft.com/en-us/sql/relational-databases/sql-trace/create-and-run-traces-using-transact-sql-stored-procedures

person Frank Chen    schedule 01.02.2020
comment
Я бы с удовольствием попробовал этот подход, но я больше не использую вышеупомянутую программу. Этот вопрос был задан в 2016 году, и я не могу найти способ «закрыть» его. Тем не менее, это кажется правильным путем; понятия не имел, что мы могли бы поиграть с профилировщиком сервера, используя эти события. - person Rizzy; 14.02.2020