2016-09-28 4 views
1

Ich habe diesen TriggerOracle-Trigger auf virtuelle Spalt in Abhängigkeit erzeugen falsche Daten

create or replace trigger upd_totprc_trg 
after insert or update or delete of total_price on sales_detail 
for each row 
declare 
v_diff number := 0; 
v_master number; 
begin 

if inserting then 
    v_master := :new.master_id; 
    v_diff := :new.total_price; 
elsif updating then 
    v_master := :new.master_id; 
    v_diff := :new.total_price - :old.total_price; 
elsif deleting then 
    v_master := :old.master_id; 
    v_diff := :old.total_price * -1; 
end if; 

update sales_master 
set value = value + v_diff 
where id = v_master; 
end; 
/

es die Änderungen in sales_detail.total_price berechnet und aktualisiert die sales_master.value.

ist die total_price Spalte eine virtuelle Spalte definiert als das Produkt aus Menge und unit_price. Wenn ich eine neue Detailzeile eingebe, scheint der Trigger den neuen berechneten Wert nicht zu erfassen, obwohl es ein after ist. Meine Frage ist: Bewirkt die Ausführung des virtuellen Spaltenausdrucks einen Konflikt mit dem Ausführen des Triggers? Beachten Sie, dass, wenn ich die total_price wieder als normale Spalte eingab, die richtigen Werte zurückgegeben wurden.

Ich bin mit Oracle 12c

Antwort

0

Ihr Auslöser ist für die Aktualisierung, einfügen oder auf virtuellen Spalte löschen. Diese Spalte wird jedoch nicht eingefügt oder aktualisiert. Es wird berechnet, wenn jemand Daten anfordert. Es ist also kein korrekter Wert, den Triogger auszulösen. Was mehr ist es nicht erlaubt, virtuelle Spalte zu aktualisieren oder einzufügen. ORA-54017: UPDATE operation disallowed on virtual columns wird erzeugt, wenn versucht wird, die virtuelle Spalte direkt zu aktualisieren.
Was Sie brauchen, ist Trigger auf Spalten, die Basis für die Berechnung von virtuellen (quantity und unit_price) sind. Dies ist eine offensichtliche Logik, dass, wenn jemand die Basiswerte ändert, auch das Ergebnis geändert wird.

Verwandte Themen