Bom dia,

Eu costumo utilizar uma trigger que registra todos os campos de todas as
alterações (insert, update, delete), bem como a data, query, operação e
usuário.

# criar plpgsql se já não existir:
create language plpgsql;

# criar função que executará o log:
create or replace function log_tabela_a() returns trigger as $$
begin
if TG_OP = 'INSERT' or TG_OP = 'UPDATE' then
insert into
tabela_b(data_log,operacao_log,query_log,user_log,campo1,campo2,etc) values
(now(), TG_OP, current_query(), current_user, new.campo1, new.campo2,
new.etc);
return new;
elseif TG_OP = 'DELETE' then
insert into
tabela_b(data_log,operacao_log,query_log,user_log,campo1,campo2,etc) values
(now(), TG_OP, current_query(), current_user, old.campo1, old.campo2,
old.etc);
return old;
end if;
exception
when others then
raise warning 'LOG EXCEPTION (tabela_b) %; %',SQLERRM,current_query();
if TG_OP = 'INSERT' or TG_OP = 'UPDATE' then
return new;
elseif TG_OP = 'DELETE' then
return old;
end if;
end;
$$ language plpgsql;

# criar trigger que executará a função acima:
create trigger log_tabela_a
before insert or update or delete on tabela_a
for each row
execute procedure log_tabela_a();


---------------

Agora se você deseja filtrar apenas os campos que realmente são alterados
você pode utilizar o recurso abaixo:

if new.campo1 <> old.campo1 then insert into tabela_b(campo)
values(new.campo); end if

Atenciosamente,

Alessandro Lima
[email protected]
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a