Verhindern, Dass Insert-Trigger

Wie kann ich diese auslösen, um zu verhindern, dass das einfügen, wo der Fortschritt nicht größer als 0 oder kleiner als 100? Danke.

DROP TRIGGER CheckAdvance;
CREATE OR REPLACE TRIGGER CheckAdvance
BEFORE INSERT OR UPDATE OF advance ON titles
FOR EACH ROW
WHEN (new.advance<0 OR new.advance>100)
BEGIN
dbms_output.put_line('Advance is Invalid.');
END;
  • Ein trigger kann nicht die Tatsache ändern, dass der Einsatz tatsächlich passiert ist. Um das zu tun, warum verwenden nicht Sie eine schöne gesunde WHERE – Klausel in der insert-query?
  • Wenn dies ist eine design-Frage,Tim ‚ s Kommentar oben und @GordonLinoff Antwort unten sind beide hervorragend. Wenn, jedoch, dies ist eine Klasse Zuordnung (Hausaufgaben, oft Fragen die Schüler, Dinge zu tun, die nicht getan werden sollte, offenbar, weil denen der Unterricht in diesen Klassen haben nie genug Zeit, als die Entwickler zu wissen, gute und schlechte) können Sie eine Ausnahme auslösen, in den trigger, fangen Sie es in den Hauptteil des Codes, und ROLLBACK die Transaktion, so dass der insert. Beachten Sie, dass dies schlechte Praxis.
  • Ja, es war eine Klasse Frage. Ich denke, es kann in Bezug auf die RAISE_APPLICATION_ERROR.
  • Yep, das klingt wie das, was der Lehrer suchen. Beachten Sie, dass dies eine Schlechte Idee ist – nur weil Sie eine Ausnahme werfen, bedeutet nicht, dass die Transaktion wird ein Rollback ausgeführt (obwohl ich glaube, dass ist das Standardverhalten, wenn die Ausnahme unbehandelt).
InformationsquelleAutor Annihil8 | 2016-12-12

 

2 Replies
  1. 9

    „es war eine Klasse Frage.“

    Hatte ich ein Gespräch mit einem Hochschullehrer, der lehrte, PL/SQL, nachdem ich einen Vortrag auf einer Konferenz. Mein Vortrag war auf PL/SQL-gute Praxis; eines meiner Dias sagte einfach nur: „Don‘ T Trigger“. Der Dozent sagte mir, er findet eine solche Beratung schwer zu vereinbaren mit den Anforderungen des Lehrplans. Sie haben, um Ihre Schüler lehren, all die syntax aber er räumte ein, dass Sie oft Aufgaben, die geforderten Lösungen würden wir nicht verwenden, wenn das schreiben von software Professionell.

    Dies ist eine solche Frage. Der richtige Ansatz ist die Verwendung einer check-Einschränkung, als Gordon ‚ s Antwort zeigt. Einschränkungen sind effizienter und Redewendungen zu. Aber dein Lehrer will, dass du einen Auslöser schreiben, also hier ist 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;

    Punkte zu beachten:

    1. ERSTELLEN ODER zu ERSETZEN, bedeutet, wir können ändern Sie die trigger-code, ohne eine vorläufige DROP-Anweisung.
    2. BEGIN-und END-frame code-Blöcke wie trigger stellen.
    3. Statischen Bedingungen sind umrahmt mit IF … END IF-Schlüsselwörter; WENN ist zum verlassen des loop-Konstrukte.
    4. Referenz Tabelle Spalte Werte mit :NEUE (und :ALTE) keywords – beachten Sie den Doppelpunkt.
    5. Verwenden RAISE_APPLICATION_ERROR eine Ausnahme; der Fehler Zahl muss im Bereich -20999 zu -20000 die Oracle behält sich für Benutzer-definierte Ausnahmen.
    6. Machen Sie Ihre Fehlermeldung aussagekräftig: sagen Sie Benutzern, was Sie falsch gemacht haben, anstatt Sie erraten.
    7. Lernen, mit Einrückungen zu arbeiten, um Ihren code lesbar. Ihre zukünftigen Mitarbeiter werden es Ihnen danken.
  2. 7

    Sollten Sie nicht verwenden ein Auslöser für diese. Oracle (und SQL im Allgemeinen) unterstützt check-Einschränkungen:

    alter table titles
        add constraint chk_titles_advance check (advance > 0 and advance <= 100);

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.