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