2016-05-22 10 views
3

Ich versuche, einen einfachen Trigger in SQL Developer zu erstellen, um die Änderung des Gehalts anzuzeigen, wenn esSQL-Trigger zeigen Gehaltsänderung

CREATE OR REPLACE TRIGGER salary_changes 
BEFORE DELETE OR INSERT OR UPDATE ON FACULTY 
FOR EACH ROW 

DECLARE 
    sal_diff NUMBER; 

BEGIN 
    sal_diff := :NEW.F_SALARY - :OLD.F_SALARY; 

    DBMS_OUTPUT.PUT_LINE('Difference: ' || sal_diff); 
END; 

geändert wird, wenn ich versuche, den Auslöser zu laufen fordert es sein bindet eingeben für NEW und OLD und wenn ich versuche, ein Update zu starten, um zu sehen, ob es funktioniert, sagt es den Trigger fehlgeschlagen. Also, wie verwende ich die alten und neuen Tags falsch? oder ist das nicht das Problem

Antwort

0

Es gibt mehrere Probleme mit Ihrem Code.

  1. Sie müssen einen After-Trigger anstelle des Before-Triggers erstellen.

  2. Sie versuchen, einen Trigger zu schreiben, der eine Operation für Einfügen, Löschen oder Aktualisieren ausführt. Sie sollten also die bedingten Prüfungen (z. B. wenn Einfügen, Löschen oder Aktualisieren) Klausel. Wenn Sie löschen, gibt es auch keinen neuen Wert, sondern nur den alten Wert.

würde ich Ihre Trigger wie unten ändern ..

CREATE OR REPLACE TRIGGER salary_changes 
AFTER DELETE OR INSERT OR UPDATE ON FACULTY 
FOR EACH ROW 

DECLARE 
    sal_diff NUMBER; 
BEGIN 
If (INSERTING or UPDATING) then 
    sal_diff := :NEW.F_SALARY - :OLD.F_SALARY; 
    DBMS_OUTPUT.PUT_LINE('Difference: ' || sal_diff); 
    END IF; 

IF DELETING THEN 
    DBMS_OUTPUT.PUT_LINE('The deleted value is:' || :OLD.F_SALARY); 
END IF; 
END; 
+0

Ich versuchte es die Umsetzung wie du gesagt hast. Es lief erfolgreich, aber wenn ich die Daten aktualisiere, kommt nichts in Verbindung mit dem Auslöser. es sagt nur etwas wie "5 Zeilen aktualisiert." und nichts über einen Trigger – user3441417

+0

Ich habe die Verbindung in dbms-Ausgabe nicht hinzugefügt, so dass ich es nicht sehen konnte danke – user3441417