Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Utlösare | Några Ytterligare Ämnen
Avancerade Tekniker i SQL

bookUtlö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 postvariabeln OLD istället för NEW.

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!

question mark

Vad är det primära syftet med att använda triggers i en databas?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 1

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Suggested prompts:

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

bookUtlö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 postvariabeln OLD istället för NEW.

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!

question mark

Vad är det primära syftet med att använda triggers i en databas?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 1
some-alt