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

bookTriggers

Triggers in databases zijn speciale typen opgeslagen procedures die automatisch worden uitgevoerd of geactiveerd als reactie op bepaalde gebeurtenissen of acties die in de database plaatsvinden.
Deze gebeurtenissen kunnen het invoegen, bijwerken of verwijderen van gegevens in tabellen omvatten, evenals wijzigingen aan database-schemaobjecten zoals tabellen of views.

DML-triggers

Een DML-trigger, ook wel 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 auditdoeleinden te ondersteunen.

Typen DML-triggers

  • After-triggers: Deze triggers worden na de activering (insert, update, delete) op de tabel uitgevoerd;
  • Before-triggers: Deze triggers worden voor de activering uitgevoerd. Hiermee kunt u de oorspronkelijke actie onderscheppen en aangepaste logica uitvoeren voordat u beslist of u doorgaat met de oorspronkelijke actie.

Voorbeeld van een after-trigger

Eerder hebben we een voorbeeld bekeken waarbij een transactie werd gebruikt om waarden toe te voegen aan de tabel BankAccounts en de tabel UserLogs 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-bewerking binnen de tabel BankAccounts.
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();
copy
Note
Opmerking

In PostgreSQL-triggers is NEW een speciale recordvariabele die de nieuwe rij vertegenwoordigt die in de tabel is ingevoegd of bijgewerkt. Hiermee kunt u binnen de triggerfunctie toegang krijgen tot de waarden van kolommen in de nieuwe rij.
Als we werken met verwijderde rijen, moeten we de recordvariabele OLD 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();
copy

Patroon voor het aanmaken van triggers

We kunnen het typische patroon voor het aanmaken van triggers waarnemen: 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-bewerking.
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?

Select the correct answer

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.

bookTriggers

Veeg om het menu te tonen

Triggers in databases zijn speciale typen opgeslagen procedures die automatisch worden uitgevoerd of geactiveerd als reactie op bepaalde gebeurtenissen of acties die in de database plaatsvinden.
Deze gebeurtenissen kunnen het invoegen, bijwerken of verwijderen van gegevens in tabellen omvatten, evenals wijzigingen aan database-schemaobjecten zoals tabellen of views.

DML-triggers

Een DML-trigger, ook wel 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 auditdoeleinden te ondersteunen.

Typen DML-triggers

  • After-triggers: Deze triggers worden na de activering (insert, update, delete) op de tabel uitgevoerd;
  • Before-triggers: Deze triggers worden voor de activering uitgevoerd. Hiermee kunt u de oorspronkelijke actie onderscheppen en aangepaste logica uitvoeren voordat u beslist of u doorgaat met de oorspronkelijke actie.

Voorbeeld van een after-trigger

Eerder hebben we een voorbeeld bekeken waarbij een transactie werd gebruikt om waarden toe te voegen aan de tabel BankAccounts en de tabel UserLogs 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-bewerking binnen de tabel BankAccounts.
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();
copy
Note
Opmerking

In PostgreSQL-triggers is NEW een speciale recordvariabele die de nieuwe rij vertegenwoordigt die in de tabel is ingevoegd of bijgewerkt. Hiermee kunt u binnen de triggerfunctie toegang krijgen tot de waarden van kolommen in de nieuwe rij.
Als we werken met verwijderde rijen, moeten we de recordvariabele OLD 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();
copy

Patroon voor het aanmaken van triggers

We kunnen het typische patroon voor het aanmaken van triggers waarnemen: 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-bewerking.
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?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 1
some-alt