sql >> Database teknologi >  >> RDS >> Oracle

Forhindre indsættelsesudløser

Jeg fik en snak med en universitetslektor, der underviste i PL/SQL, efter jeg holdt et oplæg på en konference. Min tale var om PL/SQL god praksis; en af ​​mine slides sagde simpelthen "Brug ikke triggere". Forelæseren fortalte mig, at han finder sådanne råd svære at forene med læseplanens behov. De skal lære deres elever al syntaks, men han indrømmede, at de ofte stillede opgaver, som krævede løsninger, som vi ikke ville bruge, når de skrev software professionelt.

Det er sådan et spørgsmål. Den korrekte tilgang er at bruge en kontrolbegrænsning, som Gordons svar viser . Begrænsninger er mere effektive og også idiomatiske. Men din lærer vil have dig til at skrive en trigger, så her er din kode, rettet.

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;

Bemærkninger:

  1. CREATE OR REPLACE betyder, at vi kan ændre triggerkoden uden en foreløbig DROP-sætning.
  2. BEGIN- og END-rammeblokke med kode, såsom udløserlegemer.
  3. Statiske betingelser er indrammet med IF ... END IF nøgleord; WHEN er til at afslutte sløjfekonstruktioner.
  4. Referencetabelkolonneværdier med :NEW (og :OLD) søgeord - bemærk kolonet.
  5. Brug RAISE_APPLICATION_ERROR til at kaste en undtagelse; fejlnummeret skal være i området -20999 til -20000, som Oracle reserverer for brugerdefinerede undtagelser.
  6. Gør din fejlmeddelelse meningsfuld:Fortæl dine brugere, hvad de gjorde forkert i stedet for at få dem til at gætte.
  7. Lær at bruge indrykning til at gøre din kode læsbar. Dine fremtidige medarbejdere vil takke dig for det.


  1. MySQL-korreleret underforespørgsel i JOIN-syntaks

  2. Perl DBI uden adgang til databasen

  3. Mysql vs sql express server (HEX -> bigint og bigint -> HEX konvertering)

  4. SQL:Vælg transaktioner, hvor rækker ikke er af kriterier i samme tabel