Utlösare
Triggers i databaser är speciella typer av lagrade procedurer som automatiskt körs eller utlöses som svar på vissa händelser eller åtgärder som sker i databasen.
Dessa händelser kan inkludera insättningar, uppdateringar eller borttagningar av data i tabeller samt ändringar av databasens schemaobjekt såsom tabeller eller vyer.
Notera
Triggers kan inte anropas explicit av användare. Istället körs de automatiskt som svar på de operationer de är kopplade till.
DML-triggers
En DML-trigger, även kallad Data Manipulation Language-trigger, är ett databasobjekt som automatiskt utför en angiven åtgärd när en viss händelse inträffar på en tabell eller vy.
DML-triggers används ofta för att upprätthålla affärsregler, säkerställa dataintegritet eller utföra granskning.
Typer av DML-triggers
- After Triggers: Dessa triggers utlöses efter att den utlösande åtgärden (insert, update, delete) har utförts på tabellen;
- Before Triggers: Dessa triggers utlöses innan den utlösande åtgärden. De gör det möjligt att fånga upp den ursprungliga åtgärden och utföra anpassad logik innan man bestämmer om den ursprungliga åtgärden ska fortsätta eller inte.
Exempel på after trigger
Vi har tidigare undersökt ett exempel där en transaktion används för att lägga till värden i tabellen BankAccounts
och tabellen UserLogs
som en enda logisk enhet i den första delen av denna kurs.
Nu kan vi istället för att använda en transaktion uppnå detta genom att skapa en AFTER
-trigger på INSERT
-operationen i tabellen BankAccounts
.
Som ett resultat kommer vi endast att kunna införa nya konton, och motsvarande loggpost kommer automatiskt att läggas till av triggern.
-- 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();
Notera
I PostgreSQL-triggers är
NEW
en speciell postvariabel som representerar den nya raden som infogats eller uppdaterats i tabellen. Den gör det möjligt att komma åt värdena i kolumnerna i den nya raden inom triggerfunktionen.
Om vi arbetar med borttagna rader måste vi istället använda postvariabelnOLD
istället förNEW
.
Exempel på before trigger
Anta att vi vill förhindra att värden med negativ kontobalans läggs till. Vi kan skapa en BEFORE
-trigger för att uppnå detta. Denna trigger kommer att kontrollera saldot före operationen, och om det är negativt kommer operationen inte att utföras.
-- 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();
Mönster för skapande av trigger
Vi kan observera det typiska mönstret för att skapa triggers: först definierar vi en funktion som utför specifik logik före eller efter en operation. Därefter associerar vi denna funktion som en trigger till en angiven tabell och åtgärd.
Observera att i satsen:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
har vi flexibiliteten att använda UPDATE
eller DELETE
istället för INSERT
-operationen.
Men notera att vi inte kan skapa SELECT
-triggers eftersom SELECT
-satsen inte ändrar några rader i tabellen!
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Can you explain the difference between AFTER and BEFORE triggers in more detail?
What are some common use cases for DML triggers in real-world applications?
How do I prevent unwanted actions using triggers in PostgreSQL?
Awesome!
Completion rate improved to 4.35
Utlösare
Svep för att visa menyn
Triggers i databaser är speciella typer av lagrade procedurer som automatiskt körs eller utlöses som svar på vissa händelser eller åtgärder som sker i databasen.
Dessa händelser kan inkludera insättningar, uppdateringar eller borttagningar av data i tabeller samt ändringar av databasens schemaobjekt såsom tabeller eller vyer.
Notera
Triggers kan inte anropas explicit av användare. Istället körs de automatiskt som svar på de operationer de är kopplade till.
DML-triggers
En DML-trigger, även kallad Data Manipulation Language-trigger, är ett databasobjekt som automatiskt utför en angiven åtgärd när en viss händelse inträffar på en tabell eller vy.
DML-triggers används ofta för att upprätthålla affärsregler, säkerställa dataintegritet eller utföra granskning.
Typer av DML-triggers
- After Triggers: Dessa triggers utlöses efter att den utlösande åtgärden (insert, update, delete) har utförts på tabellen;
- Before Triggers: Dessa triggers utlöses innan den utlösande åtgärden. De gör det möjligt att fånga upp den ursprungliga åtgärden och utföra anpassad logik innan man bestämmer om den ursprungliga åtgärden ska fortsätta eller inte.
Exempel på after trigger
Vi har tidigare undersökt ett exempel där en transaktion används för att lägga till värden i tabellen BankAccounts
och tabellen UserLogs
som en enda logisk enhet i den första delen av denna kurs.
Nu kan vi istället för att använda en transaktion uppnå detta genom att skapa en AFTER
-trigger på INSERT
-operationen i tabellen BankAccounts
.
Som ett resultat kommer vi endast att kunna införa nya konton, och motsvarande loggpost kommer automatiskt att läggas till av triggern.
-- 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();
Notera
I PostgreSQL-triggers är
NEW
en speciell postvariabel som representerar den nya raden som infogats eller uppdaterats i tabellen. Den gör det möjligt att komma åt värdena i kolumnerna i den nya raden inom triggerfunktionen.
Om vi arbetar med borttagna rader måste vi istället använda postvariabelnOLD
istället förNEW
.
Exempel på before trigger
Anta att vi vill förhindra att värden med negativ kontobalans läggs till. Vi kan skapa en BEFORE
-trigger för att uppnå detta. Denna trigger kommer att kontrollera saldot före operationen, och om det är negativt kommer operationen inte att utföras.
-- 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();
Mönster för skapande av trigger
Vi kan observera det typiska mönstret för att skapa triggers: först definierar vi en funktion som utför specifik logik före eller efter en operation. Därefter associerar vi denna funktion som en trigger till en angiven tabell och åtgärd.
Observera att i satsen:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
har vi flexibiliteten att använda UPDATE
eller DELETE
istället för INSERT
-operationen.
Men notera att vi inte kan skapa SELECT
-triggers eftersom SELECT
-satsen inte ändrar några rader i tabellen!
Tack för dina kommentarer!