In Oracle, warum zurückkehren current_timestamp manchmal Serverzeit, andere Zeiten GMT?
Frage
Ich habe eine Java-Anwendung ausgeführt wird für eine Oracle-9i-Datenbank. Die Datenbank verfügt über einen Trigger ein Auditprotokoll zu erstellen, die Änderungen an die Basisaufzeichnungsspuren. Der Trigger nutzt current_timestamp. Als ich den Basissatz mit der Anwendung Java ändern, spiegelt der Prüfsatz GMT. wenn ich Toad jedoch verwenden und die Basis Datensatz aktualisieren, spiegelt der Prüfsatz Serverzeit (die lokale Zeit eingestellt ist). Abfragt current_timestamp kehrt Serverzeit. Ich kann nicht scheinen zu finden, was den Unterschied verursacht. Irgendwelche Ideen da draußen?
Lösung
NLS Parameterwerte können innerhalb einer Sitzung (manchmal in einem Login-Trigger), geerbt von der OS-Umgebung oder Satz an Startinstanz eingestellt werden, was sie aufzuspüren macht etwas heikel.
Die folgende Abfrage zeigt Abweichungen von der Datenbank, und wenn Sie diese Ausgabe von Ihren zwei divergierende Umgebungen zu bekommen, kann es helfen:
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
Als ich lief, dass auf einem Windows SQL * Plus, ich habe keine Zeilen zurückgegeben, so gab es keine Unterschiede zwischen meiner Anwendungsumgebung und dort Datenbank Standardwerten. Allerdings, wenn ich laufe es von einer Unix-Umgebung:
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