Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Triggers | Enkele Aanvullende Onderwerpen
SQL-Optimalisatie en Queryfuncties

Triggers

Veeg om het menu te tonen

Triggers in databases zijn speciale soorten opgeslagen procedures die automatisch worden uitgevoerd of geactiveerd als reactie op bepaalde gebeurtenissen of acties die plaatsvinden in de database.
Deze gebeurtenissen kunnen bestaan uit invoegingen, bijwerkingen of verwijderingen van gegevens in tabellen en wijzigingen aan database-schema-objecten zoals tabellen of views.

DML-triggers

Een DML-trigger, ook wel een Data Manipulation Language-trigger genoemd, is een databaseobject dat automatisch een gespecificeerde actie uitvoert wanneer een bepaalde gebeurtenis plaatsvindt op een tabel of view.
DML-triggers worden vaak gebruikt om bedrijfsregels af te dwingen, gegevensintegriteit te waarborgen of audit-taken uit te voeren.

Typen DML-triggers

  • After-triggers: Deze triggers worden geactiveerd nadat de activerende actie (insert, update, delete) is uitgevoerd op de tabel;
  • Before-triggers: Deze triggers worden geactiveerd voordat de activerende actie plaatsvindt. Ze maken het mogelijk om de oorspronkelijke actie te onderscheppen en aangepaste logica uit te voeren voordat wordt besloten of de oorspronkelijke actie wordt voortgezet.

Voorbeeld van een after-trigger

Eerder hebben we een voorbeeld bekeken van het gebruik van een transactie om waarden toe te voegen aan de BankAccounts-tabel en de UserLogs-tabel als één logische eenheid in de eerste sectie van deze cursus.
Nu kunnen we dit, in plaats van een transactie te gebruiken, bereiken door een AFTER-trigger te maken op de INSERT-operatie binnen de BankAccounts-tabel.
Hierdoor kunnen we alleen nieuwe accounts invoegen, en de bijbehorende logwaarde wordt automatisch toegevoegd door de trigger.

12345678910111213141516
-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
Querybeschrijving
expand arrow
  • Maak een after-insert-trigger voor user_logs:

    • Maak een functie met de naam afterinserttriggerfunction().
    • De functie is gedefinieerd om een trigger te retourneren.
    • Het lichaam van de functie begint met een BEGIN-blok.
    • Binnen het BEGIN-blok wordt een actie uitgevoerd, namelijk het invoegen van een record in de tabel userlogs.
    • Het ingevoegde record bevat waarden uit de NEW-rij van het activerende event.
    • De ingevoegde waarden omvatten accountnumber en een samengevoegde string die de actie vermeldt.
    • De functie retourneert de NEW-rij.
    • De functie is geschreven in de taal plpgsql.
  • Koppel de trigger aan de bankaccounts-tabel:

    • Een trigger met de naam afterinserttrigger wordt aangemaakt.
    • De trigger wordt ingesteld om te worden uitgevoerd na een INSERT-operatie op de tabel bankaccounts.
    • De trigger wordt ingesteld om de functie afterinserttriggerfunction uit te voeren voor elke getroffen rij.
Note
Opmerking

In PostgreSQL-triggers is NEW een speciale recordvariabele die de nieuwe rij die in de tabel wordt ingevoegd of bijgewerkt vertegenwoordigt. Hiermee kun je binnen de triggerfunctie de waarden van kolommen in de nieuwe rij benaderen.
Als we werken met verwijderde rijen, moeten we de OLD recordvariabele gebruiken in plaats van NEW.

Voorbeeld van een before-trigger

Stel dat we willen voorkomen dat waarden met een negatief rekeningsaldo worden toegevoegd. We kunnen hiervoor een BEFORE trigger aanmaken. Deze trigger controleert het saldo vóór de bewerking en als het negatief is, wordt de bewerking niet uitgevoerd.

12345678910111213141516171819202122232425
-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
Querybeschrijving
expand arrow
  • Maak de triggerfunctie aan:

    • Maak of vervang een functie genaamd before_insert_userlogs().
    • De functie is gedefinieerd om een trigger te retourneren.
    • De body van de functie begint met een BEGIN-blok.
    • Binnen het BEGIN-blok controleert een voorwaarde of het rekeningensaldo minder dan 0 is.
    • Als het saldo minder dan 0 is, wordt er een melding weergegeven en wordt er geen actie gelogd. De functie retourneert NULL om de invoeging te voorkomen.
    • Als het saldo groter dan of gelijk aan 0 is, wordt er een melding weergegeven dat de actie wordt gelogd.
    • De functie voegt vervolgens een record toe aan de tabel userlogs, met waarden uit de NEW-rij.
    • De toegevoegde waarden omvatten accountnumber en een samengevoegde string die de actie aangeeft.
    • De functie retourneert NEW om de invoeging toe te staan.
    • De functie is geschreven in de taal plpgsql.
  • Maak de trigger aan:

    • Een trigger genaamd before_insert_userlogs_trigger wordt aangemaakt.
    • De trigger wordt ingesteld om uit te voeren vóór een INSERT-operatie op de tabel bankaccounts.
    • De trigger wordt ingesteld om de functie before_insert_userlogs() uit te voeren voor elke getroffen rij.

Trigger aanmaakpatroon

We zien het typische patroon voor het aanmaken van triggers: eerst definiëren we een functie om specifieke logica uit te voeren vóór of na een bewerking. Vervolgens koppelen we deze functie als trigger aan een bepaalde tabel en actie.

Let op dat in de instructie:

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

we de flexibiliteit hebben om UPDATE of DELETE te gebruiken in plaats van de INSERT-operatie.
Maar let op dat we geen SELECT-triggers kunnen aanmaken, omdat de SELECT-instructie geen rijen in de tabel wijzigt!

question mark

Wat is het primaire doel van het gebruik van triggers in een database?

Selecteer het correcte antwoord

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 1

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 3. Hoofdstuk 1
some-alt