Laukaisimet
Triggerit tietokannoissa ovat erityisiä tallennettuja proseduurityyppejä, jotka suoritetaan automaattisesti tiettyjen tapahtumien tai toimintojen seurauksena tietokannassa.
Nämä tapahtumat voivat sisältää taulujen lisäyksiä, päivityksiä tai tietojen poistoja sekä muutoksia tietokannan skeemaobjekteihin, kuten tauluihin tai näkymiin.
Huomio
Triggeriä ei voi kutsua käyttäjän toimesta suoraan. Sen sijaan ne suoritetaan automaattisesti niihin liitettyjen operaatioiden yhteydessä.
DML-triggerit
DML-triggeri, eli Data Manipulation Language -triggeri, on tietokantaobjekti, joka suorittaa määritellyn toiminnon automaattisesti, kun tietty tapahtuma tapahtuu taulussa tai näkymässä.
DML-triggereitä käytetään usein liiketoimintasääntöjen valvomiseen, tietojen eheyden ylläpitämiseen tai auditointitehtäviin.
DML-triggerityypit
- After-triggerit: Nämä triggerit suoritetaan toiminnon jälkeen (lisäys, päivitys, poisto) taulussa;
- Before-triggerit: Nämä triggerit suoritetaan ennen toimintoa. Niiden avulla voidaan estää alkuperäinen toiminto ja suorittaa mukautettua logiikkaa ennen päätöstä jatketaanko alkuperäistä toimintoa.
Esimerkki after-triggeristä
Olemme aiemmin tarkastelleet esimerkkiä, jossa transaktiolla lisättiin arvoja BankAccounts
-tauluun ja UserLogs
-tauluun yhtenä loogisena kokonaisuutena tämän kurssin ensimmäisessä osassa.
Nyt voimme saavuttaa saman luomalla AFTER
-triggerin INSERT
-operaatiolle BankAccounts
-tauluun.
Tämän seurauksena voimme lisätä vain uusia tilejä, ja vastaava lokimerkintä lisätään automaattisesti triggerin toimesta.
-- 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();
Huomio
PostgreSQL-triggereissä
NEW
on erityinen tietue, joka edustaa tauluun lisättyä tai päivitettyä uutta riviä. Sen avulla voidaan käyttää uuden rivin sarakkeiden arvoja trigger-funktiossa.
Jos käsitellään poistettuja rivejä, tulee käyttääOLD
-tietuettaNEW
:n sijaan.
Esimerkki before-triggeristä
Oletetaan, että haluamme estää arvojen lisäämisen, jos tilin saldo on negatiivinen. Voimme luoda BEFORE
-triggerin tätä varten. Tämä triggeri tarkistaa saldon ennen operaatiota, ja jos se on negatiivinen, operaatiota ei suoriteta.
-- 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();
Triggerin luontimalli
Voimme havaita tyypillisen mallin triggerien luomisessa: aluksi määritellään funktio, joka suorittaa tietyn logiikan ennen operaatiota tai sen jälkeen. Tämän jälkeen liitetään tämä funktio triggeriksi tiettyyn tauluun ja tapahtumaan.
Huomioithan seuraavassa lauseessa:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
meillä on mahdollisuus käyttää UPDATE
- tai DELETE
-operaatiota INSERT
-operaation sijaan.
Mutta huomioi, että emme voi luoda SELECT
-triggereitä, koska SELECT
-lause ei muuta taulun rivejä!
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
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
Laukaisimet
Pyyhkäise näyttääksesi valikon
Triggerit tietokannoissa ovat erityisiä tallennettuja proseduurityyppejä, jotka suoritetaan automaattisesti tiettyjen tapahtumien tai toimintojen seurauksena tietokannassa.
Nämä tapahtumat voivat sisältää taulujen lisäyksiä, päivityksiä tai tietojen poistoja sekä muutoksia tietokannan skeemaobjekteihin, kuten tauluihin tai näkymiin.
Huomio
Triggeriä ei voi kutsua käyttäjän toimesta suoraan. Sen sijaan ne suoritetaan automaattisesti niihin liitettyjen operaatioiden yhteydessä.
DML-triggerit
DML-triggeri, eli Data Manipulation Language -triggeri, on tietokantaobjekti, joka suorittaa määritellyn toiminnon automaattisesti, kun tietty tapahtuma tapahtuu taulussa tai näkymässä.
DML-triggereitä käytetään usein liiketoimintasääntöjen valvomiseen, tietojen eheyden ylläpitämiseen tai auditointitehtäviin.
DML-triggerityypit
- After-triggerit: Nämä triggerit suoritetaan toiminnon jälkeen (lisäys, päivitys, poisto) taulussa;
- Before-triggerit: Nämä triggerit suoritetaan ennen toimintoa. Niiden avulla voidaan estää alkuperäinen toiminto ja suorittaa mukautettua logiikkaa ennen päätöstä jatketaanko alkuperäistä toimintoa.
Esimerkki after-triggeristä
Olemme aiemmin tarkastelleet esimerkkiä, jossa transaktiolla lisättiin arvoja BankAccounts
-tauluun ja UserLogs
-tauluun yhtenä loogisena kokonaisuutena tämän kurssin ensimmäisessä osassa.
Nyt voimme saavuttaa saman luomalla AFTER
-triggerin INSERT
-operaatiolle BankAccounts
-tauluun.
Tämän seurauksena voimme lisätä vain uusia tilejä, ja vastaava lokimerkintä lisätään automaattisesti triggerin toimesta.
-- 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();
Huomio
PostgreSQL-triggereissä
NEW
on erityinen tietue, joka edustaa tauluun lisättyä tai päivitettyä uutta riviä. Sen avulla voidaan käyttää uuden rivin sarakkeiden arvoja trigger-funktiossa.
Jos käsitellään poistettuja rivejä, tulee käyttääOLD
-tietuettaNEW
:n sijaan.
Esimerkki before-triggeristä
Oletetaan, että haluamme estää arvojen lisäämisen, jos tilin saldo on negatiivinen. Voimme luoda BEFORE
-triggerin tätä varten. Tämä triggeri tarkistaa saldon ennen operaatiota, ja jos se on negatiivinen, operaatiota ei suoriteta.
-- 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();
Triggerin luontimalli
Voimme havaita tyypillisen mallin triggerien luomisessa: aluksi määritellään funktio, joka suorittaa tietyn logiikan ennen operaatiota tai sen jälkeen. Tämän jälkeen liitetään tämä funktio triggeriksi tiettyyn tauluun ja tapahtumaan.
Huomioithan seuraavassa lauseessa:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
meillä on mahdollisuus käyttää UPDATE
- tai DELETE
-operaatiota INSERT
-operaation sijaan.
Mutta huomioi, että emme voi luoda SELECT
-triggereitä, koska SELECT
-lause ei muuta taulun rivejä!
Kiitos palautteestasi!