Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Laukaisimia | Joitakin Lisäaiheita
SQL-optimointi ja kyselyominaisuudet

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();
Kyselyn kuvaus
expand arrow
  • 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 rivi userlogs-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ä.
  • Liitä trigger bankaccounts-tauluun:

    • Luodaan trigger nimeltä afterinserttrigger.
    • Trigger asetetaan suorittamaan INSERT-operaation jälkeen bankaccounts-taulussa.
    • Trigger suorittaa afterinserttriggerfunction-funktion jokaiselle vaikuttavalle riville.
Note
Huomio

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();
Kyselyn kuvaus
expand arrow
  • 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 arvoja NEW-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 trigger:

    • Trigger nimeltä before_insert_userlogs_trigger luodaan.
    • Trigger asetetaan suorittamaan ennen INSERT-operaatiota bankaccounts-taulussa.
    • Trigger suorittaa before_insert_userlogs()-funktion jokaiselle vaikuttavalle riville.

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ä!

question mark

Mikä on triggerien ensisijainen tarkoitus tietokannassa?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 1

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 3. Luku 1
some-alt