Oracle에서는 왜 current_timestamp가 때때로 서버 시간, 다른 시간에 GMT를 반환합니까?
문제
Oracle 9i 데이터베이스에 대해 Java 응용 프로그램이 실행됩니다. 데이터베이스에는 기본 레코드의 변경 사항을 추적하는 감사 레코드를 만들기위한 트리거가 있습니다. 트리거는 current_timestamp를 사용합니다. Java 응용 프로그램으로 기본 레코드를 수정하면 감사 레코드는 GMT를 반영합니다. 그러나 Toad를 사용하고 기본 레코드를 업데이트하면 감사 레코드는 서버 시간 (현지 시간으로 설정)을 반영합니다. 쿼리 current_timestamp 서버 시간을 반환합니다. 차이를 일으키는 원인을 찾을 수없는 것 같습니다. 거기에 아이디어가 있습니까?
해결책
NLS 매개 변수 값은 세션 내에서 설정하거나 (때로는 로그인 트리거 내에) OS 환경에서 상속되거나 인스턴스 시작에 설정하여 추적이 다소 까다로워집니다.
다음 쿼리는 데이터베이스의 발산을 보여 주며, 두 가지 분산 환경 에서이 출력을 얻을 수 있다면 다음과 같은 도움이 될 수 있습니다.
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에서 실행했을 때 행이 반환되지 않았으므로 응용 프로그램 환경과 데이터베이스 기본값간에 차이가 없었습니다. 그러나 유닉스 환경에서 실행했을 때 :
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
제휴하지 않습니다 StackOverflow