2010-02-10 41 views
1

我有一個針對Oracle 9i數據庫的Java應用程序。該數據庫具有創建審計記錄的觸發器,該記錄跟蹤對基記錄的更改。觸發器使用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

亞當 - 非常感謝你。這非常有用。對不起,我不能增加「這個答案很有用」的反擊 - 我還沒有足夠的聲望。 – Jim 2010-02-16 18:51:28

相關問題