在Oracle中,为什么current_timestamp有时会返回服务器时间,其他时候GMT?

时间:2010-02-10 17:10:23

标签: oracle9i toad

我有一个针对Oracle 9i数据库运行的Java应用程序。数据库具有触发器以创建审计记录,该记录跟踪对基本记录的更改。触发器使用current_timestamp。当我使用Java应用程序修改基本记录时,审计记录反映了GMT。但是,如果我使用Toad并更新基本记录,则审计记录将反映服务器时间(设置为本地时间)。查询current_timestamp会返回服务器时间。我似乎找不到导致差异的原因。那里有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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上运行时,我没有返回任何行,因此我的应用程序环境和数据库默认值之间没有差异。但是,当我从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