:: Не фоксом единым
mysql триггеры, запись ид. пользователя в таблицу
seg856

Сообщений: 272
Дата регистрации: 23.09.2010
На каждую таблицу tbl для БД MYSQL должна быть таблица life_tbl с историей изменений.
life_tbl имеет те же поля, что и tbl, плюс поля x_usrid (ид. пользователя, произведшего над таблицей действие добавления, удаления или изменения), x_datetime (дата и время изменения), x_operation (какая была операция: 'i', 'u', 'd' - insert, update или delete соответственно). При каждом действии над tbl в life_tbl записывается соответствующая строка.

Как в триггере записывать значение поля x_usrid (ид. пользователя, произведшего изменения) в таблицу life_tbl?


(Пользователи не совпадают с пользователями mysql)
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
У меня сделано так:

1. Помимо юзера в лог пишется имя хоста

2. Каждая таблица имеет поле UserID not null FK на табличку Users, ХП модифицирующая данные прописывает/модифицирует UserID, соотвественно в триггерах на IUD уже "известно" кто сделал insert/update.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
seg856

Сообщений: 272
Дата регистрации: 23.09.2010
Но в этом случае 1) невозможно прописать, кто делал "delete", 2) можно найти только автора последней модификации, а предыдущие авторы не сохраняются.
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
seg856
Но в этом случае 1) невозможно прописать, кто делал "delete", 2) можно найти только автора последней модификации, а предыдущие авторы не сохраняются.

1. В ХП для Delete сначала "прописываешь" UserID, затем удаляешь.

2. Не так, триггер на табличке пишет в таблицу лога состояние в котором находится табличка после комита транзакции, те в логе для одной таблицы и "одной" записи находится много записей лога, пример тут forum.foxclub.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Предложу некоторую альтернативу.
У меня есть таблица - srvMonitor, в которой прописываются все вошедшие (ну и при нормальном выходе, там же пишут о выходе)
В этой талбице, много полезной инфы.
Я не знаю как в Мускуле организовано.
В MS SQL при записи в лог, по SPID, вычисляется действующий id_monitor.
И прописывается ссылка на него.
Описал конечно схематично.
В итоге, можно посмотреть кто удалил, с какого хоста, из какого ПО.

И поскольку работает триггер на таблицу, не зависит из ХП ты что то делаешь, или правишь из своих каких то, служебных ПО.
(Например в MS SQL - Managment studio, в мускуле таких средств предостаточно)


------------------




Исправлено 2 раз(а). Последнее : Аспид, 08.06.17 08:17
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
seg856

Сообщений: 272
Дата регистрации: 23.09.2010
То есть, чтобы удалить строку из tbl, я в хр. процедуре обновляю поле uu (это ид. пользователя, изменившего таблицу).
При этом в лог life_tbl будет добавлена строка, где x_operation='u'.
Затем я удаляю эту строку из tbl, в life_tbl записывается эта же строка, x_operation='d'.
Так?
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
seg856

Сообщений: 272
Дата регистрации: 23.09.2010
Аспид
Предложу некоторую альтернативу.
У меня есть таблица - srvMonitor, в которой прописываются все вошедшие (ну и при нормальном выходе, там же пишут о выходе)
В этой талбице, много полезной инфы.
Я не знаю как в Мускуле организовано.
В MS SQL при записи в лог, по SPID, вычисляется действующий id_monitor.
И прописывается ссылка на него.
Описал конечно схематично.
В итоге, можно посмотреть кто удалил, с какого хоста, из какого ПО.

Что такое SPID?
Какая у Вас еще информация в srvMonitor?
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
seg856
То есть, чтобы удалить строку из tbl, я в хр. процедуре обновляю поле uu (это ид. пользователя, изменившего таблицу).
При этом в лог life_tbl будет добавлена строка, где x_operation='u'.
Затем я удаляю эту строку из tbl, в life_tbl записывается эта же строка, x_operation='d'.
Так?

1. Если стоит задача "ловить" все delete, независимо от того из какого клиента пришла команда на удаление, то да, необходимо прописать ID юзера, затем удалить записи.

Что бы при этом в логе не возникали записи с признаком Update, в триггере на Update необходимо проанализировать какая команда DML выполняется, что бы пропустить запись в лог "паразитного" update.

2. Если такой "глобальной" задачи не стоит, то достаточно знать имя хоста и имя приложения (если оно есть) для выяснения кто удалил, имя NT-юзера известно из лога самого "клиентского" компа.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
seg856
Что такое SPID?
Это идентификатор коннекта на сервере. В реальном времени, только "живые".
Гугл подскажет. Ищи аналог на мускуле. У меня времени нет.
seg856
Какая у Вас еще информация в srvMonitor?
CREATE TABLE [dbo].[svcMonitor](
[ID_MONITOR] [int] IDENTITY(1,1) NOT NULL,
[ID_USER] [int] NULL CONSTRAINT [DF_MONITOR_ID_USER] DEFAULT ((1)),
[hostname] [varchar](128) NULL,
[login_time] [datetime] NULL,
[exit_time] [datetime] NULL,
[isfail] [smallint] NOT NULL CONSTRAINT [DF_MONITOR_isfail] DEFAULT ((0)),
[ismark] [smallint] NOT NULL CONSTRAINT [DF_MONITOR_ismark] DEFAULT ((0)),
[app] [varchar](128) NULL,
[ver] [varchar](20) NULL,
[spid] [smallint] NULL,
CONSTRAINT [PK_MONITOR] PRIMARY KEY CLUSTERED
(
[ID_MONITOR] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


------------------
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
seg856
Как в триггере записывать значение поля x_usrid (ид. пользователя, произведшего изменения) в таблицу life_tbl?
(Пользователи не совпадают с пользователями mysql)
Ну кто ж знает в таком случае что такое у тебя usrid, и откуда его можно взять Если это переменная сессии т.е. по сути "глобальная" переменная - ну тогда всё вроде как тривиально - залогинился пользователь, выставил (создал) такую переменную со своим id и далее весь код её видит и может использовать... Если это что-то совсем другое - ну значит только ты и можешь понять где это "нечто" можно взять
Естественно "в общем случае" можно узнать только то что имеется в данных о сессии mysql-я. Скажем если DML операции выполняет не твоя программа, а банальный mysql (командный шелл), или какая-то GUI утилита, то никаких "своих" пользователей ты узнать не сможешь (эти утилиты не обязаны ничего "этакого" делать). В принципе можно просто блокировать в триггерах все попытки изменить данные, если триггер "не узнал" пользователя - т.е. тот не "представился" подобающим образом системе - например не создал переменной со своим id


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
seg856

Сообщений: 272
Дата регистрации: 23.09.2010
PaulWist

Что бы при этом в логе не возникали записи с признаком Update, в триггере на Update необходимо проанализировать какая команда DML выполняется, что бы пропустить запись в лог "паразитного" update.

А как анализировать? Ведь update есть нормальные, если мы изменяем запись. Как отличить "паразитного" от "непаразитного"?

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



Исправлено 1 раз(а). Последнее : seg856, 09.06.17 14:56
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
seg856
А как анализировать? Ведь update есть нормальные, если мы изменяем запись. Как отличить "паразитного" от "непаразитного"?

1. Как в MySQL я не подскажу, в MSSSQL есть ф-ия UPDATE() (наверняка аналогичная ф-ия есть в твоём сервере), те анализируя в триггере какие поля были обновлены можно узнать что менялось, если БД для внешнего мира является "черным ящиком" и доступ возможет ТОЛЬКО посредством ХП сервера (те логинам к таблицам нет доступа), то удалить запись можно только через соотвествующую процедуру.

seg856
Если я без использования программы напрямую буду изменять таблицы БД, то никто не узнает, что это происходило, так как строка будет перенесена в лог с ид. пользователя, который раньше что-то делал с таблицей. По логу будет записано, что изменения произвел этот пользователь.

2. Если удаление происходит от ЛЮБОГО логина/пользователя БД, те минуя интерфейс проги и интерфейс БД (те есть права на Delete для юзеров), то остаётся только фиксировать время и хост с которого было выполнено удалние, покольку удаление через другую прогу/провайдера не знает о твоих юзерах НИЧЕГО.

PS те выбор за тобой, либо БД сама себя защищает и ты знаешь юзера БД, хост и время удаления, либо только хост и время.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
PaulWist
2. Если удаление происходит от ЛЮБОГО логина/пользователя БД, те минуя интерфейс проги и интерфейс БД (те есть права на Delete для юзеров), то остаётся только фиксировать время и хост с которого было выполнено удалние, покольку удаление через другую прогу/провайдера не знает о твоих юзерах НИЧЕГО.
Можно сделать так чтобы триггер не позволял удалить запись, если он не видит этого "пользователя программы". Конечно от пользователя с правами позволяющими отключать или изменять триггер это не поможет, но от "порезанного в правах" - вполне.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Igor Korolyov
PaulWist
2. Если удаление происходит от ЛЮБОГО логина/пользователя БД, те минуя интерфейс проги и интерфейс БД (те есть права на Delete для юзеров), то остаётся только фиксировать время и хост с которого было выполнено удалние, покольку удаление через другую прогу/провайдера не знает о твоих юзерах НИЧЕГО.
Можно сделать так чтобы триггер не позволял удалить запись, если он не видит этого "пользователя программы". Конечно от пользователя с правами позволяющими отключать или изменять триггер это не поможет, но от "порезанного в правах" - вполне.
Ксатати, такой "взгляд со стороны" мне больше нравится, я бы сказал более правильная, чем изначальная постановка задачи ТСом.

Таким образом, решается еще одна проблема - несанкционированного удаления, минуя БЛ администрирования данных.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
Гулин Федор

Сообщений: 4640
Откуда: Минск
Дата регистрации: 24.10.2002
Аспид
Предложу некоторую альтернативу.
У меня есть таблица - srvMonitor, в которой прописываются все вошедшие (ну и при нормальном выходе, там же пишут о выходе)
В этой талбице, много полезной инфы.
Я не знаю как в Мускуле организовано.
В MS SQL при записи в лог, по SPID, вычисляется действующий id_monitor.
И прописывается ссылка на него.
Описал конечно схематично.
В итоге, можно посмотреть кто удалил, с какого хоста, из какого ПО.

И поскольку работает триггер на таблицу, не зависит из ХП ты что то делаешь, или правишь из своих каких то, служебных ПО.
(Например в MS SQL - Managment studio, в мускуле таких средств предостаточно)

вопрос про MS-sql
тригер вешается на каждую таблицу ?
или как то удалось обойти это ?

ps да в мс-скл позволяет вмсето удаления сделать скжаем софт-делете
или записть инфу куда-то в лог
но это ж надо на каждую такую таблицу тригер делать - что достаточно трудозатратно

ps ну т.е вопрос в том что ловятся делете только с апликухи или любые ?



Исправлено 2 раз(а). Последнее : Гулин Федор, 21.06.17 15:56
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Такого рода триггера практически всегда генерируются, а не "вручную" пишутся. Поэтому трудоёмкости тут никакой нет.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: mysql триггеры, запись ид. пользователя в таблицу
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Гулин Федор
но это ж надо на каждую такую таблицу тригер делать - что достаточно трудозатратно
Igor Korolyov
Такого рода триггера практически всегда генерируются, а не "вручную" пишутся. Поэтому трудоёмкости тут никакой нет.
Именно так. Скрипт такой написать не проблема. (Думаю в инете похожих тьма)
Дело еще в том, что в лог пишу инфу для манагеров.
Т.е. в инфо поле может быть достаточно много инфы. И при генерации бывает еще указываю вьюшку, которая переводит связи, в читаемый вид.


------------------
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 7 (Гостей: 7)

© 2000-2024 Fox Club 
Яндекс.Метрика