Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Insert-Trigger verhindern

Ich hatte ein Gespräch mit einem Universitätsdozenten, der PL/SQL lehrte, nachdem ich auf einer Konferenz einen Vortrag gehalten hatte. In meinem Vortrag ging es um bewährte PL/SQL-Praktiken; Eine meiner Folien sagte einfach "Don't use triggers". Der Dozent sagte mir, er finde es schwierig, solche Ratschläge mit den Anforderungen des Lehrplans zu vereinbaren. Sie müssen ihren Schülern die gesamte Syntax beibringen, aber er gab zu, dass sie oft Aufgaben stellten, die Lösungen erforderten, die wir beim professionellen Schreiben von Software nicht verwenden würden.

Das ist so eine Frage. Der richtige Ansatz ist die Verwendung einer Check-Einschränkung, wie Gordons Antwort zeigt . Constraints sind effizienter und auch idiomatisch. Aber dein Lehrer möchte, dass du einen Trigger schreibst, also ist hier dein Code, korrigiert.

CREATE OR REPLACE TRIGGER CheckAdvance
    BEFORE INSERT OR UPDATE OF advance ON titles
    FOR EACH ROW
BEGIN
    IF (:new.advance < 0  
         OR :new.advance > 100)
    THEN
        raise_application_error(-20000
                , 'Advance cannot be less than zero or greater than one hundred.');
    END IF;
END;

Zu beachtende Punkte:

  1. CREATE OR REPLACE bedeutet, dass wir den Triggercode ohne vorherige DROP-Anweisung ändern können.
  2. BEGIN- und END-Frame-Codeblöcke wie Trigger-Bodys.
  3. Statische Bedingungen werden mit IF ... END IF-Schlüsselwörtern eingerahmt; WHEN dient zum Beenden von Schleifenkonstrukten.
  4. Referenziere Tabellenspaltenwerte mit :NEW (und :OLD) Schlüsselwörtern - beachte den Doppelpunkt.
  5. Verwenden Sie RAISE_APPLICATION_ERROR, um eine Ausnahme auszulösen; die Fehlernummer muss im Bereich -20999 bis -20000 liegen, den Oracle für benutzerdefinierte Ausnahmen reserviert.
  6. Machen Sie Ihre Fehlermeldung aussagekräftig:Sagen Sie Ihren Benutzern, was sie falsch gemacht haben, anstatt sie raten zu lassen.
  7. Lernen Sie, wie Sie Einrückungen verwenden, um Ihren Code lesbar zu machen. Ihre zukünftigen Mitarbeiter werden es Ihnen danken.