ich mit MTO darüber einig, dass eine solche Validierungen von Anwendungscode verarbeitet werden (über eine gespeicherte Prozedur). Wenn Sie jedoch darauf bestehen, diese Validierung über die Datenbank durchzuführen, ist der folgende Trigger hilfreich. Auch hier empfehle ich diese Lösung nicht, und der beste Weg wäre, sie mit Anwendungslogik zu behandeln.
CREATE OR REPLACE TRIGGER trg_val_lock_dt
BEFORE INSERT ON issue
FOR EACH ROW
DECLARE
v_is_valid CHAR(1);
BEGIN
v_is_valid := 'Y';
SELECT 'N' INTO v_is_valid
FROM subscriber s
WHERE :NEW.subscr_id = s.subscr_id
AND :NEW.taken BETWEEN s.lock_date AND (s.lock_date + lock_period);
RAISE_APPLICATION_ERROR(-20001,'The subscriber is locked');
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
Der obige Trigger wird vor jedem Einsatz Feuer in der Ausgabe Tabelle. Es wird geprüft, ob das eingegebene Datum zwischen dem Sperrdatum und dem Sperrdatum + Sperrzeitraum liegt (was das Sperrenddatum wäre). Wenn ein solcher Datensatz gefunden wird, wird der folgende Fehler ausgegeben und die Zeile wird nicht eingefügt.
ORA-20001: The subscriber is locked
ORA-06512: at "RETAIL_1.TRG_VAL_LOCK_DT", line 12
Wenn die Bedingung nicht erfüllt ist, dann wird die keine Daten gefunden Ausnahme ausgelöst werden, wenn der Auslöser nichts tun wird, und die Zeile eingefügt wird.
Es funktioniert gut für das Einfügen einer neuen Zeile in Tabelle, aber wenn ich versuche, Buch (oder ein anderes Update) zurückzugeben, bekomme ich ORA-04091 Tabelle mutiert Fehler. Kann ich diesen Fehler umgehen oder ist das eine Begrenzung des Triggers? – JGDger
Aber der Auslöser sollte nur auf Einsatz auslösen. Feuert es auf Update ab? –
Ja, Fehler wirft auf Update und ich verstehe nicht warum – JGDger