Kada Microsoft SQL Server 2000 doivi pogreku ovisno o nivou ozbiljnosti ili upisuje poruku iz sistemske tablice sysmessages u dnevnik pogreaka (error log) SQL Server-a u application log operacijskog sustava ili alje poruku klijentu Poruke o pogrekama mogu biti ili poslane od SQL server-a kada doe do problema ili se mogu proizvesti koristei naredbu RAISERROR. RAISEEROR vraa poruku o pogreci, i to onakvu kakvu je korisnik definirao postavlja zastavicu da je dolo do pogreke RAISERROR ( { msg_id | msg_str }{ , severity , state } [ , argument [ ,...n ] ] ) [ WITH option [ ,...n ] ] msg_ID broj pogreke mora biti vei od 50000 smjeta se u tablicu sysmessages kad se izazove pogreka, broj pogreke se upisuje u @@ERROR funkciju; @@ERROR je po defaultu 0 2 RAISEEROR msg_str tekstualna poruka o pogreci slino kao printf kod C-a npr. 'Student %s je dobio ocjenu %d' severity korisniki definiran nivo strogosti predstavlja tip pogreke koja se dogodila koritenjem procedure sp_addmessage se dodjeljuje pogreci nivo od 1 do 25 u tablicu sysmessages state integer broj izmeu 1 i 127 predstavlja informaciju o izazvanom stanju greke po defaultu je 1 RAISEEROR argument parametri koji se koriste kao zamjene za varijable definirane u msg_str ili poruke koje odgovaraju na msg_id max 20 zamjena zamjene mogu biti lokalne varijable tipova: int, char, varchar, binary i varbinary option custom opcija za pogreku LOG upisuje greku u aplikacijski i serverski log NOWAIT odmah alje poruku o pogreci klijentu SETERROR postavlja vrijednost varijable @@ERROR na msg_id ili na 50000, ovisno o nivou strogosti 3 Primjer DECLARE @DBID INT SET @DBID = DB_ID() DECLARE @DBNAME NVARCHAR(128) SET @DBNAME = DB_NAME() RAISERROR ('Trenutni ID baze je:%d, a ime joj je: %s.', 16, 1, @DBID, @DBNAME) EXEC sp_addmessage 50005, 16, 'Trenutni ID baze je:%d, a ime joj je: %s.' RAISERROR (50005, 16, 1, @DBID, @DBNAME) Nivo ozbiljnosti (Severity level) od 0 do 18 moe koristiti bilo koji korisnik 10: pogreke koje su se dogodile kod unosa podataka 11-16: pogreke koje mogu biti ispravljene od strane korisnika 17: nedostatak resursa 18: naredba se obavila ali je ipak dolo do pogreke zbog problema sa software-om npr. javlja se kod optimiziranja upita od 19 do 25 mogu koristiti samo lanovi koji imaju ulogu sysadmin uz ovaj nivo uvijek ide WITH LOG opcija 19: neke granice su nezadovoljene i dolo je do pogreke 4 Nivo ozbiljnosti (Severity level) od 20 do 25 sistemski problemi fatalne pogreke: program se zamrzne prije nego to treba stati, zatvara se veza s bazom i ovisno o problemu klijent e se moi ponovno spojiti na bazu moda je dolo do oteenja cijele baze podataka ili samo nekih objekata 20: dogodila se pogreka kod izvoenja neke naredbe ali to nije utjecalo na ostale procese u bazi i nije dolo do oteenja baze 21: dogodila se pogreka koja je utjecala na cijelu bazu, ali nije dolo do oteenja baze 22: tablica ili indeks su oteeni zbog problema sa software-om ili hardware-om 23: integritet cijele baze podataka je u pitanju zbog problema sa software-om ili hardware-om 24: pogreka na hardware-u Okidai (Triggers) Okidai su posebna vrsta pohranjenih procedura definiranih da se izvravaju automatski kada se nad tablicom ili pogledom izvri UPDATE, INSERT ili DELETE naredba. Aktivirajui dogaaji: UPDATE INSERT DELETE Okidai se koriste: Implementaciju specifinih pravila Buisiness rules OUVANJE integriteta 5 Okidai OKIDAI pokreu odreene akcije kada se dogodi PREDVIENI DOGAAJ CREATE TRIGGER podsjetnik ON dvd_naslovi FOR INSERT AS EXEC master..xpsendmail svi@videoteka.zg.hr Stigao je novi dvd u vidoteku! Okidai OKIDAI se izvodne nakon to se izvri POKRETAKI DOGAAJ Ako pokretaki dogaaj zavri grekom okida se NE IZVRAVA OKIDAI mogu izvravati upite nad drugim tablicama OKIDAI i POKRETAKI DOGAAJI tretiraju se kao JEDNA TRANSAKCIJA Mogue je opozvati transakciju iz okidaa Ako server detektira pogreku (npr. Nedovoljno mjesta na disku) CIJELA SE TRANSAKCIJA AUTOMATSKI OPOZIVA. 6 Okidai Dozvoljeno je ugnjeivanje okidaa Ako jedan okida mijenja tablicu koja ima svoje okidae dolazi do ugnjeivanja okidaa u trenutku kada se aktivira taj drugi okida Ako doe do beskonane petlje ugnjeivanja okidaa, okidai se terminiraju kada se dosegne ve predefinirani broj ugnjeivanja Ako doe do neobraene iznimke unutar ugnjeivanja, cijela operacija promatra se kao TRANSAKCIJA, pa se opozivaju sve uinjene izmjene Nikada ne dolazi do rekurzivnog pozivanja OKIDAA gdje zbog promjena nad tablicom nad kojom je asociran okida, moemo pomisliti da moe doi do samopozivanja. Okidai Za insert i update stvara se privremena tablica INSERTED. U njoj se nalazi izmijenjena ili unesena n-torke. To je kopija n-torke koja je unesena u originalnu tablicu. Za trigere koji se aktiviraju na operaciju DELETE stvara se tablica DELETED koja sadri obrisane n-torke. 7 Okidai Mogue je koristiti FOR naredbu za definiranje kada se okida izvrava AFTER Okida se izvrava nakon to se izvri okidajui dogaaj. INSTEAD OF Okida se izvrava umjesto okidajueg dogaaja. Okidai AFTER Okida se izvrava nakon to se izvri okidajui dogaaj. Ako okidajui dogaaj prijavi zavri s grekom (npr. naruavanje ogranienja ili sintaksna pogreka) okida se ne izvrava. AFTER okidai mogu biti definirani samo za tablice (ne i za poglede). Mogue je definirati vie AFTER okidaa za svaki okidajui dogaaj (INSERT, UPDATE ili DELETE). Ako postoji vie AFTER okidaa mogue je pomou sp_settriggerorder definirati koji se AFTER okida pokree prvi, a koji zadnji. Svi ostali AFTER okidai okidaju prema ne definiranom redoslijedu koji je nemogue kontrolirati. AFTER je default u SQL Server 200x. SQL Server verzije 7.0 ili ranije imale su samo AFTER okidae. 8 Okidai INSTEAD OF Okida se izvrava umjesto okidajueg dogaaja. INSTEAD OF okidai mogu biti definirani i za tablice i za poglede. Mogue je definirati samo jedan INSTEAD OF okida za svaki okidajui dogaaj (INSERT, UPDATE i DELETE). INSTEAD OF okidai mogu se koristiti za poboljane provjere integriteta nad vrijednostima podatka koji su pribavljeni INSERT ili UPDATE naredbama. INSTEAD OF okidai omoguuju definiranje akcija kojima se pogledi koji inae ne podravaju auriranje, mogu aurirati. Okidai Sintaksa za kreiranje okidaa: CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } [ WITH APPEND ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } } 9 Ogranienja okidaa Okida se stvara samo u trenutnoj bazi, ali moe koristiti objekte izvan trenutne baze INSTEAD OF DELETE/UPDATE okidai se ne mogu definirati nad tablicom koja ima definiran strani klju s akcijom cascade on DELETE/UPDATE U okidaima nisu dozvoljene ove operacije: ALTER DATABASE CREATE DATABASE DISK INIT DISK RESIZE DROP DATABASE LOAD DATABASE LOAD LOG RECONFIGURE RESTORE DATABASE RESTORE LOG Primjer Ako u bazi elimo pohraniti samo predbrojeve poznatih mrenih podruja Moemo OPOZVATI svaki unos broja koji nema dozvoljeni predbroj 10 Primjer Primjer