Как бы вы отслеживали историю всех операций CRUD без ре-архитектуры? - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы фиксировать изменения значений данных с течением времени в определенных таблицах для целей аудита. Есть много клиентов, которые могут делать запросы к базе данных, поэтому поместить слой перед SQL было бы невозможно.

1 Ответ

0 голосов
/ 04 мая 2018

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

вот тот, который я подготовил ранее этот пример регистрирует как таблицу, так и журнал

CREATE TABLE debuglog(sql text, ts timestamptz,tbl name,usr text);

CREATE or REPLACE function log_changes() RETURNS trigger as $TLC$
declare
    sql text := current_query();
begin

    --( not shown: code here that blanks out password fileds in sql )

    if tg_op= 'INSERT'  then 
        insert into debuglog values (sql || e'\n -- NEW=' || NEW::text,now(),TG_RELNAME,current_user || coalesce( ' '||inet_client_addr(),'local'));
        raise log 'insert to % by % NEW=%',TG_RELNAME, current_user || coalesce( ' '||inet_client_addr(),'local'),NEW::text;
    elsif tg_op = 'DELETE'  then 
        insert into debuglog values (sql || e'\n -- OLD=' || OLD::text,now(),TG_RELNAME,current_user || coalesce( ' '||inet_client_addr(),'local'));
        raise log 'delete from % by % OLD=%',TG_RELNAME, current_user || coalesce( ' '||inet_client_addr(),'local'),OLD::text;
        return old;
    else
        raise log 'update to % by % OLD=% NEW=%',TG_RELNAME, current_user || coalesce( ' '||inet_client_addr(),'local'),OLD::text,NEW::text;
        insert into debuglog values ( sql || e'\n -- OLD=' || OLD::text || e'\n -- NEW=' || NEW::text,now(),TG_RELNAME,current_user || coalesce( ' '||inet_client_addr(),'local'));
    end if;
    return new;
end $TLC$
language plpgsql;

create trigger after update or insert or delete on logged_table for each row do also log_changes();

Я считаю, что добавление комментариев SQL к DML, который действует на таблицу, помогает мне найти проблемный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...