Oracle에서는 왜 current_timestamp가 때때로 서버 시간, 다른 시간에 GMT를 반환합니까?

StackOverflow https://stackoverflow.com/questions/2238782

  •  19-09-2019
  •  | 
  •  

문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top