Triggers, Routines ir Events užduočių kūrimas bei naudojimas

Iš IV pagalba klientams.
Peršokti į: navigacija, paiešką

Bendro naudojimo serverių duomenų bazėse galite sukurti MySQL trigerius (angl. triggers), rutinas (angl. rutinas) bei periodiniai įvykiai (angl. events). Plačiau apie kiekvieno iš šių procesų kūrimą bei naudojimą rasite žemiau pateiktose straipsnio skiltyse:

Triggers

Trigeriu yra vadinamas objektas susietas su lentele. Šis objektas gali būti iškviečiamas tada kai konkretus veiksmas yra atliekamas duomenų bazėje. Dažniausiai trigeriai naudojami tam, kad būtų patikrinama reikšmė įvedama į lentelę bei atlikti skaičiavimus susijusius su įvedamomis reikšmėmis.

Tam, kad galėtumėte aktyvuoti trigerius, duomenų bazė turi būti sukurta serverio valdymo pulte. Kaip tai atlikti rasite kitoje mūsų pamokoje: spustelėję čia. Jeigu duomenų bazė jau sukurta, prisijunkite prie PhpMyAdmin įrankio. Rekomenduojame prisijungti naudojant būtent tos duomenų bazės, su kuria dirbsite, naudotojo vardą.

Šioje pamokoje naudojama labai paprasta duomenų bazės lentelė, kurią galima sukurti su šia SQL užklausa:


CREATE TABLE Para(Valanda INT, Komentaras VARCHAR(35));


Sukurti naują trigerį galima dviem būdais - įvedant SQL komandą arba naudojantis Triggers meniu.

Triggers-menu.png


Trigerio sukūrimas su SQL komanda

Iš viršutinės meniu juostos pasirenkame SQL, įkeliame žemiau pateiktą kodą ir spaudžiame Go.

DELIMITER //

CREATE TRIGGER TR_Para_ValandosPataisymas BEFORE INSERT ON Para FOR EACH ROW BEGIN

 IF NEW.Valanda < 0 OR NEW.Valanda >= 24 THEN
   SET NEW.Valanda = NEW.Valanda % 24;
   SET NEW.Komentaras = NOW();
 END IF;

END //

DELIMITER ;

Triggers-sql.png


Trigerio sukūrimas naudojantis "Triggers" meniu

Triggers-add.png


Pasirenkame "Add trigger" nuorodą apačioje, ir naujame lange užpildome laukelius.

Trigger-modal.png


Paskutinį laukelį galime palikti tuščią, nes jis skirtas jei norime apriboti, kuriems vartotojams vykdant veiksmus bus paleidžiamas trigeris. Dažniausiai duomenų bazėje naudojamas tik vienas naudotojas, o jeigu naudojami keli norima, kad jie visi galėtų atlikti šį veiksmą. Todėl Definer laukelį paliekame tuščią.


Naujų trigerių išbandymas

Pasitikrinimui ar mūsų aprašyti trigeriai veikia, galime paleisti keletą SQL užklausų:

INSERT INTO Para(Valanda, Komentaras) values(15, 'Penkiolika'); INSERT INTO Para(Valanda, Komentaras) values(30, 'Trisdešimt'); INSERT INTO Para(Valanda, Komentaras) values(10, 'Dešimt'); INSERT INTO Para(Valanda, Komentaras) values(0, 'Nulis'); UPDATE Para SET Komentaras = WHERE Valanda = 10;

Jeigu trigeriai sukurti korektiškai, Jums bus pateikimas šis langas:

Triggers-test.png


Ruotines

Rutinos gali būti tiek procedūros tiek funkcijos. Saugoma rutina yra SQL ataskaitų rinkinys, kuris gali būti laikomas serveryje. Kai veiksmas bus užbaigtas, naudotojams nereikia iš naujo paleisti atskirų užduočių, bet vietoj to gali naudoti saugoma rutina. Gali būti naudojama kai:

  • aplikacijos naudoja skirtingas kalbas ar veikia skirtingose platformose, tačiau duomenys turi būti saugomi vienoje duomenų bazėje;
  • kai saugumas yra svarbiausias. Pavyzdžiui, bankai visoms bendroms operacijoms naudoja išsaugotas procedūras bei funkcijas. Tai užtikrina nuoseklią ir saugią aplinką, nes įprastos procedūros gali užtikrinti, kad kiekviena operacija būtų tinkamai užregistruota. Tokioje aplinkoje programos ir vartotojai neturėtų prieigos prie duomenų bazės lentelių tiesiogiai, bet gali atlikti tik konkrečias saugomas procedūras.

Tam, kad nustatyti rutinas duomenų bazė jau turi būti sukurta. Kaip tai atlikti rasite kitoje mūsų pamokoje: spustelėję čia. Jeigu duomenų bazė jau sukurta, prisijunkite prie PhpMyAdmin įrankio. Rekomenduojame prisijungti naudojant būtent tos duomenų bazės, su kuria dirbsite, naudotojo vardą.

Šioje pamokoje naudojame labai paprasta duomenų bazės lentelė, kurią galima sukurti su šia SQL užklausa:

CREATE TABLE Para (Data DATE NULL, Valanda VARCHAR(3) NULL, Laikas DATETIME NULL); INSERT INTO Para(Data, Valanda) values('2014-12-16', '15h'); INSERT INTO Para(Data, Valanda) values('2015-02-13', '08h'); INSERT INTO Para(Data, Valanda) values('2019-06-24', '00h'); INSERT INTO Para(Data, Valanda) values('2018-10-18', '23h');

Sukurti naują funkciją arba procedurą galite įvedant SQL komandą arba naudojantis Routines meniu. Pademonstruosime pastaruoju pasirinkimu sukurtą vieną funkciją ir vieną procedūrą.

Routines.png


Funkcijos sukūrimas

Pridedame naują funkciją Routines lange pasirinkę Add routine. Atsiradusiame lange užpildome duomenis.

Function11.png


Užpildome funkcijos pavadinimą, tipą, priimamus parametrus, grąžinamą tipą, vykdomas SQL komandas.

Nustatymas Is deterministic naudingas, jei žinote, kad Jūsų funkcija su vienodais parametrais visada grąžins vienodus rezultatus. Tai padės duomenų bazei optimizuoti operacijos vykdymą. Jokiu būdu nežymėkite šio pasirinkimo jei žinote, kad funkcija gali grąžinti atsitiktinius rezultatus - atsitiktiniai rezultatai gali tapti prognozuojami.

Nustatymai Definer ir Security type mūsų pavyzdyje nenaudojami, paliekame numatytasias reikšmes. Jie skirti specifiniam teisių valdymui. Nustatymas SQL data access yra tik informacinio pobūdžio duomenų bazės administratoriui, pati duomenų bazė neatsižvelgia į šio nustatymo reikšmę.


Procedūros sukūrimas

Procedūra sukūriama analogiškai, tik tipas nurodomas Procedure vietoje Function.

Procedure.png


Pastebėkime, kad šiuo atveju kuriama procedura neturi jokių papildomų parametrų. Jie gali egzistuoti, tačiau mūsų pavyzdyje yra nebūtini. Jeigu per klaidą pašalinote, galite pridėti iš naujo pasirinkę Add parameter.

Paskutiniųjų parametrų reikšmė analogiška pagal anksčiau pateiktą funkcijos apibrėžimą.


Naujos funkcijos ir procedūros išbandymas

Pasitikrinimui ar mūsų aprašytos duomenų bazės rutinos veikia, galime paleisti šią SQL užklausą:

SELECT * FROM Para; CALL PerkeltiLaika(); SELECT * FROM Para;

Matome, kad iškviesta procedūra savo ruožtu iškvietė funkciją ir korektiškai užpildė duomenis:

Routines-test.png


Daugiau informacijos apie funkcijų ir procedūrų sintaksę rasite oficialioje MariaDB dokumentacijoje:


Events

Periodiniai įvykiai (angl. events) yra užduotis, kuri paleidžiama atsižvelgiant į nustatytą tvarkaraštį. Periodiniai įvykiai kartais vadinami laiko trigeriais, nes jie atliekami pagal laiką, bet ne pagal lentelės atnaujinimo faktą. MySQL periodiniai įvykiai atlieka tokią pačią funkciją, kaip ir UNIX naudojamos periodinės užduotys (angl. cron jobs). Periodiniai įvykiai gali būti naudojami duomenų bazės optimizavimui, išrašų valymui, duomenų archyvavimui ar ataskaitų generavimui.

Tam, kad sukurti periodinį įvykį duomenų bazė jau turi būti sukurta. Kaip tai atlikti rasite spustelėję čia. Kaip tai atlikti rasite kitoje mūsų pamokoje: spustelėję čia. Jeigu duomenų bazė jau sukurta, prisijunkite prie PhpMyAdmin įrankio. Rekomenduojame prisijungti naudojant būtent tos duomenų bazės, su kuria dirbsite, naudotojo vardą.

Šioje pamokoje naudojama labai paprasta duomenų bazės lentelė, kurią galima sukurti su šia SQL užklausa:

CREATE TABLE Para (ID INT NOT NULL AUTO_INCREMENT, Laikas DATETIME NOT NULL, PRIMARY KEY(ID));

Sukurti naują įvykį galima įvedant SQL komandą arba naudojantis Events meniu. Pademonstruosime pastaruoju pasirinkimu sukurtą įvykį.

Events1.png


Įvykio sukūrimas

Pridedame naują įvykį Events lange pasirinkę Add event. Atsiradusiame lange užpildome duomenis.

Add-new.png


Užpildome įvykio pavadinimą, statusą, pasirenkame ar tai bus vienkartinis ar pakartotinai leidžiamas įvykis, vykdomas SQL komandas.

Vienkartinis įvykis bus paleidžiamas tik vieną kartą nurodytu metu. Pakartotinai leidžiamiems įvykiams galime nurodyti kada jie pradeda ir baigia galioti (nenurodžius bus imamas dabartinis laikas), taip pat galime nurodyti pakartojimo dažnumą, pavyzdžiui: kartą per minutę, kas šešias valandas, kas savaitę, kas ketvirtį, kiekvienų metų penktą mėnesį, ir t.t.

Jei nebus pažymėtas nustatymas On completion preserve tai įvykio apibrėžimas bus automatiškai ištrintas po jo įvykdymo, jei jis buvo vienkartinis arba baigėsi jo galiojimas pakartotiniame leidime. Nustatymas Definer mūsų pavyzdyje nenaudojamas, jis skirtas specifiniam teisių valdymui.


Naujo įvykio išbandymas

Kadangi mūsų pavyzdyje sukurtas įvykis apibrėžtas kartotis kas minutę, tai jo veikimu galime įsitikinti šiek tiek palaukę po jo sukūrimo:

Events-test.png


Daugiau informacijos apie funkcijų ir procedūrų sintaksę rasite oficialioje MariaDB dokumentacijoje: