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

Trigger log de arquivos e registro


oxcompany

Pergunta

Boa noite,
Gostaria de saber se alguém já fez um esquema de log para todas as tabelas, analizando o old e new através da trigger? bom eu consegui fazer mas estou com um problema hahah
Quando eu passo o OLD para string e depois a string passo para array a função passa como separador é a virgula , o problema é se em algum campo eu coloco virgula no texto ele quebra tb como array e ai o arquivo que tenho 10 campos vai para 11 , queria ver se tem como ler o OLD como for QrDados in OLD algo assim e dar um loop.
Obrigado, se alguém quiser a função depois para ver eu coloco aqui no grupo.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Boa noite, uso uma trigger genérica para gravar o log de todas as tabelas, uso o tipo de dados jsonb para gravar os campos, e para o arquivo de índice, uso o índice do tipo brin que ocupa pouco espaço no disco, principalmente para tabelas com muitos registros.

Todas as tabelas tem com chave o campo id, e para comandos update, são gravados somente são os campos que foram atualizados, antes e depois de atualizados, nos campos dados1 e dados2.

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')),
  dados1 jsonb not null,
  dados2 jsonb null
);
 
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 = 'INSERT' then
    insert into _generic_log ( tabela, operacao, dados1 )
      select tg_table_name, tg_op::char, jsonb_object_agg( n.key, n.value )
        from jsonb_each( to_jsonb( new ) ) n;
  elseif tg_op = 'DELETE' then
    insert into _generic_log ( tabela, operacao, dados1 )
      select tg_table_name, tg_op::char, jsonb_object_agg( o.key, o.value )
        from jsonb_each( to_jsonb( old ) ) o;        
  else
    insert into _generic_log (tabela, operacao, dados1, dados2 )  
      select tg_table_name, tg_op::char, jsonb_object_agg( n.key, n.value ), jsonb_object_agg( o.key, o.value )
        from jsonb_each( to_jsonb( new ) ) n
        join jsonb_each( to_jsonb( old ) ) o on n.key = o.key
        where (n.key = 'id') or (coalesce(n.value, o.value) is distinct from coalesce(o.value, n.value));  
        
        -- where (n.key = 'id' or n.value is distinct from o.value) and (n.key not in ( 'XXX','YYY' ));              
  end if;
 
  return null;
end;
$$ language plpgsql;

-- ***************************************************
do
$$
  declare _comando text;  
  declare _obj record;
begin  
  for _obj in select schemaname as schema, relname as tabela from pg_stat_user_tables loop

    -- insert or delete
    
    execute format('drop trigger if exists log_generic on %s;', ( _obj.schema || '.' || _obj.tabela));
    execute format('create trigger log_generic after insert or delete on %s for each row execute function check_generic_log();', ( _obj.schema || '.' || _obj.tabela));
    
    -- update --> somente se houve alteração ==> for each row WHEN (old.* is distinct from new.*)  
    execute format('drop trigger if exists log_generic_update on %s;', ( _obj.schema || '.' || _obj.tabela));
    execute format('create trigger log_generic_update after update on %s for each row WHEN (old.* is distinct from new.*) execute function check_generic_log();', ( _obj.schema || '.' || _obj.tabela));
  end loop;
end;
$$

 

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
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...