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:
- Acesse a interface UTL_DB_SQL
- Copie e cole o SQL apresentado logo abaixo.
- Edite o SQL para filtrar os registros da LOGS_DADOS que deseja desfazer.
- Execute o SQL - O resultado será um script com os comandos que deverão ser executados.
- Copie e cole este script (utilize outra aba para não perder o SQL que produziu o script)
- Execute o script.
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.