Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278

Лог изменений данных

26.03.2019, 11:03. Показов 8212. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый!
Такой вопрос.

Необходимо сделать историю изменений данных которая хранит сами данные действие время и пользователь который совершил действие


Вопрос как определить пользователя ?
Пользователи берутся из таблицы авторизации ( то есть это не системный пользователь, не учетка )

Первый вариант это использовать хранимки ( передавать пользователя и данные которые меняются)- но это не камильфо

Второй вариант триггеры но вопрос как получить пользователя ???


*Знаю похожий пример Firebird
(используя current_connection и дату точно определить своего пользователя (тоесть при запуске программы мы записываем пользователя дату и current_connection а затем в тригерре по дате и current_connection выбираем пользователя))


но аналога current_connection в mssql нет
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.03.2019, 11:03
Ответы с готовыми решениями:

Лог изменений
сорри если вопрос обсуждался, я в базах не силён и поиском внятного ничего не нашёл. суть такова: есть база данных по работе (учёт...

Учет изменений БД (лог?)
Такой вопрос, может быть кто сталкивался: каким образом можно отслеживать изменения в БД Access, вести лог изменений. Или сравнивать...

Пользователь не видит последних изменений в данных базы данных Access
Есть серверная часть базы данных Аксесс, к которой подключены пользователи через удаленных файл Аксесс (клиентскую часть). Последнее время...

36
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
26.03.2019, 11:18
Цитата Сообщение от kyvaldenius Посмотреть сообщение
Вопрос как определить пользователя ?
Пользователи берутся из таблицы авторизации
Стандартные грабли для слишком умных архитекторов.
Цитата Сообщение от kyvaldenius Посмотреть сообщение
но аналога current_connection в mssql нет
Да неужели?
T-SQL
1
2
3
4
@@spid
connectionproperty
sys.dm_exec_sessions
sys.dm_exec_connections
Совсем не подходят?

ЗЫ: Если SQL Server 2016 или старше, то можно использовать sp_set_session_context
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
26.03.2019, 11:39  [ТС]
так тут есть момент
current_connection - перезаписывается после restora


@@spid
connectionproperty
sys.dm_exec_sessions
sys.dm_exec_connections
а эти все как только пользователь отключился номер может быть присвоен другому



то есть у нас есть 10 пользователей и они заходят по очереди и у всех @@SPID будет равен 54

Добавлено через 17 секунд
"Стандартные грабли для слишком умных архитекторов." не много не понял
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
26.03.2019, 12:22
Цитата Сообщение от kyvaldenius Посмотреть сообщение
то есть у нас есть 10 пользователей и они заходят по очереди и у всех @@SPID будет равен 54
Потому что идентифицировать соединене нужно по @@SPID, login_name и login_time, а не только по @@SPID
Цитата Сообщение от kyvaldenius Посмотреть сообщение
"Стандартные грабли для слишком умных архитекторов." не много не понял
Использование собственных велосипедов вместо штатных механизмов, почти всегда приводит к проблемам.
С чем вы и столкнулись.
Теперь придется изобретать маппинг между "пользователем из таблицы авторизации" и текущим соединением.
Причем при реализации данного маппинга еще придется учитывать возможное наличие connection pooling, иначе опять будут проблемы.
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
26.03.2019, 13:06  [ТС]
"идентифицировать соединение нужно по @@SPID, login_name и login_time, а не только по @@SPID" а можно пример ?





Какие есть стандартные механизмы?
стандартный механизм это использовать AD и подключаться к бд под учеткой домена тогда можно и стандартные функции использовать типа user_name
а кроме этого
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
26.03.2019, 13:37
Цитата Сообщение от kyvaldenius Посмотреть сообщение
а можно пример ?
Пример чего? Таблицы маппинга и работы с ней?
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
create table dbo.SessionToUserMapping
(
 session_id int constraint PK_SessionToUserMapping primary key,
 login_name sysname,
 login_time datetime,
 custom_user_id int
);
 
--регистрация пользователя
merge into dbo.SessionToUserMapping t
using (
 select
  session_id, login_name, login_time, @custom_user_id as custom_user_id
 from
  sys.dm_exec_session
 where
  session_id = @@SPID
) s on t.session_id = s.session_id
when not matched then
 insert
  (session_id, login_name, login_time, custom_user_id)
 values
  (s.session_id, s.login_name, s.login_time, s.custom_user_id)
when matched then
 update
  set
   login_name = s.login_name,
   login_time = s.login_time,
   custom_user_id = s.custom_user_id;
 
--получение пользователя
select
 m.custom_user_id
from
 dbo.SessionToUserMapping m join
 sys.dm_exec_sessions s on s.session_id = m.session_id and s.login_name = m.login_name and s.login_time = m.login_time;
Цитата Сообщение от kyvaldenius Посмотреть сообщение
стандартный механизм это использовать AD
Для использования аутентификации Windows не обязательно поднимать AD.
Цитата Сообщение от kyvaldenius Посмотреть сообщение
а кроме этого
Есть еще SQL-аутентификация.
1
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
26.03.2019, 13:45  [ТС]
спасибо за пример буду разбирать
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
27.03.2019, 10:22  [ТС]
По поводу примера не понял один момент когда мы "ищем пользователя " то дата login_time будет разной


SQL
1
2
3
4
5
6
--получение пользователя
SELECT
 m.custom_user_id
FROM
 dbo.SessionToUserMapping m JOIN
 sys.dm_exec_sessions s ON s.session_id = m.session_id AND s.login_name = m.login_name AND s.login_time = m.login_time;

Сейчас происходит так пользователь авторизируется в программе и происходит запись в таблицу SessionToUserMapping

после чего добавляет запись и пользователя мы определить не можем

Добавлено через 20 минут
когда надо делать "регистрация пользователя" При первом запуске программы?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
27.03.2019, 11:09
Цитата Сообщение от kyvaldenius Посмотреть сообщение
дата login_time будет разной
login_time не может быть разным при разных вызовах для одного @@SPID при условии, что соединение одно и то же.
Цитата Сообщение от kyvaldenius Посмотреть сообщение
когда надо делать "регистрация пользователя" При первом запуске программы?
После установления соединения с SQL Server.
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
27.03.2019, 11:44  [ТС]
Как вариант в место login_time datetime, использовать date тогда время не будет играть значения и ограничить чтоб выбирался только самый последний ( актуальны) пользователь который подключился

Добавлено через 3 минуты
"После установления соединения с SQL Server. "

то есть подключение держится на протяжении всей работы программы?
или в каждом методе перед тем как сделать какое либо действие необходимо вызывать регистрацию пользователя?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
27.03.2019, 12:02
Цитата Сообщение от kyvaldenius Посмотреть сообщение
Как вариант в место login_time datetime, использовать date тогда время не будет играть значения и ограничить чтоб выбирался только самый последний ( актуальны) пользователь который подключился
login_time необходим чтобы гарантированно получить маппигнг для текущего соединения. На вас, видимо, это не заботит. Поэтому делайте как считаете правильным.
Цитата Сообщение от kyvaldenius Посмотреть сообщение
то есть подключение держится на протяжении всей работы программы?
или в каждом методе перед тем как сделать какое либо действие необходимо вызывать регистрацию пользователя?
Мне неведомо как вы управляете подключениями. И как нужно ими управлять.
Чтобы предложенный механизм работал нужно обеспечить корректный маппинг для каждого физического соединения с сервером. Учитывая, что на каждое логическое соединение (соответсвующий экземпляр класса в приложении) может быть несколько физических, открываемых неявно - я не знаю как вы это будете реализовывать.
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
27.03.2019, 13:31  [ТС]
=)

ладно я вас понял )
спасибо за пример кода дальше надо его как-то приспособить



просто момент того что подключение надо держать на протяжении всей работы проги это очень странно и порадовало
по сравнению постоянным соединением проблемы из-за не точно определения пользователя не такая страшная

спасибо за помощь
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
28.03.2019, 08:16  [ТС]
все таки вопрос остается открытым.
думал использовать ip но не помогает

Добавлено через 33 минуты
Перефразирую вопрос а то уже можно запутаться.


Как сделать историю изменения данных с пользователем ( из собственной таблицы) с учетом что подключение к БД отрывается только при работе с данными (подключение постоянно не висит) ?

или как использовать встроенную авторизацию SQL/Microsoft
( для авторизации необходимо определять права пользователям на различный функционал ( желатьльно пользователей объединять в группы)?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.03.2019, 10:24
Цитата Сообщение от kyvaldenius Посмотреть сообщение
Как сделать историю изменения данных с пользователем ( из собственной таблицы) с учетом что подключение к БД отрывается только при работе с данными (подключение постоянно не висит) ?
Так же как с постоянным подключением. Разницы никакой. Что именно нужно делать я уже писал.
Цитата Сообщение от kyvaldenius Посмотреть сообщение
или как использовать встроенную авторизацию SQL/Microsoft
( для авторизации необходимо определять права пользователям на различный функционал ( желатьльно пользователей объединять в группы)?
Для проверки прав уровня приложения можно проверять членство в роли (ролях).
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
28.03.2019, 10:30
Цитата Сообщение от invm Посмотреть сообщение
Если SQL Server 2016 или старше
Наверно, не старше, а моложе?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.03.2019, 10:35
Цитата Сообщение от iap Посмотреть сообщение
Наверно, не старше, а моложе?
Версия считается старше, если выпущена позже.
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
28.03.2019, 11:01  [ТС]
invm

"Так же как с постоянным подключением. Разницы никакой. Что именно нужно делать я уже писал."

да но проблема с временем по которому определяем текущее соединение потом маппинг чтоб определить пользователя

"Так же как с постоянным подключением. Разницы никакой" если мы используем не постоянно подключение то разница во времени не даст нам определить пользователя

если мы откажемся от времени а оставим только дату
тогда

когда на одном компьютере :
Пример
мы заходим под пользователем "1" (прошла регистрация пользователя, история пишется все хорошо )

мы перезаходим под пользователем "2" - ( проходим регистрацию пользователя, но при получении пользователя будет выбираться всегда первый тоесть действие совершил 2 а в истории 1

-получение пользователя
SQL
1
2
3
4
5
6
7
SELECT
 m.custom_user_id
FROM
 dbo.SessionToUserMapping m JOIN
 sys.dm_exec_sessions s ON s.session_id = m.session_id 
[B]AND s.login_name = m.login_name 
AND s.login_time = m.login_time;[/B]

AND s.login_name = m.login_name
AND s.login_time = m.login_time;

будут одинаковые как у пользователя 1 так и у 2

Добавлено через 4 минуты
пример

Таблица MAPPING

Добавлено через 3 минуты
пример :

Таблица MAPPING


session_id login_name login_time id_user

57 Admin 2019-03-28 1
60 Admin 2019-03-28 3

история
comment UserLogin TypeAction TimeAction

тест 1 INSERT 2019-03-28 10:50:33.297
те 3 UPDATE 2019-03-28 10:51:05.467
е 3 UPDATE 2019-03-28 10:51:21.963
е 3 DELETE 2019-03-28 10:51:48.120
12 3 DELETE 2019-03-28 10:52:52.700
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.03.2019, 11:06
Цитата Сообщение от kyvaldenius Посмотреть сообщение
Пример
мы заходим под пользователем "1" (прошла регистрация пользователя, история пишется все хорошо )
мы перезаходим под пользователем "2" - ( проходим регистрацию пользователя, но при получении пользователя будет выбираться всегда первый тоесть действие совершил 2 а в истории 1
А маппинг сам обновится?
0
16 / 12 / 4
Регистрация: 28.09.2015
Сообщений: 278
28.03.2019, 11:10  [ТС]
когда пользователь запустил программу и авторизировался то запускаем

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--регистрация пользователя
MERGE INTO dbo.SessionToUserMapping t
USING (
 SELECT
  session_id, login_name, login_time, @custom_user_id AS custom_user_id
 FROM
  sys.dm_exec_session
 WHERE
  session_id = @@SPID
) s ON t.session_id = s.session_id
WHEN NOT matched THEN
 INSERT
  (session_id, login_name, login_time, custom_user_id)
 VALUES
  (s.session_id, s.login_name, s.login_time, s.custom_user_id)
WHEN matched THEN
 UPDATE
  SET
   login_name = s.login_name,
   login_time = s.login_time,
   custom_user_id = s.custom_user_id;

login_time - дата так как если использовать время оно будет всегда разное из-за не постоянного подключения
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.03.2019, 11:27
Цитата Сообщение от kyvaldenius Посмотреть сообщение
login_time - дата так как если использовать время оно будет всегда разное из-за не постоянного подключения
Конечно разное.
Я вам уже объяснял несколько раз когда нужно обновлять маппинг. Вы не слышите.

Еще раз - обновлять маппинг нужно, когда открывается соединение с сервером БД или когда меняется ваш внутренний пользователь при открытом соединении с БД.
Если вы не в состоянии реализовать такое поведение - передавайте пользователя параметром при каждой манипуляции с БД.

Возможно когда-то, если надоест постоянно ходить по этим граблям, сделаете нормальную реализацию штатными средствами...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.03.2019, 11:27
Помогаю со студенческими работами здесь

Regedit лог изменений реестра
Есть лог изменений реестра, внесенных посредством regedita?

Пожалуйста проверьте правильно ли я составила лог.функцию по лог.схеме?
Для заданной схемы, составленной из трех логических элементов ЛЭ1, ЛЭ2, ЛЭ3 записать логическое выражение и составить таблицу истинности. ...

Лог событий в базе данных
Добрый день! Подскажите как в программе организовать "лог событий" в базе данных Access? кто что добавил, удалил, кто изменил (на что...

Вывод данных из лог файла
Доброе время и суток, дорогие друзья! Я начинающий программист и хочу стать профессионалом как вы и был бы очень рад если вы меня...

Лог коммутатора как перевести лог
Добрый день! Помогите пожалуйста перевести лог. Oct 12 14:33:49.378 MSK: %SEC-6-IPACCESSLOGDP: list Access_From_Guest_VLAN denied...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru