2016-07-14 2 views
2

ich einen Trigger vor insert/update erstellt haben sich wie folgtNeuer Wert ist als alter Wert gleiche, wenn nicht für die Aktualisierung in Oracle vor Update-Trigger weitergegeben

CREATE OR REPLACE TRIGGER "AUDIT_TABLE_TRIG" BEFORE 
    INSERT OR UPDATE ON AUDIT_TABLE FOR EACH ROW BEGIN :NEW.LAST_MODIFIED_DATE:=SYSDATE; 
    IF :new.LAST_MODIFIED_BY = NULL THEN 
    :NEW.LAST_MODIFIED_BY :=SYS_CONTEXT('USERENV','OS_USER'); 
    END IF; 
END; 

Anforderung last_modified_by Wert gleich wie angemeldet zu aktualisieren war stattdessen in Benutzer Wenn last_modified_by den Wert null hat, nehmen Sie die Betriebssystem-Benutzer-ID. Als ich diese Tabelle von der Benutzeroberfläche aktualisierte, funktionierte es gut. Last modified by value wird als angemeldete Benutzer-ID angezeigt (wie sie in der update-Anweisung übergeben wurde). Aber wenn ich eine andere Spalte in AUDIT_TABLE von SQL Developer aktualisiert, : new.last_modified_by nie null stattdessen kommt es hat Wert gleich wie : old.last_modified_by

Que1- ich dieses Szenario nicht behandelt haben so gut wie

IF :new.LAST_MODIFIED_BY = NULL || :OLD.LAST_MODIFIED_BY !=SYS_CONTEXT('USERENV','OS_USER') THEN 
      :NEW.LAST_MODIFIED_BY :=SYS_CONTEXT('USERENV','OS_USER'); 
END IF; 

Gibt es andere gute Möglichkeit, die ich damit umgehen kann?

Que2: Ich stieß auf dieses Szenario und ich wurde überrascht. Ist es ein Standardverhalten für Oracle-Trigger, dass neue Variablen alte Werte haben, wenn sie während der Aktualisierung nicht geändert werden?

+1

'neue Variablen haben alte Werte, wenn sie beim Aktualisieren nicht geändert werden ... ... wenn der alte und der neue Wert gleich sind, ist das nicht das, was Sie logisch erwarten würden? –

+0

Wenn ich Spaltenwert nicht ändere, erwartete ich: neue .column ist null, da es nicht wirklich in dem Kontext ist, oder ich habe nichts als neuen Wert übergeben..aber sieht aus, wie ich dies beim Schreiben des Triggers vermisste. –

+2

': new.LAST_MODIFIED_BY = NULL' kann nicht das gewünschte Ergebnis liefern, also wäre die richtige Schreibweise': new.LAST_MODIFIED_BY ist NULL'. Aus meinen bisherigen Erfahrungen ist 'val = NULL' weniger verlässlich im Vergleich zu 'val is NULL' (oder' val is NOT NULL'). – Annjawn

Antwort

1

Verwenden Sie das UPDATING Prädikat, das wahrscheinlich Ihre Anforderung erfüllen würde.

+0

Es funktioniert..Vielen Dank :-) –

+0

Ich brauchte auch null Bedingung, also behandelte es als IF NOT UPDATING ('LAST_MODIFIED_BY') ODER : NEW.LAST_MODIFIED_BY ist NULL DANN : NEW.LAST_MODIFIED_BY: = SYS_CONTEXT ('USERENV', 'OS_USER'); ENDE IF; –

+0

großartig! das löst dein Problem. – hflzh

Verwandte Themen