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?

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top