Logs de dados

Como desfazer operações realizadas no sistema

RTLOG.LOGS_DADOS.FAQ-99381
Esta FAQ explica como gerar um script DML para desfazer operações registradas nos LOGs do sistema.

Em casos extremos em que desejamos desfazer/restaurar/recuperar um conjunto de operações realizadas incorretamente no sistema, podemos proceder da seguinte forma:
item dml text_html;

select case when comando = 'U' then 
'update ' || tabela || '<br> set '
|| replace(
     replace(
       replace(valores_antigos,chr(10),'''<br>, ')
       ,'=',' = ''')
     ,'%0d%0a', '''||chr(10)||chr(13)||''')
|| '''<br> where id = ' || registro_id || ';'
when comando = 'I' then
'delete from ' || tabela || ' where id = ' || registro_id || ';'  
when comando = 'D' then
'insert into ' || tabela || (
   select ' (' || colunas || ') values (' || valores || ');'
   from (
       select array_to_string(array_agg(q.key),', ') as colunas
       , array_to_string(array_agg(''''||q.value||''''),', ') as valores
       , max(id) as id
       from (
           select *
           from (
               select substr(expr, 1, position('=' in expr)-1 ) as key
               , substr(expr, position('=' in expr) + 1) as value
               , id
               from (
                   select unnest(string_to_array(valores_antigos,chr(10))) as expr
                   , id
                   from logs_dados m
                   where m.id = l.id
               ) q
           ) q
           where length(value) > 0
       ) q
   ) q
   )
else
' SOMENTE OPERACOES DE INSERT/UPDATE/DELETE SÃO SUPORTADAS;'  
end as dml
from logs_dados l
-- EDITE O FILTRO ABAIXO
where transacao_id = 99999
and data_origem between '2019-05-31 16:02:01' and '2019-05-31 16:02:01'
and usuario = 'fulano'
-- IMPORTANTE MANTER A ORDENAÇÃO INVERSA A DA EXECUÇÃO ORIGINAL
order by l.id desc;

Atenção
Este procedimento irá desfazer apenas as alterações na base de dados do sistema. É importante sempre avaliar também outras operação foram geradas incorretamente, tais como envio de e-mails, impressões, integração com sistemas externos, etc e que terão de ser desfeitas ou anuladas de alguma forma.

Note que pode não ser possível desfazer determinadas operações. Basta, por exemplo, que alguma outra entidade esteja fazendo referência para uma dos elementos que o script esteja tentando excluir.

Além disso, é importante avaliar possíveis consequências que podem ter sido causadas durante o período que os dados estavam incorretos na base. Os dados poderiam, por exemplo ter gerado pedidos com preços incorretos, documentos fiscais com tributação incorreta, etc.