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.
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 laukeavat toiminnon jälkeen (lisäys, päivitys, poisto), kun toiminto on suoritettu taulussa;
- Before-triggerit: Nämä triggerit laukeavat ennen toimintoa. Niiden avulla voidaan siepata alkuperäinen toiminto ja suorittaa mukautettua logiikkaa ennen kuin päätetään, jatketaanko alkuperäistä toimintoa.
After-triggerin esimerkki
Olemme aiemmin tarkastelleet esimerkkiä, jossa transaktiota käytettiin arvojen lisäämiseen 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-taulussa.
Tämän seurauksena voimme lisätä vain uusia tilejä, ja vastaava lokitieto lisätään automaattisesti triggerin toimesta.
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();
PostgreSQL-triggereissä NEW on erityinen tietue-muuttuja, 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ä, on käytettävä OLD-tietuemuuttujaa NEW:n sijaan.
Esimerkki before-triggeristä
Oletetaan, että haluamme estää arvojen lisäämisen, jos tilin saldo on negatiivinen. Voimme luoda BEFORE-triggerin tämän saavuttamiseksi. Tämä trigger tarkistaa saldon ennen operaatiota, ja jos se on negatiivinen, operaatiota ei suoriteta.
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();
Triggerin luontimalli
Voimme havaita tyypillisen mallin triggerien luomisessa: ensin määritellään funktio, joka suorittaa tietyn logiikan ennen operaatiota tai sen jälkeen. Tämän jälkeen liitetään tämä funktio triggerinä tiettyyn tauluun ja tapahtumaan.
Huomaa, että 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 can I modify a trigger to handle UPDATE or DELETE operations instead of INSERT?
Mahtavaa!
Completion arvosana parantunut arvoon 4.55
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.
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 laukeavat toiminnon jälkeen (lisäys, päivitys, poisto), kun toiminto on suoritettu taulussa;
- Before-triggerit: Nämä triggerit laukeavat ennen toimintoa. Niiden avulla voidaan siepata alkuperäinen toiminto ja suorittaa mukautettua logiikkaa ennen kuin päätetään, jatketaanko alkuperäistä toimintoa.
After-triggerin esimerkki
Olemme aiemmin tarkastelleet esimerkkiä, jossa transaktiota käytettiin arvojen lisäämiseen 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-taulussa.
Tämän seurauksena voimme lisätä vain uusia tilejä, ja vastaava lokitieto lisätään automaattisesti triggerin toimesta.
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();
PostgreSQL-triggereissä NEW on erityinen tietue-muuttuja, 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ä, on käytettävä OLD-tietuemuuttujaa NEW:n sijaan.
Esimerkki before-triggeristä
Oletetaan, että haluamme estää arvojen lisäämisen, jos tilin saldo on negatiivinen. Voimme luoda BEFORE-triggerin tämän saavuttamiseksi. Tämä trigger tarkistaa saldon ennen operaatiota, ja jos se on negatiivinen, operaatiota ei suoriteta.
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();
Triggerin luontimalli
Voimme havaita tyypillisen mallin triggerien luomisessa: ensin määritellään funktio, joka suorittaa tietyn logiikan ennen operaatiota tai sen jälkeen. Tämän jälkeen liitetään tämä funktio triggerinä tiettyyn tauluun ja tapahtumaan.
Huomaa, että 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!