2010-02-10 3 views
1

У меня есть приложение Java, работающее с базой данных Oracle 9i. В базе данных есть триггер для создания записи аудита, которая отслеживает изменения в базовой записи. Триггер использует current_timestamp. Когда я изменяю базовую запись с помощью приложения Java, запись аудита отражает GMT. Однако, если я использую Toad и обновляю базовую запись, запись аудита отражает время сервера (которое установлено на локальное время). Запрос current_timestamp возвращает время сервера. Кажется, я не могу найти причину разницы. Есть идеи?В Oracle, почему current_timestamp иногда возвращает время сервера, другие GMT?

ответ

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 
+0

Adam - спасибо ОЧЕНЬ много. Это очень полезно. Извините, я не могу увеличить счетчик «Этот ответ полезен». У меня пока нет достаточной репутации. – Jim