Direct naar de hoofdinhoud
Module 12 · Les 3 van 447/57 in de cursus~15 min
Modulelessen (3/4)

Inleiding tot triggers

Een trigger is een magische doos (een sensor) die automatisch een stukje logica uitvoert VOOR of NA een gebeurtenis invoegen, bijwerken of verwijderen in de gegevens.\nVoordat we een tabel leren reageren, moeten we deze echter een speciale "Trigger-functie" geven, geschreven in PL/pgSQL, die moet eindigen met het retourneren van een synthetisch formaat genaamd "TRIGGER".

Deze functies accepteren geen normale argumenten tussen haakjes; in plaats daarvan bieden ze gratis de magische ingebouwde objecten NEW en OLD aan, die de originele of binnenkomende rijgegevens bevatten uit de tabel die de sensor in de gaten houdt!

SQL
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
  -- OLD.id is magically the id value of the poor record being deleted
  INSERT INTO audit_log (table_name, record_id, action)
  VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');

  RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;

Deze procedure doet het zware werk van het schrijven naar het logboek. Later, in een tweede stap, zal het permanent worden aangesloten op de gebeurtenissen van de tafel die we willen beschermen.

Probeer het zelf

Oefening#sql.m12.l3.e1
Pogingen: 0Laden…

We moeten klanten beschermen: niemand jonger dan 18 jaar (onze virtuele controle) of, afgezien van de fictieve logica, willen we ervoor zorgen dat de string 'voornaam' die op het moment van INSERT wordt doorgegeven, altijd in hoofdletters in de database wordt opgeslagen, waarbij eventuele JS-clientopmaak wordt genegeerd.\nSchrijf een triggerfunctie met de naam 'force_uppercase_name()'. Het accepteert geen () argumenten.\nHet retourneert TRIGGER. Maak de hoofdtekstsjabloon.\nWijs het gehele binnenkomende object geforceerd toe via de magische opdracht 'NEW.first_name = UPPER(NEW.first_name);'. RETURN vervolgens de opnieuw vormgegeven NIEUWE variabele.

Editor laden…
Toon hint

FUNCTIE MAKEN OF VERVANGEN force_uppercase_name() RETOURNEERT TRIGGER ALS $$ BEGIN NIEUW.first_name = UPPER(NEW.first_name); RETOURNIEUW; EINDE; $$ TAAL plpgsql;

Oplossing beschikbaar na 3 pogingen

Oefening#sql.m12.l3.e2
Pogingen: 0Laden…

Maak een triggerfunctie 'protect_price_drops()' die kwaadaardige updates blokkeert waarbij een aanvaller op het punt staat een belachelijk lage prijs op een product te besparen.\nGebruik logica zoals 'IF NEW.unit_price < OLD.unit_price THEN', waardoor een native uitzondering wordt gegenereerd die ervoor zorgt dat alles crasht.\nEen fatale PL/pgSQL-uitzondering gebruikt de vorm 'RAISE EXCEPTION ''Prezzo non abbassabile!'';'.

Editor laden…
Toon hint

BEGIN ALS NEW.unit_price < OLD.unit_price DAN UITZONDERING VERHOGEN 'Prezzo non abbassabile!'; EINDE ALS; RETOURNIEUW; EINDE;

Oplossing beschikbaar na 3 pogingen