13
VELEUČILIŠTE U RIJECI Sustavi baza podataka OKIDAČI (TRIGGERS) (seminarski rad) Rijeka, 2014.

Sustavi baza podataka - freslnet.com.hr · 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

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Sustavi baza podataka - freslnet.com.hr · 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

VELEUČILIŠTE U RIJECI

Sustavi baza podataka

OKIDAČI (TRIGGERS)

(seminarski rad)

Rijeka, 2014.

Page 2: Sustavi baza podataka - freslnet.com.hr · 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

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.

Page 3: Sustavi baza podataka - freslnet.com.hr · 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

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

Page 4: Sustavi baza podataka - freslnet.com.hr · 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

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.

Page 5: Sustavi baza podataka - freslnet.com.hr · 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

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

Page 6: Sustavi baza podataka - freslnet.com.hr · 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

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

Page 7: Sustavi baza podataka - freslnet.com.hr · 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

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

Page 8: Sustavi baza podataka - freslnet.com.hr · 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

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

Page 9: Sustavi baza podataka - freslnet.com.hr · 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

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

Page 10: Sustavi baza podataka - freslnet.com.hr · 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

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';

Page 11: Sustavi baza podataka - freslnet.com.hr · 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

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

Page 12: Sustavi baza podataka - freslnet.com.hr · 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

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).

Page 13: Sustavi baza podataka - freslnet.com.hr · 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

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