пятница, 23 декабря 2011 г.

Oracle: небольшая помощь для отладки и тестирования

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

То, насколько легко решить данную задачу , зависит от архитектуры конкретного приложения и среды его выполнения.

Каждый ухищряется по-своему : самодельные заглушки, перевод системного времени и т.д. и т.п..

На случай , если Ваше приложение работает с СУБД Oracle, то наверняка при этом использует функцию sysdate этой самой СУБД (если , конечно, вы не изобрели свой "велосипед").
sysdate возвращает текущее дату-время на сервере, где запущен данный инстанс Oracle.
Создатели Oracle пошли на встречу разработчикам и тестировщикам , реализовав возможность активации режима, при котором sysdate будет возвращать фиксированную дату до тех пор, пока этот режим не будет деактивирован.

Вот как заставить sysdate возвращать фиксированную дату:
ALTER SYSTEM SET fixed_date = '2011-12-31 23:59:59';

А вот так все можно "вернуть вернуть на место":
ALTER SYSTEM SET fixed_date=NONE

Плюсы:

1. легко включается и отключается
2. не влияет на системное время ОС

Минусы:

Условный минус по сути вижу один - это особенность, на которую не все сразу обращают внимание:
Данный трюк работает на уровне "системы" , а не "сессии" и меняет поведение sysdate для всего инстанса. Соответственно, необходимо не забывать "возвращать на место" и вообще отдавать себе в этом отчет, если это инстанс может одновременно использоваться несколькими пользователями.