История записей Oracle с использованием временной метки в пределах диапазона
Вопрос
Недавно я узнал, что у 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
предоставит вам все версии всех строк за последний день.
С этим вы можете сделать гораздо больше.Проверьте документация (возможно, вы захотите найти документацию для вашей версии).