Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 13

TRIGERI

1
Trigeri u MySQL-u
ta su trigeri ?
Trigeri su objekti (uskladitene procedure) pridrueni tabeli,
koji se automatski aktiviraju kada se desi neki dogaaj vezan
za tu tabelu.

Uvedeni su u verziji 5.02 Alpha

Mogu se uspeno koristiti za validaciju podataka i druge


operacije direktno nad tabelama baze podataka.

Kada se trigeri aktiviraju ?


Trigeri se aktiviraju kada se desi neka promena u pridruenoj
tabeli, preciznije prilikom izvrenja Insert / Update / Delete
naredbi.

2
Trigeri u MySQL-u

Trigeri ne mogu biti korieni u SELECT naredbi na


isti nain kao procedura ili funkcija.

Kreiranje trigera sintaksa


CREATE TRIGGER naziv_trigera
vreme_izvravanja_trigera
dogaaj
ON tbl_name
FOR EACH ROW trigger_stmt
3
Trigeri u MySQL-u
Vreme izvravanja trigera:
BEFORE
AFTER

Dogaaj
je ona akcija ije izvravanje na pridruenoj tabeli
uzrokuje aktiviranje trigera. Moe biti:
INSERT
UPDATE
DELETE
4
Trigeri u MySQL-u
Primer : Validacija vrednosti polja

CREATE TABLE test (id INT, sum DECIMAL(10,2));


DELIMITER $$
CREATE TRIGGER insert_trig
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
IF new.sum<0 THEN
SET new.sum=0;
ENDIF;
END$$
DELIMITER;
5
Trigeri u MySQL-u
Kako trigeri funkcioniu ?
Kljuna re BEFORE opredeljuje vreme izvrenja trigera.
U ovom sluaju, triger e biti aktiviran pre svakog novog upisa zapisa u
tabelu test.
Kljune rei FOR EACH ROW oznaavaju da e triger biti izvren za svaki
novi slog.

Kljune rei OLD i NEW nam omoguavaju pristup vrednostima polja u


zapisima na koje se odnosi triger.

U INSERT trigeru moe se koristiti samo NEW.ime_polja

U DELETE trigeru moe se koristiti samo OLD.ime_polja

6
Trigeri u MySQL-u
OLD i NEW
Kljune rei OLD i NEW se koriste za pristup podacima
u zapisima tabele. OLD se koristi za vrednosti polja pre
promene, a NEW sadri vrednost polja posle promene.
U programu, polju koje se zove emp_name moemo
pristupiti na sledei nain: new.emp_name

Primer:
create trigger bi_zaposleni_fer
before insert on zaposleni
for each row
set new.ime := reverse(new.ime); 7
Trigeri u MySQL-u
Da bi se triger aktivirao potrebno je da zapis bude
dodat u odgovarajuu tabelu.

Primer:

insert into zaposleni (zaposleni,ime) values (4,Pera);

8
Trigeri u MySQL-u
Kompleksni trigeri
Trigeri koji sadre vie od jedne linije koda
Tada se koriste kljune rei BEGIN i END koje imaju svrhu
da oznae kompajleru poetak i kraj koda trigera
Brisanje trigera
DROP TRIGGER naziv_trigera;
Prikazivanje trigera
SHOW TRIGGERS;

9
Trigeri u MySQL-u
Primer:
create trigger bi_zaposleni_fer
before insert on zaposleni
for each row
begin
declare duzina numeric;
set duzina = length(new.ime);
set new.plata = new.plata * duzina;
end
10
Zadatak:
a) Kreirati proceduru PROSEK kojom se za
odreenog studenta (ulazni argument stud_ID)
izraunava prosena ocena (izlazna promenljiva
prosek)
b) Kreirati trigger UPISPROSEKA koji se aktivira
prilikom unosa novih ocena u tabeli ISPITI i
upisuje prosene ocene (koristei proceduru
prosek) u tabeli STUDENTI .
Ispit Studenti

11
Reenje a):

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `prosek`(IN stud_ID int, OUT prosek float)


BEGIN
/*Procedura prima ulazni argument stud_ID koji definise za kojeg je studenta potrebno izracunati prosek.
Izlaznom promenljivom prosek procedura vraca prosek za trazenog studenta. */
SELECT AVG(ocena)
INTO prosek
FROM ispit
WHERE (broj_indeksa=stud_ID) AND (ocena<>5);
/*U promenljivu prosek se upisuje rezultat agregatne funkcije AVG.
Uzimamo samo one zapise o ispitu za odredjenog studenta gde je polozio (ocena vea od 5).*/
END

12
Reenje b):
/*Pretpostavka je da je moguce uneti vise n-torki odjednom
pa deklarisemo kursor koji ce obraditi jednu po jednu n-torku.*/
OPEN cur_studenti;

-- Trigger DDL Statements


/*Popunjavamo kursor.*/
DELIMITER $$
FETCH cur_studenti INTO stud_ID;
USE `test`$$

/*Uzimamo prvi stud_ID u promenljivu stud_ID*/


CREATE
WHILE (NOT cursor_end) DO
DEFINER=`root`@`localhost`
TRIGGER `test`.`UnesiProsek`
/*Dokle god je uspesno preuzet sledeci zapis:*/
AFTER INSERT ON `test`.`ispit`
call prosek(stud_ID,@prosek);
FOR EACH ROW
/*poziva procedura koja za datog studenta racuna prosek*/
BEGIN
UPDATE studenti SET prosek=@prosek WHERE
DECLARE stud_ID int;
broj_indeksa=stud_ID;
DECLARE prosek float;
/*postavlja atribut prosek za trenutnog studenta na novu
DECLARE cursor_end BOOLEAN DEFAULT false; vrednost koja je izracunata u proceduri.*/
FETCH cur_studenti INTO stud_ID;
/*Dve pomocne promenljive. Jedna za preuzimanje stud_ID /*Uzmi sledeceg studenta i ponovno izvodjenje petlje
iz kursora, druga u koju ce se upisati prosek u slucaju da u kursoru ima jos studenata.*/
koji izracuna procedura.*/ END WHILE;
CLOSE cur_studenti;
DECLARE cur_studenti CURSOR FOR /*Zatvaranje kursora.*/
SELECT broj_indeksa FROM studenti; END$$

-- deklaracija hendlera
DECLARE continue HANDLER FOR SQLSTATE '02000'
SET cursor_end = true; 13

You might also like