história do registro Oracle usando como de timestamp dentro de uma faixa
Pergunta
Eu aprendi recentemente que a Oracle tem uma característica que foi muito útil para mim - como o designer / implementador não se importava muito sobre a história de dados - eu posso consultar o estado histórico de um registro se ele está disponível ainda no cache Oracle, assim:
select *
from ( select *
from sometable where some_condition )
as of timestamp sysdate-1
Mas agora eu preciso verificar os dados históricos dentro de uma faixa. É possível qualquer forma, usando o cache?
Solução
Sim, como este:
SQL> select sal from emp where empno=7369;
SAL
----------
5800
SQL> update emp set sal = sal+100 where empno=7369;
1 row updated.
SQL> commit;
Commit complete.
SQL> update emp set sal = sal-100 where empno=7369;
1 row updated.
SQL> commit;
Commit complete.
SQL> select empno, sal, versions_starttime,versions_xid
2 from emp
3 versions between timestamp sysdate-1 and sysdate
4 where empno=7369;
EMPNO SAL VERSIONS_STARTTIME VERSIONS_XID
---------- ---------- --------------------------------------------------------------------------- --
7369 5900 11-DEC-08 16.05.32 0014001300002A74
7369 5800 11-DEC-08 16.03.32 000D002200012EB1
7369 5800
Note que quão longe você pode ir é limitada pelo parâmetro UNDO_RETENTION, e será tipicamente horas em vez de dias.
Outras dicas
Uma nota para estar ciente de que este tipo de consulta de flashback depende de informações UNDO que está escrito à tabela de undo. E que a informação não é retido sempre-- a maioria dos sistemas de produção sob carga razoável não vão ter 24 horas de informações UNDO disponíveis.
Dependendo da versão do Oracle, pode ser necessário definir o parâmetro UNDO_RETENTION
para um valor maior do que o período de tempo que você está tentando recapitular completamente.
SELECT *
FROM sometable
VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp
lhe dará todas as versões de todas as linhas no último dia.
Há muito mais você pode fazer com isso. Confira o documentação (você pode querer para encontrar a documentação para sua versão).