Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Laukaisimet | Joitakin Lisäaiheita
Edistyneet SQL-Tekniikat

bookLaukaisimet

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-tietuetta NEW: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ä!

question mark

Mikä on triggerien ensisijainen tarkoitus tietokannassa?

Select the correct answer

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

Suggested prompts:

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

bookLaukaisimet

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-tietuetta NEW: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ä!

question mark

Mikä on triggerien ensisijainen tarkoitus tietokannassa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 1
some-alt