Laukaisimia
Pyyhkäise näyttääksesi valikon
Triggerit tietokannoissa ovat erityisiä tallennettuja proseduurityyppejä, jotka suoritetaan automaattisesti tiettyjen tapahtumien tai toimintojen tapahtuessa tietokannassa.
Näitä tapahtumia voivat olla taulujen rivien lisäykset, päivitykset tai poistot sekä muutokset tietokannan skeemaobjekteihin, kuten tauluihin tai näkymiin.
DML-triggerit
DML-triggeri (Data Manipulation Language trigger) on tietokantaobjekti, joka suorittaa automaattisesti määritellyn toiminnon, 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) taulussa;
- Before-triggerit: Nämä triggerit laukeavat ennen toimintoa. Niiden avulla voidaan keskeyttää alkuperäinen toiminto ja suorittaa mukautettua logiikkaa ennen päätöstä jatkaa alkuperäistä toimintoa.
After-triggerin esimerkki
Olemme aiemmin tarkastelleet esimerkkiä, jossa transaktiolla lisätään 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-taulussa ilman transaktiota.
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();
-
Luo after insert -trigger user_logs-taululle:
- Luo funktio nimeltä
afterinserttriggerfunction(). - Funktio määritellään palauttamaan triggerin.
- Funktion runko alkaa
BEGIN-lohkolle. BEGIN-lohkon sisällä suoritetaan toiminto, jossa lisätään riviuserlogs-tauluun.- Lisätty rivi sisältää arvot laukaisevan tapahtuman
NEW-riviltä. - Lisättävät arvot sisältävät
accountnumber-kentän ja yhdistetyn merkkijonon, joka kertoo toiminnosta. - Funktio palauttaa
NEW-rivin. - Funktio on kirjoitettu
plpgsql-kielellä.
- Luo funktio nimeltä
-
Liitä trigger bankaccounts-tauluun:
- Luodaan trigger nimeltä
afterinserttrigger. - Trigger asetetaan suorittamaan
INSERT-operaation jälkeenbankaccounts-taulussa. - Trigger suorittaa
afterinserttriggerfunction-funktion jokaiselle vaikuttavalle riville.
- Luodaan trigger nimeltä
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ä, tulee käyttää OLD-tietuemuuttujaa NEW:n sijaan.
Esimerkki before-triggeristä
Oletetaan, että halutaan estää negatiivisen tilisaldon lisääminen. Voidaan luoda BEFORE-triggeri tämän saavuttamiseksi. Tämä triggeri 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();
-
Luo trigger-funktio:
- Luo tai korvaa funktio nimeltä
before_insert_userlogs(). - Funktio määritellään palauttamaan triggerin.
- Funktion runko alkaa
BEGIN-lohkolla. BEGIN-lohkon sisällä tarkistetaan, onko tilin saldo alle 0.- Jos saldo on alle 0, annetaan huomautus eikä toimintoa kirjata. Funktio palauttaa NULL estääkseen lisäyksen.
- Jos saldo on suurempi tai yhtä suuri kuin 0, annetaan huomautus, että toiminto kirjataan.
- Funktio lisää rivin
userlogs-tauluun, käyttäen arvojaNEW-riviltä. - Lisätyt arvot sisältävät
accountnumber-kentän ja yhdistetyn merkkijonon, joka ilmaisee toiminnon. - Funktio palauttaa
NEW, jolloin lisäys sallitaan. - Funktio on kirjoitettu
plpgsql-kielellä.
- Luo tai korvaa funktio nimeltä
-
Luo trigger:
- Trigger nimeltä
before_insert_userlogs_triggerluodaan. - Trigger asetetaan suorittamaan ennen
INSERT-operaatiotabankaccounts-taulussa. - Trigger suorittaa
before_insert_userlogs()-funktion jokaiselle vaikuttavalle riville.
- Trigger nimeltä
Triggerin luontimalli
Voimme havaita tyypillisen mallin triggerien luomisessa: ensin määritellään funktio, joka suorittaa tietyn logiikan ennen tai jälkeen operaation. Tämän jälkeen liitetään tämä funktio triggeriksi tiettyyn tauluun ja tapahtumaan.
Huomioi 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 huomaa, 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