Ir para conteúdo
Fórum Script Brasil
  • 0

Como descobrir qual tabela um registro foi incluido ou modificado [fechada]


Thiago Machado Alves

Pergunta

1 resposta a esta questão

Posts Recomendados

  • 0

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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...