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();
-
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 iuserlogs-tabellen. - Den innlagte posten inneholder verdier fra
NEW-raden til den utløsende hendelsen. - Verdiene som settes inn inkluderer
accountnumberog en sammensatt streng som nevner handlingen. - Funksjonen returnerer
NEW-raden. - Funksjonen er skrevet i
plpgsql-språket.
- Opprett en funksjon med navnet
-
Knytt triggeren til bankaccounts-tabellen:
- En trigger med navnet
afterinserttriggeropprettes. - Triggeren er satt til å utføres etter en
INSERT-operasjon påbankaccounts-tabellen. - Triggeren er satt til å utføre funksjonen
afterinserttriggerfunctionfor hver berørt rad.
- En trigger med navnet
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();
-
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
accountnumberog en sammensatt streng som indikerer handlingen. - Funksjonen returnerer
NEWfor å tillate innsettingen å fortsette. - Funksjonen er skrevet i
plpgsql-språket.
- Opprett eller erstatt en funksjon med navnet
-
Opprett triggeren:
- En trigger med navnet
before_insert_userlogs_triggeropprettes. - 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.
- En trigger med navnet
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!
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår