1

Oracle9iデータベースに対してJavaアプリケーションを実行しています。データベースには、基本レコードへの変更を追跡する監査レコードを作成するトリガーがあります。トリガーはcurrent_timestampを利用します。Javaアプリケーションでベースレコードを変更すると、監査レコードにGMTが反映されます。ただし、Toadを使用してベースレコードを更新すると、監査レコードにはサーバー時間(現地時間に設定されている)が反映されます。current_timestampをクエリすると、サーバー時間が返されます。違いの原因がわからないようです。そこに何かアイデアはありますか?

4

1 に答える 1

2

NLSパラメータ値は、セッション内(場合によってはログイントリガー)で設定するか、OS環境から継承するか、インスタンスの起動時に設定することができるため、追跡がやや困難になります。

次のクエリは、データベースからの分岐を示しています。この出力を2つの分岐環境から取得できる場合は、次のことが役立つ場合があります。

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

これをWindowsSQL* 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 に答える