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) |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
У меня сделано так:
1. Помимо юзера в лог пишется имя хоста 2. Каждая таблица имеет поле UserID not null FK на табличку Users, ХП модифицирующая данные прописывает/модифицирует UserID, соотвественно в триггерах на IUD уже "известно" кто сделал insert/update. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
seg856 Сообщений: 272 Дата регистрации: 23.09.2010 |
Но в этом случае 1) невозможно прописать, кто делал "delete", 2) можно найти только автора последней модификации, а предыдущие авторы не сохраняются.
|
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
1. В ХП для Delete сначала "прописываешь" UserID, затем удаляешь. 2. Не так, триггер на табличке пишет в таблицу лога состояние в котором находится табличка после комита транзакции, те в логе для одной таблицы и "одной" записи находится много записей лога, пример тут forum.foxclub.ru ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Предложу некоторую альтернативу.
У меня есть таблица - srvMonitor, в которой прописываются все вошедшие (ну и при нормальном выходе, там же пишут о выходе) В этой талбице, много полезной инфы. Я не знаю как в Мускуле организовано. В MS SQL при записи в лог, по SPID, вычисляется действующий id_monitor. И прописывается ссылка на него. Описал конечно схематично. В итоге, можно посмотреть кто удалил, с какого хоста, из какого ПО. И поскольку работает триггер на таблицу, не зависит из ХП ты что то делаешь, или правишь из своих каких то, служебных ПО. (Например в MS SQL - Managment studio, в мускуле таких средств предостаточно) ------------------ Исправлено 2 раз(а). Последнее : Аспид, 08.06.17 08:17 |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
seg856 Сообщений: 272 Дата регистрации: 23.09.2010 |
То есть, чтобы удалить строку из tbl, я в хр. процедуре обновляю поле uu (это ид. пользователя, изменившего таблицу).
При этом в лог life_tbl будет добавлена строка, где x_operation='u'. Затем я удаляю эту строку из tbl, в life_tbl записывается эта же строка, x_operation='d'. Так? |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
seg856 Сообщений: 272 Дата регистрации: 23.09.2010 |
Что такое SPID? Какая у Вас еще информация в srvMonitor? |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
1. Если стоит задача "ловить" все delete, независимо от того из какого клиента пришла команда на удаление, то да, необходимо прописать ID юзера, затем удалить записи. Что бы при этом в логе не возникали записи с признаком Update, в триггере на Update необходимо проанализировать какая команда DML выполняется, что бы пропустить запись в лог "паразитного" update. 2. Если такой "глобальной" задачи не стоит, то достаточно знать имя хоста и имя приложения (если оно есть) для выяснения кто удалил, имя NT-юзера известно из лога самого "клиентского" компа. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Это идентификатор коннекта на сервере. В реальном времени, только "живые". Гугл подскажет. Ищи аналог на мускуле. У меня времени нет.
------------------ |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну кто ж знает в таком случае что такое у тебя usrid, и откуда его можно взять Если это переменная сессии т.е. по сути "глобальная" переменная - ну тогда всё вроде как тривиально - залогинился пользователь, выставил (создал) такую переменную со своим id и далее весь код её видит и может использовать... Если это что-то совсем другое - ну значит только ты и можешь понять где это "нечто" можно взять Естественно "в общем случае" можно узнать только то что имеется в данных о сессии mysql-я. Скажем если DML операции выполняет не твоя программа, а банальный mysql (командный шелл), или какая-то GUI утилита, то никаких "своих" пользователей ты узнать не сможешь (эти утилиты не обязаны ничего "этакого" делать). В принципе можно просто блокировать в триггерах все попытки изменить данные, если триггер "не узнал" пользователя - т.е. тот не "представился" подобающим образом системе - например не создал переменной со своим id ------------------ WBR, Igor |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
seg856 Сообщений: 272 Дата регистрации: 23.09.2010 |
А как анализировать? Ведь update есть нормальные, если мы изменяем запись. Как отличить "паразитного" от "непаразитного"? Если я без использования программы напрямую буду изменять таблицы БД, то никто не узнает, что это происходило, так как строка будет перенесена в лог с ид. пользователя, который раньше что-то делал с таблицей. По логу будет записано, что изменения произвел этот пользователь. Исправлено 1 раз(а). Последнее : seg856, 09.06.17 14:56 |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
1. Как в MySQL я не подскажу, в MSSSQL есть ф-ия UPDATE() (наверняка аналогичная ф-ия есть в твоём сервере), те анализируя в триггере какие поля были обновлены можно узнать что менялось, если БД для внешнего мира является "черным ящиком" и доступ возможет ТОЛЬКО посредством ХП сервера (те логинам к таблицам нет доступа), то удалить запись можно только через соотвествующую процедуру.
2. Если удаление происходит от ЛЮБОГО логина/пользователя БД, те минуя интерфейс проги и интерфейс БД (те есть права на Delete для юзеров), то остаётся только фиксировать время и хост с которого было выполнено удалние, покольку удаление через другую прогу/провайдера не знает о твоих юзерах НИЧЕГО. PS те выбор за тобой, либо БД сама себя защищает и ты знаешь юзера БД, хост и время удаления, либо только хост и время. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Можно сделать так чтобы триггер не позволял удалить запись, если он не видит этого "пользователя программы". Конечно от пользователя с правами позволяющими отключать или изменять триггер это не поможет, но от "порезанного в правах" - вполне. ------------------ WBR, Igor |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
Ксатати, такой "взгляд со стороны" мне больше нравится, я бы сказал более правильная, чем изначальная постановка задачи ТСом. Таким образом, решается еще одна проблема - несанкционированного удаления, минуя БЛ администрирования данных. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
Гулин Федор Сообщений: 4640 Откуда: Минск Дата регистрации: 24.10.2002 |
вопрос про MS-sql тригер вешается на каждую таблицу ? или как то удалось обойти это ? ps да в мс-скл позволяет вмсето удаления сделать скжаем софт-делете или записть инфу куда-то в лог но это ж надо на каждую такую таблицу тригер делать - что достаточно трудозатратно ps ну т.е вопрос в том что ловятся делете только с апликухи или любые ? Исправлено 2 раз(а). Последнее : Гулин Федор, 21.06.17 15:56 |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Такого рода триггера практически всегда генерируются, а не "вручную" пишутся. Поэтому трудоёмкости тут никакой нет.
------------------ WBR, Igor |
Re: mysql триггеры, запись ид. пользователя в таблицу | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Именно так. Скрипт такой написать не проблема. (Думаю в инете похожих тьма) Дело еще в том, что в лог пишу инфу для манагеров. Т.е. в инфо поле может быть достаточно много инфы. И при генерации бывает еще указываю вьюшку, которая переводит связи, в читаемый вид. ------------------ |
© 2000-2024 Fox Club  |