Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Triggere | Nogle Yderligere Emner
SQL-optimering og Forespørgselsfunktioner

bookTriggere

Triggers i databaser er særlige typer af lagrede procedurer, der automatisk udføres eller aktiveres som reaktion på bestemte hændelser eller handlinger i databasen.
Disse hændelser kan omfatte indsættelser, opdateringer eller sletninger af data i tabeller samt ændringer af databaseskemaobjekter som tabeller eller views.

DML-triggere

En DML-trigger, også kendt som en Data Manipulation Language-trigger, er et databaseobjekt, der automatisk udfører en specificeret handling, når en bestemt hændelse opstår på en tabel eller et view.
DML-triggere anvendes ofte til at håndhæve forretningsregler, opretholde dataintegritet eller udføre revisionsopgaver.

Typer af DML-triggere

  • After Triggers: Disse triggere aktiveres efter den udløsende handling (insert, update, delete) er udført på tabellen;
  • Before Triggers: Disse triggere aktiveres før den udløsende handling. De giver mulighed for at opsnappe den oprindelige handling og udføre brugerdefineret logik, før der tages stilling til, om den oprindelige handling skal fortsætte.

Eksempel på after trigger

Vi har tidligere undersøgt et eksempel på brug af en transaktion til at tilføje værdier til tabellen BankAccounts og tabellen UserLogs som en enkelt logisk enhed i det første afsnit af dette kursus.
Nu kan vi i stedet for at bruge en transaktion opnå dette ved at oprette en AFTER-trigger på INSERT-operationen i tabellen BankAccounts.
Som resultat vil vi kun kunne indsætte nye konti, og den tilsvarende logværdi vil automatisk blive tilføjet af 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
Bemærk

I PostgreSQL-triggere er NEW en speciel record-variabel, der repræsenterer den nye række, der indsættes i eller opdateres i tabellen. Den gør det muligt at tilgå værdierne af kolonner i den nye række inden for trigger-funktionen.
Hvis vi arbejder med slettede rækker, skal vi bruge OLD record-variablen i stedet for NEW.

Eksempel på før-trigger

Antag, at vi ønsker at forhindre tilføjelse af værdier med en negativ kontosaldo. Vi kan oprette en BEFORE-trigger for at opnå dette. Denne trigger vil kontrollere saldoen før operationen, og hvis den er negativ, vil operationen ikke blive udfø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 oprettelse af trigger

Vi kan observere det typiske mønster for oprettelse af triggers: først definerer vi en funktion til at udføre specifik logik før eller efter en operation. Derefter tilknytter vi denne funktion som en trigger til en bestemt tabel og handling.

Bemærk venligst, at i erklæringen:

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

har vi fleksibiliteten til at anvende UPDATE eller DELETE i stedet for INSERT-operationen.
Men vær opmærksom på, at vi ikke kan oprette SELECT-triggers, da SELECT-sætningen ikke ændrer nogen rækker i tabellen!

question mark

Hvad er det primære formål med at bruge triggere i en database?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 1

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

bookTriggere

Stryg for at vise menuen

Triggers i databaser er særlige typer af lagrede procedurer, der automatisk udføres eller aktiveres som reaktion på bestemte hændelser eller handlinger i databasen.
Disse hændelser kan omfatte indsættelser, opdateringer eller sletninger af data i tabeller samt ændringer af databaseskemaobjekter som tabeller eller views.

DML-triggere

En DML-trigger, også kendt som en Data Manipulation Language-trigger, er et databaseobjekt, der automatisk udfører en specificeret handling, når en bestemt hændelse opstår på en tabel eller et view.
DML-triggere anvendes ofte til at håndhæve forretningsregler, opretholde dataintegritet eller udføre revisionsopgaver.

Typer af DML-triggere

  • After Triggers: Disse triggere aktiveres efter den udløsende handling (insert, update, delete) er udført på tabellen;
  • Before Triggers: Disse triggere aktiveres før den udløsende handling. De giver mulighed for at opsnappe den oprindelige handling og udføre brugerdefineret logik, før der tages stilling til, om den oprindelige handling skal fortsætte.

Eksempel på after trigger

Vi har tidligere undersøgt et eksempel på brug af en transaktion til at tilføje værdier til tabellen BankAccounts og tabellen UserLogs som en enkelt logisk enhed i det første afsnit af dette kursus.
Nu kan vi i stedet for at bruge en transaktion opnå dette ved at oprette en AFTER-trigger på INSERT-operationen i tabellen BankAccounts.
Som resultat vil vi kun kunne indsætte nye konti, og den tilsvarende logværdi vil automatisk blive tilføjet af 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
Bemærk

I PostgreSQL-triggere er NEW en speciel record-variabel, der repræsenterer den nye række, der indsættes i eller opdateres i tabellen. Den gør det muligt at tilgå værdierne af kolonner i den nye række inden for trigger-funktionen.
Hvis vi arbejder med slettede rækker, skal vi bruge OLD record-variablen i stedet for NEW.

Eksempel på før-trigger

Antag, at vi ønsker at forhindre tilføjelse af værdier med en negativ kontosaldo. Vi kan oprette en BEFORE-trigger for at opnå dette. Denne trigger vil kontrollere saldoen før operationen, og hvis den er negativ, vil operationen ikke blive udfø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 oprettelse af trigger

Vi kan observere det typiske mønster for oprettelse af triggers: først definerer vi en funktion til at udføre specifik logik før eller efter en operation. Derefter tilknytter vi denne funktion som en trigger til en bestemt tabel og handling.

Bemærk venligst, at i erklæringen:

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

har vi fleksibiliteten til at anvende UPDATE eller DELETE i stedet for INSERT-operationen.
Men vær opmærksom på, at vi ikke kan oprette SELECT-triggers, da SELECT-sætningen ikke ændrer nogen rækker i tabellen!

question mark

Hvad er det primære formål med at bruge triggere i en database?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 1
some-alt