sql >> Databasteknik >  >> RDS >> Oracle

Förhindra Insert Trigger

Jag fick en pratstund med en universitetslektor som undervisade i PL/SQL efter att jag höll en presentation på en konferens. Mitt föredrag handlade om PL/SQL god praxis; en av mina bilder sa helt enkelt "Använd inte triggers". Föreläsaren sa till mig att han tycker att sådana råd är svåra att förena med läroplanens behov. De måste lära sina elever all syntax, men han medgav att de ofta ställer uppgifter som krävde lösningar som vi inte skulle använda när vi skrev programvara professionellt.

Det här är en sådan fråga. Det korrekta tillvägagångssättet är att använda en kontrollbegränsning, vilket Gordons svar visar . Begränsningar är mer effektiva och även idiomatiska. Men din lärare vill att du ska skriva en trigger, så här är din kod, korrigerad.

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;

Punkter att notera:

  1. SKAPA ELLER ERSÄTT betyder att vi kan ändra triggerkoden utan en preliminär DROP-sats.
  2. BEGIN och END ramblock med kod som triggerkroppar.
  3. Statiska villkor är inramade med IF ... END IF nyckelord; WHEN är för att avsluta loopkonstruktioner.
  4. Referenstabellens kolumnvärden med :NEW (och :OLD) sökord - notera kolonet.
  5. Använd RAISE_APPLICATION_ERROR för att skapa ett undantag; felnumret måste vara i intervallet -20999 till -20000 som Oracle reserverar för användardefinierade undantag.
  6. Gör ditt felmeddelande meningsfullt:berätta för dina användare vad de gjorde fel istället för att få dem att gissa.
  7. Lär dig använda indrag för att göra din kod läsbar. Dina framtida medarbetare kommer att tacka dig för det.


  1. Vad är standardnamnet för begränsningar i SQL Server?

  2. Hur man hanterar databasutvecklingar i Play Framework 2 i produktionen

  3. MySQL skiftlägeskänslighetstabellnamn på MacOS med skiftlägesokänsligt filsystem

  4. Konstruera en fråga för att skapa tabeller