Jump to content
Fórum Script Brasil
  • 0

Trigger log de arquivos e registro


oxcompany

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.8k
×
×
  • Create New...