создавать триггеры или правила при обновлении, удалять и вставлять, которые записывают подробности операции в файл журнала 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, который действует на таблицу, помогает мне найти проблемный код.