В Oracle, почему current_timestamp иногда возвращает серверное время, в другое время GMT?
Вопрос
У меня есть Java-приложение, работающее с базой данных Oracle 9i.В базе данных есть триггер для создания записи аудита, который отслеживает изменения в базовой записи.Триггер использует current_timestamp.Когда я изменяю базовую запись с помощью Java-приложения, запись аудита отражает GMT.Однако, если я использую Toad и обновляю базовую запись, запись аудита отражает время сервера (которое установлено на местное время).Запрос current_timestamp возвращает серверное время.Кажется, я не могу понять, в чем причина этой разницы.Есть какие-нибудь идеи?
Решение
Значения параметров NLS могут быть установлены в течение сеанса (иногда в триггере входа в систему), унаследованы из среды операционной системы или установлены при запуске экземпляра, что несколько усложняет их отслеживание.
Следующий запрос показывает расхождение с базой данных, и если вы можете получить этот вывод из ваших двух отличающихся сред, это может помочь:
SELECT * FROM
(
SELECT PARAMETER,
VALUE AS SESSION_VALUE,
(SELECT VALUE FROM NLS_INSTANCE_PARAMETERS NIP
WHERE NIP.PARAMETER = NSP.PARAMETER) INSTANCE_VALUE,
(SELECT VALUE FROM NLS_DATABASE_PARAMETERS NDP
WHERE NDP.PARAMETER = NSP.PARAMETER) DATABASE_VALUE
FROM NLS_SESSION_PARAMETERS NSP
)
WHERE NVL(INSTANCE_VALUE, DATABASE_VALUE) <> DATABASE_VALUE
OR NVL(SESSION_VALUE, NVL(INSTANCE_VALUE, DATABASE_VALUE)) <> DATABASE_VALUE
Когда я запустил это в Windows SQL * Plus, я не получил возвращенных строк, так что не было никаких различий между средой моего приложения и базой данных по умолчанию.Однако, когда я запустил его из среды Unix:
PARAMETER SESSION_VALUE INSTANCE_VALUE DATABASE_VALUE
------------------------- ------------------------- ------------------------- -------------------------
NLS_DATE_FORMAT YYYY-MM-DD HH24:MI:SS DD-MON-RR
NLS_TIMESTAMP_TZ_FORMAT YYYY-MM-DD HH24:MI:SS.FF DD-MON-RR HH.MI.SSXFF AM
TZH:TZM TZR