История записей Oracle с использованием временной метки в пределах диапазона

StackOverflow https://stackoverflow.com/questions/359733

Вопрос

Недавно я узнал, что у Oracle есть функция, которая была для меня очень полезной - поскольку разработчик/разработчик не особо заботился об истории данных - я могу запросить историческое состояние записи, если она еще доступна в кеше Oracle, вот так:

select * 
  from ( select * 
           from sometable where some_condition ) 
as of timestamp sysdate-1 

Но теперь мне нужно проверить исторические данные в определенном диапазоне.Возможно ли это как-нибудь, используя кэш?

Это было полезно?

Решение

Да, вот так:

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

Обратите внимание: насколько далеко назад вы можете вернуться, ограничен параметром UNDO_RETENTION и обычно составляет часы, а не дни.

Другие советы

Следует иметь в виду, что такого рода ретроспективные запросы основаны на информации UNDO, которая записывается в табличное пространство UNDO.И эта информация не сохраняется навсегда — большинство производственных систем при разумной нагрузке не будут иметь доступной 24 часа информации об отмене.

В зависимости от версии Oracle вам может потребоваться установить UNDO_RETENTION установите параметр на значение, превышающее период времени, через который вы пытаетесь выполнить флэшбек.

SELECT *
  FROM sometable
  VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp

предоставит вам все версии всех строк за последний день.

С этим вы можете сделать гораздо больше.Проверьте документация (возможно, вы захотите найти документацию для вашей версии).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top