У меня есть приложение Java, работающее с базой данных Oracle 9i. В базе данных есть триггер для создания записи аудита, которая отслеживает изменения в базовой записи. Триггер использует current_timestamp. Когда я изменяю базовую запись с помощью приложения Java, запись аудита отражает GMT. Однако, если я использую Toad и обновляю базовую запись, запись аудита отражает время сервера (которое установлено на локальное время). Запрос current_timestamp возвращает время сервера. Кажется, я не могу найти причину разницы. Есть идеи?В Oracle, почему current_timestamp иногда возвращает время сервера, другие GMT?
1
A
ответ
2
Значения параметров 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
Adam - спасибо ОЧЕНЬ много. Это очень полезно. Извините, я не могу увеличить счетчик «Этот ответ полезен». У меня пока нет достаточной репутации. – Jim