Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
VELEUČILIŠTE U RIJECI
Sustavi baza podataka
OKIDAČI (TRIGGERS)
(seminarski rad)
Rijeka, 2014.
VELEUČILIŠTE U RIJECI
Poslovni odjel
Stručni studij informatike
Sustavi baza podataka
OKIDAČI (TRIGGERS)
(seminarski rad)
STUDENT:
. Marko Fresl
Rijeka, travanj 2014.
SADRŽAJ
1. UVOD ..................................................................................................................................... 1
2. OKIDAČ (TRIGGERS) ......................................................................................................... 2
2.1.Vrste okidača ............................................................................................................ 2
2.2.Namjena okidača ..................................................................................................... 3
3.STRUKTURA ........................................................................................................................ 4
3.1.Trigger_name ........................................................................................... 4
3.2. FOR | AFTER | INSTEAD OF .................................................................... 5
3.3. [DELETE] [,] [INSERT] [,] [UPDATE] ....................................................... 5
3.4. WITH APPEND ....................................................................................... 5
3.5. NOT REPLICATION ............................................................................... 5
4.PRIMJER OKIDAČA ............................................................................................................ 7
5.BRISANJE OKIDAČA .......................................................................................................... 8
6.ZAKLJUČAK ......................................................................................................................... 9
7. LITERATURA .................................................................................................................... 10
1
1.UVOD
Okidači (triggri) su podvrsta pohranjenih procesa. Prvo se trebaju definirati
pohranjene procedure. Pohranjena procedura je zbirka SQL naredbi prevedena i pohranjena u
bazu podataka pod vlastitim imenom koje se izvodi kao nedjeljiva logična cjelina. Osim
pohranjenih procedura koje korisnik kreira u SQL-u, postoji niz sistemskih procedura koji se
izvode različite sistemske operacije. Trigger ili okidač, kao što je navedeno, je posebna vrsta
pohranjene procedure koja se izvodi u određenoj tablici nakon promjene podataka.
Prvenstvena primjena okidača je osiguravanje referencijalnog integriteta (zaštita od pogrešnog
unosa) podataka u bazi podataka. Dakle, vrlo često niz operacija nad podacima u bazi
podataka predstavlja jednu nedjeljivu logičku cjelinu. Umjesto da se takve naredbe stalno
upisuju, prevode i izvode, mogu se spremati u pohranjenu proceduru. Pohranjena procedura se
nakon prevođenja sprema u bazu podataka, a po potrebi se može pozvati iz programskog
rješenja ili odgovarajućeg alata SQL-a. Primjer pohranjene procedure mogao bi biti niz SQL
naredbi koje iz normalnih tablica pune denormaliziranu tablicu za ispis podataka. Budući da
su pohranjene procedure kreirali profesionalni programeri, krajnjem korisniku baze podataka
nije omogućeno da „zaviri“ u pohranjenu proceduru jer se koristi šifriranje procedure u
čovjeku nečitljivom obliku. U određenim slučajevima najbolji način za ažuriranje podataka u
bazi je korištenje posebne vrste pohranjenih procedura-okidača (trigger). Svakodnevni primjer
je da nakon svake narudžbe nekog artikla treba ažurirati i postojeće zalihe. Najjednostavniji
način je postavljanje okidača (trigger-a) u tablici narudžbe, čijim se izvođenjem automatski
ažurira tablica zaliha. U daljnjem seminarskom radu biti će detaljnije objašnjeni primjeri
okidača, vrste, gdje se točno i kako koriste, njegova struktura i primjena. Cilj rada je slušatelje
bolje upoznati s triggerom i njegovim mogućnostima.
2
2. OKIDAČ (TRIGGER)
Okidači (triggeri) predstavljaju posebnu vrstu pohranjenih procedura koje se
automatski izvode nakon točno definiranog izvođenja neke operacije nad podatcima u tablici
(npr. dodavanje novog reda (INSERT), ažuriranje postojećeg reda (UPDATE) ili brisanju
retka (DELETE)). Kod triggera razlikujemo tri komponente: događaj, koji predstavlja upravo
određenu modifikaciju, uvjet, koji predstavlja provjeru određenog uvjeta da bi trigger bio
pokrenut. Rezultat provjere uvjeta je TRUE ili FALSE. Ako je uvjet ispunjen pokreće se
automatski akcija. Funkcionalnost koju triggeri daju bazi podataka očituje se preko posebnog
naziva – aktivna baza podataka. Na jednoj tablici dozvoljeno je kreiranje višeg broja okidača1.
2
2.1.Vrste okidača
1.Before triggers
-izvršavaju se prije SQL akcije na koju se odnose
-ovi triggeri ne mogu mijenjati tablice, ali se koristiti za provjeru ulaznih vrijednosti u
stupcima, tj. omogućuju prethodne operacije i provjere3
2.After triggers
-izvršavaju se poslije SQL naredbe na koju se odnose, a nakon umetanja, brisanja ili
nadogradnje mogu se koristiti na različite načine:
mogu ažurirati, umetati ili brisati podatke u istim ili drugim tablicama
mogu provjeriti podatke s vrijednostima podataka u ostatku tablice ili u drugim
tablicama
mogu koristiti korisničko-definirane funkcije za aktivaciju ne definiranih operacija
baza podataka4
1 https://imi.pmf.kg.ac.rs/component/docman/doc_view/146-baze-podataka-1-sql-server-primeri-nastavak.html
2 v.pred. mr.sc. Damir Vuk, Baze podataka, Visoka škola za menadžment
www.vsmti.hr (16.01.2013.) 3 https://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Fsqlp%2Frbafybeforesql.htm
4http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.dbobj.doc
%2Fdoc%2Fc0023339.html
3
3.Instead of triggers
-koriste se kod View-a koje inače nije moguće direktno mijenjati
-omogućuju promjenu na tabelama nad kojima je View definiran te također omogućuju:
ignoriranje nekih dijelova tablice
ako dio tablice nije obradiv prijavljuju problem
poduzimanju alternativnih rješenja ako je došlo do neke pogreške (Error)5
2.2.Namjena okidača
Okidači se mogu koristiti za sljedeće:
evidentiranje i kontrolu promjena nad podacima
implementaciju integritetskih ograničenja
ažuriranje izvedenih atributa (npr. stanje računa)
praćenje rada korisnika (logiranje pristupa bazi ...)
Kaskadne operacije – trigger može nakon detekcije određene operacije izazvati niz
povezanih aktivnosti
Definirati i održavati vrlo složene veze među podacima – daleko složenije nego što su
referencijalne veze (složenija poslovna pravila)
Pozivati izvršenje uskladištenih procedura67
5 http://technet.microsoft.com/en-us/library/aa175158%28v=sql.80%29.aspx
6 v.pred. mr.sc. Damir Vuk, Baze podataka, Visoka škola za menadžment
www.vsmti.hr (16.01.2013.) 7 http://www2.fsr.ba/nastava/baze/vjezbe/BP2_2_Procedure_Okidaci.pdf
4
3.STRUKTURA
Naredba za kreiranje triggera je CREATE TRIGGER i ima sljedeću sintaksu:
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}8
3.1. Trigger_name
Trigger_name je naziv novog okidača koji se kreira na tablici ili pogledu. Kao i kod
ostalih pohranjenih procedura, dozvoljeno je šifriranje okidača zbog njegove zaštite pred
neovlaštenim pregledom i kopiranjem (WITH ENCRYPTION).
8http://www.google.hr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCcQFjAA&url=http%3A%2F
%2Fwww.etfos.unios.hr%2Fupload%2FOBAVIJESTI%2Fobavijesti_strucni%2F45077baze_podataka_lv5.doc
&ei=tltKU5KZCIWJzAP59YHoDw&usg=AFQjCNEjWA6EIAOS2Ja2Wxeo9HFg528Xsg
5
3.2. FOR | AFTER | INSTEAD OF
Pomoću operatora AFTER ili INSTEAD OF definira se vrsta okidača. Ako je kao
vrijednost navedena riječ AFTER, kreira se okidač koji se izvodi samo nakon uspješno
izvedene SQL naredbe. To je ujedno i podrazumijevana vrijednost operatora. Ako je kao
vrijednost riječ INSTEAD OF, kreira se okidač koji se izvodi umjesto SQL naredbe
(dozvoljeno je kreiranje jednog takvog okidača po tablici).
3.3. [DELETE] [,] [INSERT] [,] [UPDATE]
Navođenjem jedne ili više vrijednosti definiraju se vrste naredbi za aktiviranje
okidača, npr. Navođenje vrijednosti INSERT, UPDATE, aktiviranje okidača izvodi se u
slučaju izvođenja INSERT ili UPDATE naredbe u tablici.
3.4. WITH APPEND
Operator se koristi u slučaju da naknadno namjeravamo kreirati dodatne okidače na
tablici ili pogledu. Zadržan je zbog kompatibilnosti sa starijim verzijama SQL-a, dok ga na
novijim verzijama nije potrebno navoditi.
3.5. NOT REPLICATION
U slučaju navođenja operatora NOT REPLICATION, okidač se ne izvodi tijekom
postupka replikacije podataka.9
9 http://technet.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx
6
Posebnost okidača, u odnosu na druge vrste pohranjenih procedura, je automatsko kreiranje
dodatnih logičkih tablica s nazivima: deleted i inserted. Po svojoj strukturi te tablice identične
su osnovnoj tablici na kojoj je definiran okidač, a sadrže redove izmijenjene (ili obrisane)
izvođenjem SQL naredbe na osnovnoj tablici. Tablica deleted sadrži sve obrisane redove, a
tablica inserted izmijenjene redove (uključujući i nove redove). Na temelju vrijednosti ovih
tablica (preuzetih SELECT naredbom), možemo izvoditi potrebe operacije u okviru okidača.
Pomoću operatora IF UPDATE() i IF COLUMNS_UPDATED možemo izvoditi provjere
izmjena na točno određenom stupcu. Prvi oblik zahtjeva navođenje stupca nad kojim se izvodi
provjera, a drugi posebne maske na razini bitova, npr. ako tablica ima četiri stupca, a želimo
provjeriti da li je došlo do promjene prva tri stupca, onda kao vrijednost maske treba navesti
broj 7 (1+2+4=7).
Najvažnija primjena okidača je implementacija različitih poslovnih pravila u bazi
podataka, npr. ažuriranje podataka u jednoj tablici mora se automatski odraziti na sadržaj
druge tablice. Kod izvođenja okidača dozvoljeno je njihovo rekurzivno izvođenje (jedan
okidač izravno ili neizravno pokreće izvođenje drugog okidača) ako je to definirano trenutno
aktivnim parametrima na SQL-u.10
10
http://technet.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx
7
4. PRIMJER OKIDAČA
U ovom poglavlju pokušati ćemo objasniti rad okidača na određenom primjeru kako
bih lakše mogli dobiti pogled u način njegova rada.
CREATE TRIGGER provjerastudenata ON Studenti FOR DELETE
AS /* Ako je koji student izbrisan */
IF (SELECT COUNT(*)) FROM Sustavi_baza_podataka , Izbrisano
WHERE Sustavi_baza_podataka.student=Izbrisano.brojstu) >0
BEGIN
ROLLBACK TRANSACTION
PRINT “Student se ne može brisati jer pohađa kolegij Sustavi baza
podataka”
RAISERROR 1234
END
U ovom primjeru okidač prekida nedozvoljenu transakciju te vraća bazu u konzistentno
stanje, no ako su npr. podaci o studentima zapisani u tabeli "students", a podaci o kolegiju u
tabeli "collage", slijedeći trigger (pod nazivom: update_student_address) će osigurati
konzistentnu promjenu u podacima o kolegijima kada se u podacima o studentima promijeni
adresa :
CREATE TRIGGER update_student_address UPDATE OF address ON students
BEGIN
UPDATE collage SET address = new.address WHERE student_name = old.name;
END;
Taj trigger će prilikom izvršenja naredbe:
UPDATE students SET address='Vukovarska 58' WHERE name='Veleuciliste u
Rijeci';
8
izazvati automatsko izvršenje naredbe:
UPDATE collage SET address=Vukovarska 58' WHERE studnet_name='Veleuciliste
u Rijeci';
Napomenimo da tablice "students" i "collage" nisu dobro normalizirane i nemaju uspostavljen
referencijalni integritet, ali to nije bitno u ovom primjeru.11
5.BRISANJE OKIDAČA
Naredba za brisanje okidača glasi DROP TRIGGER, a sintaksa izgleda sljedeće:
DROP TRIGGER { trigger } [ ,...n ]
Trigger predstavlja okidač za uklanjanje, dok n pokazuje da je moguće navesti više okidača
koji se moraju obrisati. Moguće je ukloniti okidač ne navodeći tablicu. Kad se obriše tablica
svi vezani okidači također se brišu. Kad se obriše okidač on se briše iz sysobject i
syscomments sistemske tablice. Dakle,za brisanje okidača koristi se drop trigger, za kreiranje
create trigger, a alter trigger se koristi ako je postojeći okidač potrebno izmijeniti12
11
v.pred. mr.sc. Damir Vuk, Baze podataka, Visoka škola za menadžment
www.vsmti.hr (16.01.2013.) 12
http://msdn.microsoft.com/en-us/library/aa258846%28SQL.80%29.aspx
9
6.ZAKLJUČAK
Prije baze podataka nisu znale uspostaviti referencijalni integritet (zaštita od
pogrešnog unosa), nije bilo Foreign Key-eva i trebalo je pronaći način kako osigurati neku
kontrolu nad podatcima. Okidači su se koristili za stvari tipa „nije moguće izbrisati slog u
tablici ako već isti postoji u drugoj navedenoj u sintaksi“. Danas to sve radi Foreign Key
Constrint. Također su se radili okidači za stvari tipa „kad obrišem određeni slog, želim da se
automatski obrišu svi odgovarajući slogovi u drugoj navedenoj tabeli“. Danas to također radi
Foreign Key kad mu se doda delete on cascade ili on update cascade. S jedne strane teorija o
upotrebi okidača pada u vodu. Teorija pokazuje da dobro normalizirana baza podataka nema
potrebu za okidačima, no to nažalost u praksi nije slučaj, nisu baš uvijek sve tablice u bazi
podataka dobro normalizirane. Ovisno o tome koliko je baza podataka normalizirana, na isti
način se javlja za većom ili manjom potrebom uporabe okidača. Okidači su potrebni kada
želimo čuvati povijest. Prije nego se desi update ili delete u tablici, redovi koji se mijenjaju ili
brišu, šalju se u tablicu povijesti. Na samoj tablici povijesti nisu potrebne nikakve promijene
ni update ni delete. To omogućava sam okidač for update, delete na tablici povijesti, koji ima
samo jednu naredbu – rollback.
Problem sa okidačima je taj da su teški za pisanje, tj. sintaksa se sporije uči i sporo se
izvršavaju. Tko ne zna dobro normalizirati tablicu i pravilno koristiti Foreign Key mora pisati
okidače (triggere).
10
7.LITERATURA
1.http://social.msdn.microsoft.com/Search/en-
US?query=trigger&emptyWatermark=true&searchButtonTooltip=Search%20MSDN&ac=4
2.https://imi.pmf.kg.ac.rs/component/docman/doc_view/146-baze-podataka-1-sql-server-primeri-nastavak.html
3.http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.dbobj.doc
%2Fdoc%2Fc0023339.html
4.https://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Fsqlp%2Frbafybeforesql.htm
5.http://technet.microsoft.com/en-us/library/aa175158%28v=sql.80%29.aspx
6.http://www2.fsr.ba/nastava/baze/vjezbe/BP2_2_Procedure_Okidaci.pdf
7.http://www.google.hr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCcQFjAA&url=http%3A%2F
%2Fwww.etfos.unios.hr%2Fupload%2FOBAVIJESTI%2Fobavijesti_strucni%2F45077baze_podataka_lv5.doc
&ei=tltKU5KZCIWJzAP59YHoDw&usg=AFQjCNEjWA6EIAOS2Ja2Wxeo9HFg528Xsg .
8.http://technet.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx
9. v.pred. mr.sc. Damir Vuk, Baze podataka, Visoka škola za menadžment
www.vsmti.hr (16.01.2013.)
10. http://msdn.microsoft.com/en-us/library/aa258846%28SQL.80%29.aspx