:: Visual Foxpro, Foxpro for DOS
MySQL: удалени записи и логирование этого события
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
LPARAMETERS lcTable, lnRecord
LOCAL loRecord
DO case
CASE !goSql.get_record( lcTable, lnRecord, @loRecord )
RETURN goApp.error_id = no_error
CASE !goSql.transaction_begin()
RETURN goApp.error_id = no_error
CASE !event_insert( event_del, "TABLE: "+lcTable+ )
goSql.transaction_rollback()
CASE !goSql.del_record( lcTable, lnRecord, IIF( PEMSTATUS(loRecord,"sign",5), loRecord.sign, 0) )
goSql.transaction_rollback()
CASE !goSql.transaction_commit()
goSql.transaction_rollback()
ENDCASE
RETURN goApp.error_id = no_error

Поделитесь логикой как фиксировать факт удаления пользователем ...

CASE !event_insert( event_del, "TABLE: "+lcTable)
goSql.transaction_rollback()

У меня есть журнал событий и там заготовка. Вот настал момент когда пользователь удалил важное. Как собирать сопутствующую инфу?


------------------
Говорить стоит лишь для тех, кто слушает.
Ratings: 0 negative/0 positive
Re: MySQL: удалени записи и логирование этого события
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Я создавал таблицу логирования любых изменений данных. ЛЮБЫХ! Она тяжелее самих данных. Нуждаюсь в совете...


------------------
Говорить стоит лишь для тех, кто слушает.
Ratings: 0 negative/0 positive
Re: MySQL: удалени записи и логирование этого события
ABB
Автор

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
ChatGPT:

В MySQL можно также фиксировать факт удаления пользователем записи в журнале событий или логе. Для этого можно использовать следующую логику:

1. Создать таблицу, которая будет служить журналом событий. Например:

CREATE TABLE event_log (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
event_type VARCHAR(50) NOT NULL,
table_name VARCHAR(50) NOT NULL,
user_name VARCHAR(50) NOT NULL,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Эта таблица будет хранить информацию о типе события, имени таблицы, имени пользователя и времени события.

2. Создать триггер для таблицы, при срабатывании которого будет происходить запись события в журнал. Например:

DELIMITER //
CREATE TRIGGER trigger_name AFTER DELETE ON table_name FOR EACH ROW
BEGIN
INSERT INTO event_log (event_type, table_name, user_name)
VALUES ('delete', 'table_name', USER());
END //
DELIMITER ;

Этот триггер будет вызываться после удаления каждой строки в таблице и будет записывать в журнал событий информацию о типе события, имени таблицы и имени пользователя.

3. При необходимости можно также использовать команду ROLLBACK для отмены транзакции, если удаление не было успешным.

Таким образом, при удалении записи пользователем будет происходить запись факта в журнале событий, что позволяет отслеживать действия пользователей и быстрее восстанавливать информацию при необходимости.
Ratings: 0 negative/0 positive
Re: MySQL: удалени записи и логирование этого события
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Так в чем вопрос??

Если, как логировать значения, то у меня триггеры на I/D/U пишут записи/значения в xml для «простых» данных, для lob полей приходится хранить как есть.


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

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
ю


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 1 раз(а). Последнее : Vedmak, 24.03.23 20:58
Ratings: 0 negative/0 positive
Re: MySQL: удалени записи и логирование этого события
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
А как вы видите поиск в лог-таблице где, априори, бизнеслогика отсутствует. Пример такой покажите... пожалуйста.


------------------
Говорить стоит лишь для тех, кто слушает.
Ratings: 0 negative/0 positive
Re: MySQL: удалени записи и логирование этого события
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Vedmak
А как вы видите поиск в лог-таблице

По памяти, сама табличка

create table Log (id int, TimeStamp datetime not null, TypeDML char(6) /*Insert/Delete/Update*/ not null, TableName varchar(100) not null, Object_Name varchar(100) not null, cXML xml not null)

Триггер складывает поля и записи в XML, таким образом получается:

1. Количество полей в таблице может меняться, но не меняется сам триггер
2. Одна операция DML "лежит" в одной записи (не одна удаленная запись на одну запись лога, а в одной записи лога лежит 100-1000 записей попавших под операцию Delete).

Соотвественно, знаем что удаление было вчера из таблицы такой-то

select * from Log where TimeStamp = вчера and TableName = имя таблицы and TypeDML = 'Delete'
outer apply us_parsXML(Log.ID)

получаем что, когда удалено

Vedmak
где, априори, бизнеслогика отсутствует.

А причем тут бизнес логика??


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 27.03.23 09:15
Ratings: 0 negative/0 positive
Re: MySQL: удалени записи и логирование этого события
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
PaulWist
А причем тут бизнес логика??

Я хотелось бы отловить не только сам факт удаления записи из таблицы, а еще какой записи. Т.е. её содержимое перед удалением. А потом выдернуть историю изменений ЭТОЙ записи из event_list. Т.е. обращаться не только к полям таблицы, а еще и к полям JSON\XML которые содержат данные записи с которой производились операции I\U\D.

Например, приложенном файле я фиксирую факт INSERT/UPDATE накладной, но хотелось бы иметь возможно вести историю того что именно менялось. Если 3 пользователя меняли накладную 5 раз в течении недели, то хотелось бы видеть что и в какой таблице пользователь апдейтил.

Не хотелось бы для каждой таблицы создавать клона с историей изменений.


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 1 раз(а). Последнее : Vedmak, 13.06.23 20:06
Ratings: 0 negative/0 positive
Re: MySQL: удалени записи и логирование этого события
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Vedmak

Я хотелось бы отловить не только сам факт удаления записи из таблицы, а еще какой записи. Т.е. её содержимое перед удалением. А потом выдернуть историю изменений ЭТОЙ записи из event_list. Т.е. обращаться не только к полям таблицы, а еще и к полям JSON\XML которые содержат данные записи с которой производились операции I\U\D.

Ты не понял главного.

В триггере заполняется XML со значениями которые удаляются (модифицируются), те создаётся XML-документ, в который входят все модифицируемые поля, хочешь одновременно старые и новые - формируй XML из old и new, хочешь JSON-поля "помнить" ничто не мешает их тоже в XML положить.

Vedmak

Если 3 пользователя меняли накладную 5 раз в течении недели, то хотелось бы видеть что и в какой таблице пользователь апдейтил.

Не хотелось бы для каждой таблицы создавать клона с историей изменений.

Дык, вроде рассказал как сам делаю, прочти ещё раз внимательно.


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

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Долетело! ) Спасибо! Буду думать!


------------------
Говорить стоит лишь для тех, кто слушает.
Ratings: 0 negative/0 positive
Re: MySQL: удалени записи и логирование этого события
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Паша это уже приводил, я говорил. Но руки не дошли найти и выслать.

P.S. сам пытался подобную таблицу, значения old/new тупо в строке хранил (основные типы приводятся к строковому всегда), но показалось неуклюже и не знал, как запросом выдернуть. Про XML не догадался.
:hi:


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 22.07.23 08:07
Ratings: 0 negative/0 positive


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

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

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