powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Логирование изменений записи
25 сообщений из 86, страница 2 из 4
Логирование изменений записи
    #39562296
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры я пишу вручную.
Делаю один триггер на все операции.

Код: plsql
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.
CREATE OR ALTER TRIGGER SAUTOR_AIUD_LOGS FOR SAUTOR
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
as
declare variable vtname  varchar(31);
declare variable va      char(1);
declare variable vid_src integer;
begin
  --
  -- Логирование изменений
  --
  if (gen_id(GEN_SW_LOGS_SAUTOR, 0) = 0) then exit;
  --
  vtname = 'SAUTOR';
  --
  if (inserting) then begin va = 'I'; vid_src = new.id; end else
  if (updating ) then begin va = 'U'; vid_src = old.id; end else
  if (deleting ) then begin va = 'D'; vid_src = old.id; end
                 else begin va = '?'; vid_src = NULL;   end
  --
  -- обработка полей
  --
  if ((updating and new.id           is distinct from old.id          ) or inserting or deleting)
    then insert into logs(tname, fname, a, id_src, val) values(:vtname, 'ID'            , :va, :vid_src, new.id          );
  --
  if ((updating and new.name         is distinct from old.name        ) or inserting or deleting)
    then insert into logs(tname, fname, a, id_src, val) values(:vtname, 'NAME'          , :va, :vid_src, new.name        );
  --
end
^




Сам лог расчитан на логирование данных где первичный ключ таблицы имеет смысл в физическом мире и виден в интерфейсе.
В первую очередь это справочники.

Код: plsql
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
CREATE GENERATOR GEN_LOGS_ID;

CREATE TABLE LOGS (
    ID      INTEGER NOT NULL,
    TNAME   VARCHAR(31),
    FNAME   VARCHAR(31),
    ID_SRC  INTEGER,
    A       CHAR(1),
    VAL     VARCHAR(1000),
    A_DT    TIMESTAMP default current_timestamp,
    A_USER  VARCHAR(32) default current_user,
    A_IP    VARCHAR(253),
    A_EXE   VARCHAR(253) -- не используется
);

/******************************************************************************/

ALTER TABLE LOGS ADD CONSTRAINT LOGS_PK PRIMARY KEY (ID);

CREATE INDEX LOGS_A_DT   ON LOGS (A_DT);
CREATE INDEX LOGS_FNAME ON LOGS (FNAME);
CREATE INDEX LOGS_ID_SRC ON LOGS (ID_SRC);
CREATE INDEX LOGS_TNAME ON LOGS (TNAME);

/******************************************************************************/

SET TERM ^ ;

CREATE OR ALTER TRIGGER LOGS_BI_ID FOR LOGS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_logs_id,1);
end
^


CREATE OR ALTER TRIGGER LOGS_BI_IP FOR LOGS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  --
  -- Вставка IP вносившего изменение
  --
  select rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    from rdb$database
    into NEW.a_ip;

/*
  -- этот вариант говорят что под нагрузкой плохо работает
  -- жрет много ресурсов формируя каждый раз ВСЕ MON$-таблицы
  select
    MON$REMOTE_ADDRESS,
    MON$REMOTE_PROCESS
  from MON$ATTACHMENTS
  where (MON$ATTACHMENTS.MON$ATTACHMENT_ID = current_connection)
  into NEW.a_ip, NEW.a_exe;
*/
end
^

SET TERM ; ^


/******************************************************************************/

COMMENT ON TABLE LOGS IS 
'Лог справочников.
Для фиксирования изменений в таблицах где есть primary key(id)';

**************************************************************************/

COMMENT ON COLUMN LOGS.TNAME IS 
'Имя таблицы - источника';

COMMENT ON COLUMN LOGS.FNAME IS 
'Имя поля в таблице-источнике';

COMMENT ON COLUMN LOGS.ID_SRC IS 
'Первичный ключ записи в таблице-источнике';

COMMENT ON COLUMN LOGS.A IS 
'Action (I/U/D)';

COMMENT ON COLUMN LOGS.VAL IS 
'Новое значение в логируемом поле';

COMMENT ON COLUMN LOGS.A_DT IS 
'Дата-время изменения';

COMMENT ON COLUMN LOGS.A_USER IS 
'Кто изменил';

COMMENT ON COLUMN LOGS.A_IP IS 
'С какого IP было изменение
Данные поля MON@ATTACHMENTS.MON$REMOTE_ADDRESS';

COMMENT ON COLUMN LOGS.A_EXE IS 
'Из какой программы были изменения.
Данные поля MON@ATTACHMENTS.MON$REMOTE_PROCESS';



Для некоторых случаев где нет доступного первичного ключа или он составной или он не имеет отношения к идентификации физического объекта - сделаны другие, специализированные таблицы и триггера логов.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562304
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,
у тебя первичный ключ может меняться?

Код: sql
1.
 and new.id           is distinct from old.id 
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562329
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, поэтому спасибо разработчикам за гетерогенные запросы - можно логи хранить в соседней базе.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562335
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДfraks,
у тебя первичный ключ может меняться?

Код: sql
1.
 and new.id           is distinct from old.id 



Нет, не может.
Но в жизни разное бывает, и не дело триггера логирования упрощать ситуацию.
Его дело - записать в лог любое изменившееся поле, и ПК для него - просто частный случай поля.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562336
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11kdv, поэтому спасибо разработчикам за гетерогенные запросы - можно логи хранить в соседней базе.

Я не пользуюсь возможностью через одну базу делать коннекты в другую. Просто из приложения коннекчусь куда надо отдельным коннектом.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562370
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksif (inserting) then begin va = 'I'; vid_src = new.id; end else
if (updating ) then begin va = 'U'; vid_src = old.id; end else
if (deleting ) then begin va = 'D'; vid_src = old.id; end
else begin va = '?'; vid_src = NULL; end
--

может красивей использовать when then?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
      --АУДИТ
      SELECT TABLE_NAME FROM GET_TABLE_NAME_FOR_TRIGGER INTO :STABLE;
      INSERT INTO JOURNAL (TABLE_NAME, ACT, ID_OBJ)
        VALUES (:STABLE,
                CASE
                  WHEN INSERTING THEN 'INSERTING'
                  WHEN UPDATING THEN 'UPDATING'
                  WHEN DELETING THEN 'DELETING'
                END,
                CASE
                  WHEN INSERTING THEN NEW.ID
                  WHEN UPDATING THEN OLD.ID
                  WHEN DELETING THEN OLD.ID
                END
                );
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562462
sonkz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,
Логирование - все просто!
Лог ведут триггеры after insert or update od delete на каждой таблице, которой нужно протоколирование

текст триггеров генерится процедурой, которая обсасывает системные таблицы RDB$RELATION_FIELDS, RDB$FIELDS примерно в таком виде

Код: plsql
1.
2.
3.
4.
5.
'create or alter trigger LOG$'||:TABLENAME||' for '||:TABLENAME||
    'ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 256'||
    'as'||
    'begin'
    ...



Еще существует процедурка (допустим DBA$INIT_LOG(RELATION_NAME varcar(13) character set UNICODE_FSS), которая вызывает предыдущую получает у нее текст триггера и в execute statement компилирует его. Она де грантит этому триггеру все необходимые права.

При необходимости внести изменения в структуру таблицы делаем
Код: plsql
1.
2.
3.
4.
5.
drop trigger LOG$TABLENAME;

DDL операторы...

execute  procedure DBA$INIT_LOG('TABLENAME');



все.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562490
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sonkz, т.е. на каждый insert/update генерируется каждый раз и пересоздается триггер?
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562502
sonkz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11sonkz, т.е. на каждый insert/update генерируется каждый раз и пересоздается триггер?

Да, на каждую таблицу, которой нужно протоколирование создается(или пересоздается) один триггер.

Создание (или изменение) триггера происходит при вызове процедуры DBA$INIT_LOG
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562542
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о нет, думаю, это существенно заменит добавление/изменение записи
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562550
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11о нет, думаю, это существенно заменит добавление/изменение записи
По сравнению с чем?
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562561
sonkz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11о нет, думаю, это существенно заменит добавление/изменение записи

Замедлит? О какой записи идет речь?
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562566
мастер_ёда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много лет пользуюсь протоколированием от IBExpert, слегка доработал под свою задачу (доп. ключевые поля+индексы).
Зачем лисапед изобретаете?
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562567
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД, по сравнению с тем, когда не нужно перекомпилировать/пересоздавать триггер каждый раз.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562568
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sonkz, как о какой?

О записи информации в базу. Триггер срабатывает когда в базу записывается информация.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562570
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мастер_ёда, за тем, что я не для себя хочу реализовать, а для простого юзверя, который, может, с вилами на ПК кидается.
Ему под капот не нужно лезть, а достаточно выбрать условия и нажать "Отобразить аудит действий пользователей".
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562571
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
01.12.2017 14:36, X11 пишет:
> Ему под капот не нужно лезть,
> а достаточно выбрать условия и нажать
> "Отобразить аудит действий пользователей".

и будет он сидеть и молча утирать скупую слезу.
ибо хрен поймёт чо там к чему пришпилено...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562573
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11чччД, по сравнению с тем, когда не нужно перекомпилировать/пересоздавать триггер каждый раз.

А "каждый раз" это когда?
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562584
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m, когда добавляется/меняется запись в таблице.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562585
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11m7m, когда добавляется/меняется запись в таблице.Пациент путает педали.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562587
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11m7m, когда добавляется/меняется запись в таблице.
Или никто такое не утверждал, или я невнимательно читал
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562595
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логирование физических таблиц - это аудит низкого уровня, в котором не каждый ИТ-специалист разберётся, кроме того, что "вот этот тогда-то похоже что-то сделал".
Потому что время, когда 1 таблица - "шапки", и ещё 1-2 - "Товары", "Платежи" для одного документа, уже давно прошли.
Сейчас заполнишь одно поле в документе - и это вызывает изменения в 10-ке разных таблиц, часто неочевидных.

Для отслеживания "когда, кто", по-моему, следует стремиться к прикладным объектам, и отслеживание это зачастую не на уровне СУБД, хотя часть (или всё) можно туда навесить.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562615
sonkz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11m7m, когда добавляется/меняется запись в таблице.

Триггер, изменяется ТОЛЬКО когда изменяется таблица (метаданные), а все остальное время он молча пишет все изменения в ДАННЫХ в таблицы логов.

Можно, заставить его заглядывать в настроечные таблицы, чтоб посмотреть поставил ли там юверь галочку - протоколировать, или не поставил для конкретного события( insert, update, delete или update каких полей он хочет протоколировать)
Только тогда нужно еще протоколировать настройки протоколирования.
А потом настройки протоколирования настроек протоколирования, и т.д.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562619
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда нужен триггер/событие, который будет определять, что структура целевой таблицы изменилась, например, добавилось поле или удалено поле. Чтобы сочинить новое тело триггера для логирования.
...
Рейтинг: 0 / 0
Логирование изменений записи
    #39562622
sonkz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мастер_ёдаМного лет пользуюсь протоколированием от IBExpert, слегка доработал под свою задачу (доп. ключевые поля+индексы).
Зачем лисапед изобретаете?

У меня все это работало еще до того, как IBExpert научился. Во какой я старый! http://www.sql.ru/forum/images/cry.gif
...
Рейтинг: 0 / 0
25 сообщений из 86, страница 2 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Логирование изменений записи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]