Triggers
Triggers in databases zijn speciale typen opgeslagen procedures die automatisch worden uitgevoerd of geactiveerd als reactie op bepaalde gebeurtenissen of acties die plaatsvinden in de database.
Deze gebeurtenissen kunnen het invoegen, bijwerken of verwijderen van gegevens in tabellen omvatten, evenals wijzigingen aan databaseobjecten zoals tabellen of views.
Opmerking
Triggers kunnen niet expliciet door gebruikers worden aangeroepen. In plaats daarvan worden ze automatisch uitgevoerd als reactie op de bewerkingen waarmee ze zijn geassocieerd.
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 activerende bewerking (insert, update, delete) op de tabel uitgevoerd;
- Before-triggers: Deze triggers worden voor de activerende bewerking uitgevoerd. Ze stellen u in staat 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
-bewerking binnen de BankAccounts
-tabel.
Hierdoor kunnen we alleen nieuwe accounts invoegen, en de bijbehorende logwaarde wordt automatisch toegevoegd door de trigger.
-- 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();
Opmerking
In PostgreSQL-triggers is
NEW
een speciale recordvariabele die de nieuwe rij die is ingevoegd of bijgewerkt in de tabel vertegenwoordigt. Hiermee kunt u de waarden van kolommen in de nieuwe rij binnen de triggerfunctie benaderen.
Als we werken met verwijderde rijen, moeten we deOLD
-recordvariabele gebruiken in plaats vanNEW
.
Voorbeeld van een before-trigger
Stel dat we willen voorkomen dat waarden met een negatief rekeningsaldo worden toegevoegd. We kunnen hiervoor een BEFORE
-trigger maken. Deze trigger controleert het saldo vóór de bewerking, en als het negatief is, wordt de bewerking niet uitgevoerd.
-- 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();
Trigger aanmaakpatroon
Het typische patroon voor het aanmaken van triggers is als volgt: eerst wordt een functie gedefinieerd om specifieke logica uit te voeren vóór of na een bewerking. Vervolgens wordt deze functie gekoppeld als trigger aan een bepaalde tabel en actie.
Let op de volgende instructie:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
Hierbij is het mogelijk om UPDATE
of DELETE
te gebruiken in plaats van de INSERT
-bewerking.
Maar let op dat het niet mogelijk is om SELECT
-triggers te maken, aangezien de SELECT
-instructie geen rijen in de tabel wijzigt!
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 4.35
Triggers
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 plaatsvinden in de database.
Deze gebeurtenissen kunnen het invoegen, bijwerken of verwijderen van gegevens in tabellen omvatten, evenals wijzigingen aan databaseobjecten zoals tabellen of views.
Opmerking
Triggers kunnen niet expliciet door gebruikers worden aangeroepen. In plaats daarvan worden ze automatisch uitgevoerd als reactie op de bewerkingen waarmee ze zijn geassocieerd.
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 activerende bewerking (insert, update, delete) op de tabel uitgevoerd;
- Before-triggers: Deze triggers worden voor de activerende bewerking uitgevoerd. Ze stellen u in staat 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
-bewerking binnen de BankAccounts
-tabel.
Hierdoor kunnen we alleen nieuwe accounts invoegen, en de bijbehorende logwaarde wordt automatisch toegevoegd door de trigger.
-- 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();
Opmerking
In PostgreSQL-triggers is
NEW
een speciale recordvariabele die de nieuwe rij die is ingevoegd of bijgewerkt in de tabel vertegenwoordigt. Hiermee kunt u de waarden van kolommen in de nieuwe rij binnen de triggerfunctie benaderen.
Als we werken met verwijderde rijen, moeten we deOLD
-recordvariabele gebruiken in plaats vanNEW
.
Voorbeeld van een before-trigger
Stel dat we willen voorkomen dat waarden met een negatief rekeningsaldo worden toegevoegd. We kunnen hiervoor een BEFORE
-trigger maken. Deze trigger controleert het saldo vóór de bewerking, en als het negatief is, wordt de bewerking niet uitgevoerd.
-- 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();
Trigger aanmaakpatroon
Het typische patroon voor het aanmaken van triggers is als volgt: eerst wordt een functie gedefinieerd om specifieke logica uit te voeren vóór of na een bewerking. Vervolgens wordt deze functie gekoppeld als trigger aan een bepaalde tabel en actie.
Let op de volgende instructie:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
Hierbij is het mogelijk om UPDATE
of DELETE
te gebruiken in plaats van de INSERT
-bewerking.
Maar let op dat het niet mogelijk is om SELECT
-triggers te maken, aangezien de SELECT
-instructie geen rijen in de tabel wijzigt!
Bedankt voor je feedback!