История записей Oracle с использованием отметки времени в диапазоне - PullRequest
3 голосов
/ 11 декабря 2008

Я недавно узнал, что у oracle есть особенность, которая была довольно полезна для меня - поскольку проектировщик / разработчик мало заботился об истории данных - я могу запросить историческое состояние записи, если она еще есть в кэше оракула как это:

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

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

Ответы [ 3 ]

8 голосов
/ 11 декабря 2008

Да, вот так:

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, и обычно это часы, а не дни.

2 голосов
/ 11 декабря 2008

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

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

0 голосов
/ 11 декабря 2008
SELECT *
  FROM sometable
  VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...