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

bookUtløsere

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 mulighet til å avskjære den opprinnelige handlingen og utføre tilpasset logikk før det avgjøres om den opprinnelige handlingen skal fortsette.

Eksempel på etter-trigger

Vi har tidligere sett et eksempel på bruk av en transaksjon for å legge til verdier i tabellen BankAccounts og tabellen UserLogs 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 tabellen BankAccounts.
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();
copy
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 triggerfunksjonen.
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 innsetting av 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 operasjonen ikke 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();
copy

Mønster for opprettelse av trigger

Vi kan observere det typiske mønsteret for å opprette triggere: først definerer vi en funksjon som utfører spesifikk logikk før eller etter en operasjon. Deretter tilknytter 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?

Select the correct answer

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

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 can I modify a trigger to handle UPDATE or DELETE operations instead of INSERT?

bookUtlø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 mulighet til å avskjære den opprinnelige handlingen og utføre tilpasset logikk før det avgjøres om den opprinnelige handlingen skal fortsette.

Eksempel på etter-trigger

Vi har tidligere sett et eksempel på bruk av en transaksjon for å legge til verdier i tabellen BankAccounts og tabellen UserLogs 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 tabellen BankAccounts.
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();
copy
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 triggerfunksjonen.
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 innsetting av 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 operasjonen ikke 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();
copy

Mønster for opprettelse av trigger

Vi kan observere det typiske mønsteret for å opprette triggere: først definerer vi en funksjon som utfører spesifikk logikk før eller etter en operasjon. Deretter tilknytter 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?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 1
some-alt