2016-07-19 1 views
0

Ситуация: Я разработал базу данных, которая сильно зависит от множества триггеров, чтобы обеспечить согласованность данных (для выполнения CFR 21 часть 11). Существует 2 таблицы для хранения пользователей: Login & User (в пользу серверов Sql User management). Пользователи содержат статические данные входа для внешней аутентификации, а X1 содержат данные для входа в нашу систему (Fake User). Человек должен войти в нашу заявку, используя одну из данных Login (Real User). Когда система должна взаимодействовать с внешней системой (Active Directory или FileSystem или Database), соответствующий User (Fake User) будет выдавать себя за другое лицо.Добавить колонку тени для ввода инструкции

Для уточнения будет использоваться X1 (настоящий пользователь) для входа и X2 (поддельный пользователь) для пользователя.

Когда X2 подключен к базе данных, триггер не знает, кто такой X1.

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

Заказчик также видит, кто является RealUser X1. Поскольку эта информация теряется при подключении к базе данных, у меня есть эта проблема сейчас.

Решение Попытки:

  1. Создать StoredProcedure, который принимает RealUser x1 в качестве аргумента. Это невозможно, поскольку старое программное обеспечение полагается на текущее значение для вставки и обновления таблицы.
  2. Добавить дополнительные данные в инструкцию Insert/Update (возможно, я ничего не обнаружил в связи с этим). Данные будут использоваться только триггером и не должны быть записаны в таблицу.
  3. Добавить информацию о текущем пользователе X1 в Connection или в общий магазин, основанный на подключении (что-то вроде этого существует в SqlServer?)
  4. Используйте свойство ApplicationName для «подделки» имени пользователя. Но это заставляет меня чувствовать себя как монокль. Там должна быть лучшим способом

Заранее спасибо

ответ

0

Вы можете использовать CONTEXT_INFO связать дополнительные данные с сессией, которые могут быть доступны в триггере (как, скажем, оригинальный идентификатор пользователя):

DECLARE @UID VARBINARY(128) = CONVERT(VARBINARY(128), N'User1') 
SET CONTEXT_INFO @UID 

-- Later, at the Hall of Justice 
SELECT CONVERT(NVARCHAR(64), CONTEXT_INFO()) 

Конечно, вы можете использовать другой способ идентификации пользователя, чем строку Юникода, если он в конечном итоге подходит для VARBINARY(128).

Для этого вы должны последовательно задавать информацию перед выполнением любой команды (информация об объекте будет сброшена при закрытии соединения). Есть также проблемы с безопасностью - SET CONTEXT_INFO не является привилегированным заявлением и может быть выполнен любым пользователем, поэтому вы должны быть уверены, что контролируете весь код в базе данных, чтобы данные аудита не были сфальсифицированы.

Смежные вопросы