[G_PRO] Databanken
  • Welkom
  • Inleiding
    • Benodigdheden
    • Nuttige extra's
    • Mee helpen?
  • Semester 1: databanken intro
    • Installatie van alle software
    • Databanken
      • Inleiding
      • Voorbeeld
      • Wat is een relationele databank
      • Basisstructuren van een relationele databank
      • Diagramnotatie
    • (My)SQL
      • DDL
        • Datatypes
          • Enum
        • CREATE
        • ALTER
        • DROP
        • Sleutels voor identificatie
        • Primaire sleutel toevoegen/verwijderen
        • Primaire sleutel in een nieuwe tabel
        • Vreemde sleutels
        • Relaties-voorstellen
        • Labo
      • DML
        • INSERT
        • UPDATE
        • DELETE
        • LIKE
        • Logische operatoren
        • Vergelijkingen
        • SELECT sorteren
        • Functies
        • Labo
      • SELECT
        • SELECT met clausules
        • SELECT met WHERE
      • Groeperen en samenvatten
        • Aggregaatfuncties
        • SELECT met GROUP BY
        • SELECT met HAVING
        • IN
        • BETWEEN
        • SELECT DISTINCT
        • Labo
      • JOINS
        • JOINs bij simpele relaties
        • JOINs via tussenliggende tabel
        • UPDATE van JOIN
      • apTunes project
  • PRO (GEEN LEERSTOF EN/OF IN OPBOUW)
    • PRO
      • Waarom een databank?
      • Een databank ontwerpen
      • ERM
        • Basisbegrippen
        • Constraints (voorwaarden, beperkingen)
        • Keys (Sleutels)
        • Discussiepunten bij ontwerp in ERM
        • Aanvullende begrippen
        • Herleiden van ERD's tot tabellen
        • Voorbeeld
        • Bibliografie
        • Labo oefeningen
      • NoSQL
      • Blockchain
  • SEMESTER 2: DATABANKEN
    • Join
      • INNER JOIN
      • LEFT JOIN
      • COALESCE
      • RIGHT JOIN
      • LEFT EXCLUDING JOIN
      • RIGHT EXCLUDING JOIN
      • OUTER JOIN
      • OUTER EXCLUDING JOIN
      • Samenvattende flowchart
      • Labo oefeningen
    • Views
      • CREATE
      • ALTER
      • DROP
      • UPDATE
      • RENAME
      • BESLUIT
      • Labo oefeningen
    • Subqueries
      • Een onafhankelijke subquery
      • Subqueries met tijdelijke opslag
      • Labo oefeningen
    • Indexeren
      • mogelijkheden
      • CREATE
      • DROP
      • UNIQUE
      • trage queries opvolgen
    • ERD
      • Referentiële beperkingen
      • Overzicht
      • Labo oefeningen
    • Stored programs
      • Stored procedures
      • CREATE
      • DROP
      • DELIMITER
      • Variabelen
      • Parameters
      • Gerelateerde data invoegen
      • IF -THEN-ELSE-ELSEIF
      • LOOP
      • WHILE
      • REPEAT
      • SIGNAL
      • Error handling
      • RESIGNAL
      • Stored functies
      • Triggers
      • Cursors
      • Transacties en rollbacks
      • Object access control
      • Oefeningen basisgebruik stored procedures
      • Oefeningen control flow
      • Oefeningen stored functions
      • Oefeningen triggers
      • Oefeningen error handling
      • Oefeningen transacties en access control
Powered by GitBook
On this page
  • Aanmaken
  • Verwijderen
  • Uitvoering

Was this helpful?

Export as PDF
  1. SEMESTER 2: DATABANKEN
  2. Stored programs

Triggers

Triggers zijn reeksen instructies die automatisch opgestart worden in specifieke situaties.

PreviousStored functiesNextCursors

Last updated 2 years ago

Was this helpful?

Triggers kunnen activeren voor of na een INSERT, UPDATE of DELETE in een tabel. Dit zijn de basisoperaties van de DML. Je gebruikt triggers om handelingen vast te leggen die moeten gebeuren in combinatie met deze statements, maar die misschien vergeten kunnen worden. Als een trigger niet kan uitvoeren, voert de bijbehorende instructie ook niet uit.

Typische voorbeelden zijn:

  • loggen van aanpassingen (gewoonlijk door een extra INSERT te doen in een tabel die de aanpassingen opvolgt)

  • extra error handling (door een fout te signaleren bij waarden die wel het juiste datatype hebben maar toch niet toegelaten zijn)

Ze zijn gekoppeld aan een bepaalde tabel, zoals je hier ziet in Workbench:

Triggers lopen niet alleen wanneer je letterlijk INSERT, UPDATE of DELETE uitvoert. Andere operaties die data invoegen, aanpassen of wissen kunnen ook triggers activeren.

Aanmaken

Een trigger aanmaken doe je met volgende syntax, die is overgenomen uit de officiële documentatie (en wat vereenvoudigd is om enkel de zaken te tonen die wij behandelen):

CREATE
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    trigger_body

trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }

De trigger_body is normaal één statement, maar je kan er meerdere statements in schrijven door eerst BEGIN te schrijven, dan je statements en dan END. Zoals bij stored procedures en functies moet je dan voor aanmaak van de trigger de delimiter wijzigen en na aanmaak van de trigger terugzetten.

Je kan dit automatisch laten afhandelen aan de hand van de trigger editor, die je hier vindt:

In de definitie van de trigger kan je ruwweg dezelfde instructies schrijven als in een stored procedure. In een trigger kan je ook gebruik maken van OLD of NEW om te verwijzen naar bepaalde kolomwaarden voor of na de aanpassing. Je kan alleen OLD en NEW gebruiken in een UPDATE, omdat dat het enige soort instructie is waarbij er een oude en een nieuwe waarde is voor een kolom. Het gedeelte FOR EACH ROW duidt op elke ingevoegde, aangepaste of verwijderde rij, niet op elke rij in de tabel.

Een concreet voorbeeld kan bijvoorbeeld zijn:

drop trigger if exists LogPersonsInsert;

delimiter $$

CREATE TRIGGER LogPersonsInsert
    after insert
    ON Persons FOR EACH ROW
    begin
        declare currentTime datetime default now();
        insert into PersonLog (Id, currentTime)
        values (New.Id, currentTime);
    end$$
    
delimiter ;

De declaratie is hier niet echt nodig, maar zo hebben we twee statements en hebben we een reden om begin en end te gebruiken.

Bepaalde acties zijn niet toegestaan. Je kan bijvoorbeeld geen aanpassing doen aan de tabel waarop de trigger wordt uitgevoerd. Anders zou je makkelijk een kettingreactie van triggers kunnen opstarten.

Verwijderen

Dit doe je gewoonweg als volgt, waarbij TriggerName de naam is die je bij het aanmaken hebt ingesteld:

DROP TRIGGER TriggerName

Uitvoering

  • Een BEFORE-trigger loopt voor er een poging gedaan wordt om een operatie uit te voeren. Het is dus niet gegarandeerd dat die operatie ook zal slagen.

  • Een AFTER-trigger loopt alleen als de operatie kan worden uitgevoerd.

  • Als er een fout optreedt tijdens een trigger (BEFORE of AFTER), faalt de operatie die de trigger heeft geactiveerd.