1

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

4

1 回答 1

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
于 2010-02-15T17:11:27.383 回答