Utløsere
Triggere i databaser er spesielle typer lagrede prosedyrer som automatisk utføres eller utløses som respons på bestemte hendelser eller handlinger som skjer i databasen.
Disse hendelsene kan inkludere innsettinger, oppdateringer eller sletting av data i tabeller, samt endringer i databaseskjemaobjekter som tabeller eller visninger.
Note
Triggere kan ikke kalles eksplisitt av brukere. I stedet utføres de automatisk som respons på de operasjonene de er tilknyttet.
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 lar deg avskjære den opprinnelige handlingen og utføre egendefinert logikk før du bestemmer om den opprinnelige handlingen skal fortsette eller ikke.
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.
-- 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();
Note
I PostgreSQL-triggere er
NEW
en spesiell postvariabel som representerer den nye raden som settes inn i eller oppdateres i tabellen. Den lar deg få tilgang til verdiene i kolonnene i den nye raden innenfor triggerfunksjonen.
Hvis vi arbeider med slettede rader, må vi brukeOLD
-postvariabelen i stedet forNEW
.
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 sjekke saldoen før operasjonen, og hvis den er negativ, vil operasjonen ikke bli utført.
-- 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 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 tilknytter vi denne funksjonen som en trigger til en angitt tabell og handling.
Vennligst merk 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 vær oppmerksom på 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
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
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 som skjer i databasen.
Disse hendelsene kan inkludere innsettinger, oppdateringer eller sletting av data i tabeller, samt endringer i databaseskjemaobjekter som tabeller eller visninger.
Note
Triggere kan ikke kalles eksplisitt av brukere. I stedet utføres de automatisk som respons på de operasjonene de er tilknyttet.
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 lar deg avskjære den opprinnelige handlingen og utføre egendefinert logikk før du bestemmer om den opprinnelige handlingen skal fortsette eller ikke.
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.
-- 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();
Note
I PostgreSQL-triggere er
NEW
en spesiell postvariabel som representerer den nye raden som settes inn i eller oppdateres i tabellen. Den lar deg få tilgang til verdiene i kolonnene i den nye raden innenfor triggerfunksjonen.
Hvis vi arbeider med slettede rader, må vi brukeOLD
-postvariabelen i stedet forNEW
.
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 sjekke saldoen før operasjonen, og hvis den er negativ, vil operasjonen ikke bli utført.
-- 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 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 tilknytter vi denne funksjonen som en trigger til en angitt tabell og handling.
Vennligst merk 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 vær oppmerksom på at vi ikke kan opprette SELECT
-triggere, siden SELECT
-setningen ikke endrer noen rader i tabellen!
Takk for tilbakemeldingene dine!