Triggereiden käyttö

Miten voin luoda kahden eri kannoissa olevien taulujen välille triggerin, joka "nuuskii" ekassa taulussa tapahtuvia muutoksia tietyssä kentässä (eli sarakkeessa) ja päivityksen tapahtuessa (UPDATE tai INSERT) tämä käy päivittämässä myös toisessa taulussa olevat näitä vastaavat tiedot? Jos mahdollista niin jokin yksinkertaistettu esimerkki. Syntaksi lienee jotakin tyyliin (?):


CREATE TRIGGER triggerin_nimi
AFTER UPDATE ON taulu_1
FOR EACH ROW
BEGIN
UPDATE taulu_2
SET jokin_kenttä = jokin_toinen_kenttä
END


Olenko ihan hakoteillä...?
Kiitos vastauksista.
5581
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

>Olenko ihan hakoteillä...?

Et suinkaan.

Pienenä tarkennuksena voi tietysti mainita että trigger ei ole mitenkään sidottu kahden taulun välille vaan sen liipaisun aiheuttamia toimia voi tehdä mille tahansa taululle.

Lisätietoja tuolta:

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

Äänestä
  • Ongelma johtui DELIMITER:n puuttumisesta. Nyt seuraa jatkokysymys: miten saan selville, mitä riviä triggeri kulloinkin on käsittelemässä? Saako tämän jollakin tavalla esim. muuttujan sisällöksi, jota sql-koodi käyttää eri toimenpiteisiin identifioidessaan mille riville vastaavat tiedot pitää päivittää toisessa taulussa?

    Äänestä

  • MySQL aloittelija kirjoitti:

    Ongelma johtui DELIMITER:n puuttumisesta. Nyt seuraa jatkokysymys: miten saan selville, mitä riviä triggeri kulloinkin on käsittelemässä? Saako tämän jollakin tavalla esim. muuttujan sisällöksi, jota sql-koodi käyttää eri toimenpiteisiin identifioidessaan mille riville vastaavat tiedot pitää päivittää toisessa taulussa?

    Sain vaikutelman, ettet oikein ymmärtänyt esimerkeissä olleita ideoita. Katsotaanpa tätä hieman tarkemmin.

    Meillä on siis seuraavat taulut:

    Pelaajat
    --------
    id
    etunimi
    sukunimi
    tehdyt_maalit
    syotetyt_maalit

    Maalit
    ------
    aika
    tekija (pakollinen kenttä, siis NOT NULL)
    syottaja (ei pakollinen kenttä, koska syöttäjää ei välttämättä ole, NULL-arvot sallittuja)


    Meillä on kolme triggeriä, jotka reagoivat, kun maalit-taulussa tapahtuu jotain – kun rivejä lisätään, poistetaan tai päivitetään. Tämä alempana oleva triggeri nuuskii, tapahtuiko tekijän tai syöttäjän muutos. Jos tapahtui, niin pelaajat-taulussa olevia laskureita päivitetään.

    Seuraava on tärkeä ymmärtää:

    Mistä tietää, muutettiinko maalin tekijää?
    Systeemillä on tiedossaan kenttien arvot ennen ja jälkeen päivityksen. Näihin voidaan viitata käyttäen etuliitteitä NEW tai OLD. Triggerin ensimmäisellä rivillä on tämä tutkimus:

    if NEW.tekija OLD.tekija.

    Jos todetaan tämän olevan totta – siis tekijää ollaan vaihtamassa – tehdään kaksi päivitystä pelaajat-tauluun. Aluksi vähennetään 1 maali siltä pelaajalta, jolle maali ensin oli kirjattu. Where-ehdossa kirjoitetaan tällöin id = OLD.tekija. Tämän jälkeen lisätään 1 maali sille pelaajalle, joka korjattiin maalintekijäksi. Tähän viitataan sanomalla id = NEW.tekija.

    Siis kulloinkin triggerissä päivitettävänä olevan rivin arvoihin voidaan viitata käyttämällä etuliitteitä NEW tai OLD. Tätähän sinä et kaiketi oikein ymmärtänyt? Huomaa myös, että jos rivi on uusi, niin vain NEW-arvoja on olemassa. Poistoa tehtäessä vain OLD-arvot ovat olemassa.

    Sitten seuraa vastaava tutkimus maalin syöttäjästä. Tässä tehdään samantapaiset operaatiot kuin edellä.


    CREATE TRIGGER tekija_korjaus after UPDATE ON maalit
    FOR EACH ROW

    BEGIN

    if NEW.tekija OLD.tekija then
    UPDATE pelaajat
    SET tehdyt_maalit = tehdyt_maalit - 1
    WHERE id = OLD.tekija;

    UPDATE pelaajat
    SET tehdyt_maalit = tehdyt_maalit 1
    WHERE id = NEW.tekija;

    end if;


    if ifnull(NEW.syottaja, 0) ifnull(OLD.syottaja, 0) then

    if OLD.syottaja is not null then
    UPDATE pelaajat
    SET syotetyt_maalit = syotetyt_maalit - 1
    WHERE id = OLD.syottaja;
    end if;

    if NEW.syottaja is not null then
    UPDATE pelaajat
    SET syotetyt_maalit = syotetyt_maalit 1
    WHERE id = NEW.syottaja;
    end if;

    end if;

    END

    Äänestä

  • I.Proqatlis kirjoitti:

    Sain vaikutelman, ettet oikein ymmärtänyt esimerkeissä olleita ideoita. Katsotaanpa tätä hieman tarkemmin.

    Meillä on siis seuraavat taulut:

    Pelaajat
    --------
    id
    etunimi
    sukunimi
    tehdyt_maalit
    syotetyt_maalit

    Maalit
    ------
    aika
    tekija (pakollinen kenttä, siis NOT NULL)
    syottaja (ei pakollinen kenttä, koska syöttäjää ei välttämättä ole, NULL-arvot sallittuja)


    Meillä on kolme triggeriä, jotka reagoivat, kun maalit-taulussa tapahtuu jotain – kun rivejä lisätään, poistetaan tai päivitetään. Tämä alempana oleva triggeri nuuskii, tapahtuiko tekijän tai syöttäjän muutos. Jos tapahtui, niin pelaajat-taulussa olevia laskureita päivitetään.

    Seuraava on tärkeä ymmärtää:

    Mistä tietää, muutettiinko maalin tekijää?
    Systeemillä on tiedossaan kenttien arvot ennen ja jälkeen päivityksen. Näihin voidaan viitata käyttäen etuliitteitä NEW tai OLD. Triggerin ensimmäisellä rivillä on tämä tutkimus:

    if NEW.tekija OLD.tekija.

    Jos todetaan tämän olevan totta – siis tekijää ollaan vaihtamassa – tehdään kaksi päivitystä pelaajat-tauluun. Aluksi vähennetään 1 maali siltä pelaajalta, jolle maali ensin oli kirjattu. Where-ehdossa kirjoitetaan tällöin id = OLD.tekija. Tämän jälkeen lisätään 1 maali sille pelaajalle, joka korjattiin maalintekijäksi. Tähän viitataan sanomalla id = NEW.tekija.

    Siis kulloinkin triggerissä päivitettävänä olevan rivin arvoihin voidaan viitata käyttämällä etuliitteitä NEW tai OLD. Tätähän sinä et kaiketi oikein ymmärtänyt? Huomaa myös, että jos rivi on uusi, niin vain NEW-arvoja on olemassa. Poistoa tehtäessä vain OLD-arvot ovat olemassa.

    Sitten seuraa vastaava tutkimus maalin syöttäjästä. Tässä tehdään samantapaiset operaatiot kuin edellä.


    CREATE TRIGGER tekija_korjaus after UPDATE ON maalit
    FOR EACH ROW

    BEGIN

    if NEW.tekija OLD.tekija then
    UPDATE pelaajat
    SET tehdyt_maalit = tehdyt_maalit - 1
    WHERE id = OLD.tekija;

    UPDATE pelaajat
    SET tehdyt_maalit = tehdyt_maalit 1
    WHERE id = NEW.tekija;

    end if;


    if ifnull(NEW.syottaja, 0) ifnull(OLD.syottaja, 0) then

    if OLD.syottaja is not null then
    UPDATE pelaajat
    SET syotetyt_maalit = syotetyt_maalit - 1
    WHERE id = OLD.syottaja;
    end if;

    if NEW.syottaja is not null then
    UPDATE pelaajat
    SET syotetyt_maalit = syotetyt_maalit 1
    WHERE id = NEW.syottaja;
    end if;

    end if;

    END

    Tämä tieto oli ratkaiseva!

    "Systeemillä on tiedossaan kenttien arvot ennen ja jälkeen päivityksen. Näihin voidaan viitata käyttäen etuliitteitä NEW tai OLD."

    Kiitän!

    Äänestä

Kommentoi aloitusta


MySQL aloittelija kirjoitti:

Miten voin luoda kahden eri kannoissa olevien taulujen välille triggerin, joka "nuuskii" ekassa taulussa tapahtuvia muutoksia tietyssä kentässä (eli sarakkeessa) ja päivityksen tapahtuessa (UPDATE tai INSERT) tämä käy päivittämässä myös toisessa taulussa olevat näitä vastaavat tiedot? Jos mahdollista niin jokin yksinkertaistettu esimerkki. Syntaksi lienee jotakin tyyliin (?):


CREATE TRIGGER triggerin_nimi
AFTER UPDATE ON taulu_1
FOR EACH ROW
BEGIN
UPDATE taulu_2
SET jokin_kenttä = jokin_toinen_kenttä
END


Olenko ihan hakoteillä...?
Kiitos vastauksista.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu