Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Utløsere | Noen Tilleggs­emner
SQL-optimalisering og spørringsfunksjoner

Utløsere

Sveip for å vise menyen

Triggere i databaser er spesielle typer lagrede prosedyrer som automatisk utføres eller utløses som respons på bestemte hendelser eller handlinger i databasen.
Disse hendelsene kan inkludere innsettinger, oppdateringer eller sletting av data i tabeller, samt endringer i databaseskjemaobjekter som tabeller eller visninger.

DML-triggere

En DML-trigger, også kjent som en Data Manipulation Language-trigger, er et databaseobjekt som automatisk utfører en spesifisert handling når en bestemt hendelse oppstår på en tabell eller visning.
DML-triggere brukes ofte for å håndheve forretningsregler, opprettholde dataintegritet eller utføre revisjonsoppgaver.

Typer DML-triggere

  • Etter-triggere: Disse triggerne utløses etter at den utløsende handlingen (innsetting, oppdatering, sletting) er utført på tabellen;
  • Før-triggere: Disse triggerne utløses før den utløsende handlingen. De gir deg mulighet til å avskjære den opprinnelige handlingen og utføre egendefinert logikk før du bestemmer om du vil fortsette med den opprinnelige handlingen eller ikke.

Eksempel på etter-trigger

Vi har tidligere sett et eksempel på bruk av en transaksjon for å legge til verdier i BankAccounts-tabellen og UserLogs-tabellen som en enkelt logisk enhet i den første delen av dette kurset.
Nå, i stedet for å bruke en transaksjon, kan vi oppnå dette ved å opprette en AFTER-trigger på INSERT-operasjonen i BankAccounts-tabellen.
Som et resultat vil vi kun kunne sette inn nye kontoer, og den tilhørende loggverdien vil automatisk bli lagt til av triggeren.

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();
Spørringsbeskrivelse
expand arrow
  • Opprett en etter-innsetting-trigger for user_logs:

    • Opprett en funksjon med navnet afterinserttriggerfunction().
    • Funksjonen er definert til å returnere en trigger.
    • Funksjonens kropp begynner med en BEGIN-blokk.
    • Inne i BEGIN-blokken utføres en handling, som er å sette inn en post i userlogs-tabellen.
    • Den innlagte posten inneholder verdier fra NEW-raden til den utløsende hendelsen.
    • Verdiene som settes inn inkluderer accountnumber og en sammensatt streng som nevner handlingen.
    • Funksjonen returnerer NEW-raden.
    • Funksjonen er skrevet i plpgsql-språket.
  • Knytt triggeren til bankaccounts-tabellen:

    • En trigger med navnet afterinserttrigger opprettes.
    • Triggeren er satt til å utføres etter en INSERT-operasjon på bankaccounts-tabellen.
    • Triggeren er satt til å utføre funksjonen afterinserttriggerfunction for hver berørt rad.
Note
Merk

I PostgreSQL-triggere er NEW en spesiell postvariabel som representerer den nye raden som settes inn i eller oppdateres i tabellen. Den gir tilgang til verdiene i kolonnene i den nye raden innenfor trigger-funksjonen.
Hvis vi arbeider med slettede rader, må vi bruke OLD-postvariabelen i stedet for NEW.

Eksempel på før-trigger

Anta at vi ønsker å hindre at det legges til verdier med negativ kontosaldo. Vi kan opprette en BEFORE-trigger for å oppnå dette. Denne triggeren vil kontrollere saldoen før operasjonen, og hvis den er negativ, vil ikke operasjonen bli utført.

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();
Spørringsbeskrivelse
expand arrow
  • Opprett trigger-funksjonen:

    • Opprett eller erstatt en funksjon med navnet before_insert_userlogs().
    • Funksjonen er definert til å returnere en trigger.
    • Funksjonens kropp begynner med en BEGIN-blokk.
    • Inne i BEGIN-blokken sjekkes det om kontosaldoen er mindre enn 0.
    • Hvis saldoen er mindre enn 0, gis det en melding og ingen handling logges. Funksjonen returnerer NULL for å forhindre innsettingen.
    • Hvis saldoen er større enn eller lik 0, gis det en melding som indikerer at handlingen logges.
    • Funksjonen setter deretter inn en rad i userlogs-tabellen, med verdier fra den nye raden (NEW).
    • De innsatte verdiene inkluderer accountnumber og en sammensatt streng som indikerer handlingen.
    • Funksjonen returnerer NEW for å tillate innsettingen å fortsette.
    • Funksjonen er skrevet i plpgsql-språket.
  • Opprett triggeren:

    • En trigger med navnet before_insert_userlogs_trigger opprettes.
    • Triggeren er satt til å kjøres før en INSERT-operasjon på bankaccounts-tabellen.
    • Triggeren er satt til å kjøre funksjonen before_insert_userlogs() for hver berørt rad.

Mønster for opprettelse av trigger

Vi kan observere det typiske mønsteret for å opprette triggere: først definerer vi en funksjon som skal utføre spesifikk logikk før eller etter en operasjon. Deretter knytter vi denne funksjonen som en trigger til en angitt tabell og handling.

Vær oppmerksom på at i følgende setning:

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

har vi fleksibilitet til å bruke UPDATE eller DELETE i stedet for INSERT-operasjonen.
Men merk at vi ikke kan opprette SELECT-triggere, siden SELECT-setningen ikke endrer noen rader i tabellen!

question mark

Hva er hovedformålet med å bruke triggere i en database?

Velg det helt riktige svaret

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 1

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 3. Kapittel 1
some-alt