Thiago Machado Alves Postado Março 9, 2022 Denunciar Share Postado Março 9, 2022 (editado) Existe meio de descobrir via consulta qual tabela em um banco de dados sofreu alteração de Update ou Insert em Postgresql? Editado Março 9, 2022 por Thiago Machado Alves Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Ronivaldo Lopes Postado Março 19, 2022 Denunciar Share Postado Março 19, 2022 Boa tarde, você pode criar uma única tabela de log e criar uma trigger genérica que seja disparada por todas as tabelas do sistema, sem afetar as triggers já existentes. No meu caso o campo chave de todas as tabelas é o id, e no update incluo na tabela de log dois registros, o antes e o depois de atualizado, e somente o id e os campos que foram modificados. Para facilitar pode fazer o update igual a insert. create table generic_log ( tabela text not null, usuario text not null default current_setting('app.user_name'), ip_address text not null default current_setting('app.ip_address'), mac_address text not null default current_setting('app.mac_address'), data_hora timestamp not null default now(), operacao char not null check (operacao in ('I', 'U', 'D')), dados jsonb not null ) with (oids=false); create index generic_log_ind on generic_log using brin (tabela); create or replace function check_generic_log() returns trigger as $$ begin if tg_op = 'DELETE' then insert into public.generic_log ( tabela, operacao, dados ) values ( tg_table_name, tg_op::char, to_jsonb(old) ); elseif tg_op = 'INSERT' then insert into public.generic_log ( tabela, operacao, dados ) values ( tg_table_name, tg_op::char, to_jsonb(new) ); else insert into public.generic_log (tabela, operacao, dados) select tg_table_name, tg_op::char, jsonb_object_agg( o.key, o.value ) from jsonb_each( to_jsonb( old ) ) o join jsonb_each( to_jsonb( new ) ) n on o.key = n.key where (o.key = 'id' or o.value <> n.value) and (o.key not in ( 'XXX','YYY' )); insert into public.generic_log (tabela, operacao, dados) select tg_table_name, tg_op::char, jsonb_object_agg( n.key, n.value ) from jsonb_each( to_jsonb( old ) ) o join jsonb_each( to_jsonb( new ) ) n on o.key = n.key where (o.key = 'id' or o.value <> n.value) and (o.key not in ( 'XXX','YYY' )); end if; return null; end; $$ language plpgsql; create trigger log_generic after insert or update or delete on tabela_a for each row execute function check_generic_log(); create trigger log_generic after insert or update or delete on tabela_b for each row execute function check_generic_log(); create trigger log_generic after insert or update or delete on tabela_c for each row execute function check_generic_log(); Executar o comando anterior para todas as tabelas do sistema. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Thiago Machado Alves
Existe meio de descobrir via consulta qual tabela em um banco de dados sofreu alteração de Update ou Insert em Postgresql?
Editado por Thiago Machado AlvesLink para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.