Predavanje 3-B2

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

1

Upravljanje pogrekama (Error handling)


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

You might also like