Oracle 11, default value(localtimestamp) für timestamp Attribut in UTC

tplanitz

Erfahrenes Mitglied
Hallo Leute,

Kurzbeschreibung der Umgebung:

-- Zwei unabhängige Datenbanken A und B
-- A
läuft in UTC, also alle Zeitstempel werden in UTC abgespeichert
-- B wird über über Materialized Views Technik synchronisiert(mirrored)
-- An den Tabellen in B hängen Trigger die parrallel die Daten in B' Tabellen ablegen.
-- Die B' Tabellen besitzen ein TIMESTAMP(6) Attribut dessen default Value LOCALTIMESTAMP ist
-- B läuft in Berliner Zeit

Das Problem:

Die Zeistempel in den Tabellen B', die mit default Werten befüllt werden, bekommen nicht wie erwartet den Berliner Zeitstempel sondern werden mit UTC aktualisiert.

Meine Vermutung:

Kann es sein das DEFAULT value nicht vom Zielsystem abhängig ist sondern vom Vorsystem?
Kann mir jemand helfen?

Viele Grüße an Euch
 
Hallo Leute,

Ein bisschen bin ich weitergekommen.

Wie es aussieht wird der MView Mechanismus über JOBS gestartet die mit DBMS_JOB.SUBMIT angelegt wurden.

Wenn ich den Job ausführe auf einem System z.B. Windows 7 (Ich verbinde mich per SQLDeveloper, Zeitzone steht auf Berlin), so wird für das Attribut welches den DEFAULT LOCALTIMESTAMP verwendet, der korrekte Wert(TImestamp) gesetzt.

Verändere ich nun die Zeitzone des Windows 7 auf z.B. Darwin(UTC +9,5 hours) und starte den SQLDeveloper neu, wird LOCALTIMESTAMP zu UTC+9,5 hours, das bedeutet die Sessiontimezone ist also UTC+9,5 hours und setzt somit den Wert für LOCALTIMESTAMP.

eine gute Information zum EInstig in das Thema(LOCLATIMESTAMP, TIME ZONE etc.) ist hier zu finden:

http://stackoverflow.com/questions/8884545/oracle-10g-time-zone-confusion



Fazit: Die Session in der der JOB läuft entscheidet über den DEFAULT value für LOCALTIMESTAMP.
 
Hi,

die Lösung ist: Lege die Jobs in der Environment in der die dann auch laufen sollen, die Doku von Oracle sagt:
Quelle: http://docs.oracle.com/cd/B19306_01/server.102/b14231/scheduse.htm#i1009668
Auszug: The NLS environment of the job when it runs is that which was present at the time the job was created.

Das bedeutet, wenn die Datenbank vorher in UTC lief(und das darunter liegende Host-Betriebssysem) werden die Jobs in der falschen Zeitzone kreiert. Ein umstellen der NLS Parameter im Job reicht nicht.
Fazit: Wir legen also die Jobs in der gewünschten Zeitzone an und ebenso die DEFAULT Spalte.

Viele Grüße
 
Wenn man unbeding "localtimestamp" an den Objekten benutzen möchte, habe ich die folgende Lösung um die Aufrufe in Oracle Jobs in einer definierten Zeitzone laufen zu lassen:
set serveroutput on

DECLARE
jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT
(
job => jobno
,what => 'begin execute immediate ''ALTER SESSION SET time_zone = '''||'''Europe/Berlin'''||''' '' ; my_check; end;'
,next_date => SYSDATE
,interval => 'SYSDATE + 30/86400'
);
COMMIT;
dbms_output.put_line('Job-NR:'||jobno);
END;
/
 

Neue Beiträge

Zurück