LITERATURA: SKRIPTA, potencijalno slajdovi i biljeke s predavanja SQL Server Books Online Gunderloy, M., Jorden, J., L. (2000) Mastering SQL Server 2000, SYBEX, Inc. , San Francisco - bilo koja knjiga vezana uz SQL Server 20xx Predava: Dalibor Bui PROJEKTIRANJE BAZA PODATAKA KONCEPT: 15 predavanja po 2 sata, obavezno prisustvo 75% za redovne, 50% za izvanredne studente 10 laboratorijskih vjebi po 3 sata, obavezno prisustvo na 100% vjebi, ali i 100% poloeni izlazni testovi dozvoljena 2 izostanka s laboratorijskih vjebi, obavezna nadoknada krajem semestra dva kolokvija, minimani prolaz 50%, uvjetni prolaz min 40% (ali ukupno na oba kolokvija min 50%) Predviene teme Transact-SQL Transakcije Rukovanje pogrekama Funkcije, pohranjene procedure, okidai Obnova u sluaju razruenja Optimizacija i plan izvoenja Viekorisniki rad i zakljuavanje SQL Server + VB Baza podataka to je baza podataka? Baza podataka je organizirani skup meusobno povezanih podataka pohranjenih u vanjskoj memoriji raunala bez tetne redundance. Podaci se spremaju neovisno o aplikacijama koje ih koriste (pretrauju, usporeuju, sortiraju, dodaju, mijenjaju, briu...), a sva manipulacija podacima se odvija kroz kontrolirano zajedniko suelje. Sustav za upravljanje bazom podataka (SUBP, eng. Database Management System ili skraeno DBMS) je sloeni programski sustav koji obavlja sve operacije nad bazom podataka, a slui kao suelje izmeu korisnika i zapisa baze podataka na disku. Bilo kakav pristup podacima mora proi putem SUBP-a. Baza podataka i sustav za upravljanje bazom podataka ine sustav baze podataka (slika 1.1.) SUBP SUBP mora omoguiti: opis i manipulaciju podacima pomou jednog ili vie posebnih jezika. Jezik za opis podataka (Data definition language, skr. DDL) slui projektantu ili administratoru baze za definiranje interne strukture baze. Njime se logiki definiraju podaci i veze meu podacima. Jezik za manipulaciju podacima (Data manipulating language, skr. DML) slui za tri osnovne operacije izmjene u bazi: dodavanje, promjena i brisanje podatka. Jezik za postavljanje upita (Query language, skr. QL) slui korisniku za pretraivanje baze Kod relacijskih baza podataka ova tri jezika su objedinjena u jedan: SQL (Structured Query Language) visok nivo suelja prema korisniku, to podrazumijeva skrivanje fizike implementacije, a znai da aplikacije moraju biti neovisne o memorijskoj lokaciji i fizikoj strukturi podataka. efikasno izvoenje operacija nad podacima, to ukljuuje optimizaciju upita SUBP SUBP mora omoguiti i: zatitu integriteta. To znai da SUBP mora odbiti izvriti promjenu nad podacima koji bi naruili konzistentnost baze definiranje dozvola korisnicima koji e moi pristupiti tono odreenim dijelovima baze ime se titi sigurnost baze. istovremeni rad veeg broja korisnika bez tetnog meudjelovanja koje bi moglo dovesti bazu u nekonzistentno stanje. obnovu podataka u sluaju djelominog ili potpunog razruenja baze pomou sigurnosnih kopija 2 Klijent/server baze podataka U klijent/server bazi, klijent priprema SQL zahtjev i alje ga serveru koji zahtjev ita i obradi. Server provjerava sigurnost, pretrauje indekse, manipuira podacima, izvrava potreban kod te na kraju rezultate vraa klijentu. Sva obrada vri se na serveru. Ako klijent zatrai skup podataka, server priprema traene podatke, te alje kopiju podataka klijentu. Originalni podaci i indeksi nikad ne naputaju server. Ako klijent zatrai bilo kakvu izmenu podataka (unos, promjenu, brisanje), server zaprimljenu SQL naredbu zaprima i izvrava interno. Klijent/server baze podataka Server za datoteke podaci se uvaju u datotekama, svi korisnici koji rade nad bazom pristupaju istoj datoteci namijenjene jednokorisnikom okruenju Access, Microsoft FoxPro Klijent/server baze podataka pristup podacima kontrolira glavni program koji se naziva server kada eli koristiti podatke klijent (aplikacija) alje zahtjev serveru sve operacije s podacima obavljaju se preko servera Microsoft SQL Server, Oracle, Informix Prednosti klijent/server baze podataka I. vjerojatnost pogreke ili kvara je manja II. olakano formiranje i provoenje sigurnosti III. efikasnije koritenje prijenosnog opsega mree IV. olakano poboljavanje performansi baza V. zatita podataka (praenje transakcija i oporavak od razruenja) Transact-SQL (T-SQL) SQL standard (ANSI SQL), ISO Dijalekti SQL-a Transact-SQL Microsoftova implementacija standarda Je li T-SQL usklaen sa standardom? Konvencije T-SQL-a: VELIKIM SLOVIMA kljune rijei identifikatori (imena tablica, atributa, ...) tablice 116 znakova, ostali najvie 128 - poinju slovom ili znakom _ - mogu biti i vie rijei, ali u [ ] ili referenciranje objekata - ime_servera.ime_baze.ime_sheme.identifikator_objekta - jednostavnije referenciranje u ovisnosti od konteksta npr.: Diaspar.Northwind.dbo.Customers Transact-SQL (T-SQL) tipovi podataka numeric exact numeric integer bigint [-2^63, 2^63 1] int [-2^31, 2^31-1] smallint [-2^15, 2^15 - 1] tinyint [0, 255] bit 0 ili 1 decimal and numeric decimal [-10^38 +1, 10^38 1] numeric [-10^38 +1, 10^38 1] money and smallmoney money [-2^63, 2^63 - 1] smallmoney [-214,748.3648 , 214,748.3647] approximate numeric float [-1.79E + 308, 1.79E + 308] real [-3.40E + 38, 3.40E + 38] datetime and smalldatetime datetime [1.1.1753, 31.12.9999] tonost 3,33 ms smalldatetime [1.1.1900, 6.6.2079] tonost 1 min character and binary string character string char fiksne duljine max 8000 znakova varchar var. duljine max 8000 zn. text var. duljine max 2^31-1 zn. Unicode character string nchar fiksne duljine max 4000 zn. nvarchar var. duljine max 4000 zn. ntext var. duljine max 2^30 - 1 zn. binary strings binary fiksne duljine max 8000 B varbinary var. duljine max 8000 B image var. duljine max 2^31 1 B cursor referenca na kursor sql_variant varijabilni tip podatka table tip podatka za tablicu uniqueidentifier (GUID) Transact-SQL (T-SQL) Varijable: sistemske globalne varijable sa dva @ na poetku npr. @@CONNECTIONS, @@ERROR, ... lokalne varijable sa jednim @ na poetku npr. @ime,... DEKLARIRANJE LOKALNIH VARIJABLI DECLARE @ime_varijable tip_podatka PRIDJELJIVANJE VRIJEDNOSTI SET @ime_varijable=izraz Funkcije: Ugraene funkcije Korisniki definirane Kljuna rije GO Slui za slanje bloka naredbi SQL Serveru koji se zajedno prevode i zajedno se pravi plan izvravanja Transakcije Osnovna jedinica posla nad bazom podataka. Primjer: 1. UPDATE proizvodi SET cijena=20 , tip=granit WHERE naziv=GR50*50/sivi - moemo napisati kao dva upita: 2. UPDATE proizvodi SET cijena=20 WHERE naziv=GR50*50/sivi UPDATE proizvodi SET tip=granit WHERE naziv=GR50*50/sivi to ako doe do greke nakon 1., a to ako doe do greke nakon 2.? 3 Transakcije DECLARE @cijena_err int, @tip_err int BEGIN TRANSACTION UPDATE proizvodi SET cijena=20 WHERE naziv=GR50*50/sivi SET @cijena_err=@@ERROR UPDATE proizvodi SET tip=granit WHERE naziv=GR50*50/sivi SET @tip_err=@@ERROR IF @cijena_err=0 AND @tip_err=0 COMMIT TRANSACTION ELSE ROLLBACK TRANSACTION Koritenje transakcija Naredbe za rad s transakcijama: BEGIN TRAN[SACTION] COMMIT TRAN[SACTION] ROLLBACK TRAN[SACTION] SAVE TRAN[SACTION] Naredba BEGIN TRANSACTION: - zapoinjanje nove transakcije Opi oblik: BEGIN TRAN[SACTION] [ime_transakcije | @varijabla_za_ime] [WITH MARK [tekst opisa]] - ime transakcije omoguava da se transakcija referencira po imenu - opcija WITH MARK umee u dnevnik transakcija ime i vrijeme transakcije (pomo pri kasnijoj obnovi ili ponitavanju transakcije) Koritenje transakcija Naredba COMMIT TRANSACTION: - potvrivanje transakcije - sve izmjene unutar transakcije se upisuju u bazu - COMMIT se odnosi na posljednju zapoetu transakciju u bloku Opi oblik: COMMIT TRAN[SACTION] [ime_transakcije | @varijabla_za_ime] - ime transakcije slui samo za olakano itanje koda i nema ulogu za potvrivanje transakcije Usklaeno s ANSI SQL postoji: COMMIT WORK BEGIN TRANSACTION T1 UPDATE Kolegij SET ECTS=10 WHERE KolegijID=2 COMMIT TRANSACTION T2 Koritenje transakcija Naredba ROLLBACK TRANSACTION: - ponitavanje transakcije - sve izmjene unutar transakcije nemaju uinka kao da se transakcija nije niti dogodila - ROLLBACK se odnosi na posljednju zapoetu transakciju u bloku, na posljednji BEGIN TRANSACTION Opi oblik: ROLLBACK TRAN[SACTION] [ime_transakcije | @varijabla_za_ime_transakcije | ime_potvrene_toke | @varijabla_za_ime_potvrene_toke] - ime transakcije slui samo za olakano itanje koda i nema ulogu za ponitavanje transakcije - potvrena toka slui ako se eli ponititi samo dio transakcije Usklaeno s ANSI SQL postoji: ROLLBACK WORK , ALI za razliku od ROLLBACK TRANS ponitava najvanjsku transakciju Koritenje transakcija Naredba SAVE TRANSACTION: - omoguuje potvrivanje dijela transakcije pa je mogue i ponititi dio transakcije Opi oblik: SAVE TRAN[SACTION] {ime_potvrene_toke | @varijabla_za_ime_potvrene_toke} - ime potvrene toke je nuno koje slui kao referenca za naredni COMMIT ili ROLLBACK TRANSACTION Primjer transakcije BEGIN TRANSACTION T1 UPDATE Kolegij SET ECTS=10 WHERE KolegijID=2 SAVE TRANSACTION SPREM DELETE Kolegij WHERE KolegijID=5 ROLLBACK TRANSACTION SPREM COMMIT TRANSACTION 4 Primjer transakcije DECLARE @cijena_err int, @tip_err int BEGIN TRANSACTION UPDATE proizvodi SET cijena=20 WHERE naziv=GR50*50/sivi SET @cijena_err=@@ERROR SAVE TRANSACTION cijenaspremljena UPDATE proizvodi SET tip=granit WHERE naziv=GR50*50/sivi SET @tip_err=@@ERROR IF @tip_err<>0 ROLLBACK TRANSACTION cijenaspremljena IF @cijena_err=0 AND @tip_err=0 BEGIN COMMIT TRANSACTION PRINT Izmjene su uspjeno unesene! END ELSE ROLLBACK TRANSACTION Koritenje transakcija Transakcije se mogu ugnjeivati - BEGIN TRANSACTION se moe zadati prije nego se prethodna transakcija potvrdi ili poniti - Unutranja se transakcija mora potvrditi prije vanjske - ROLLBACK unutranje transakcije se ne moe napraviti - COMMIT unutranje transakcije potvruje samo unutranju transakciju, ali to ne znai da su podaci trajno izmijenjeni u bazi, ve samo da su vidljivi vanjskoj transakciji - Ako vanjska transakcija napravi ROLLBACK sve izmjene u unutranjim transakcijama se ponitavaju Korisne sistemske varijable: - @@TRANCOUNT- broj ugnjeenih transakcija koje su trenutno zapoete, ako nema zapoetih transakcija iznos je 0 - @@ERROR sadri 0 ako prethodni iskaz nije prouzrokovao greku, u suprotnom ima vrijednost rednog broja posljednje greke Primjer transakcije BEGIN TRANSACTION T1 UPDATE Kolegij SET ECTS=10 WHERE KolegijID=2 BEGIN TRANSACTION T2 DELETE Kolegij WHERE KolegijID=5 COMMIT TRANSACTION T2 UPDATE Kolegij SET ECTS=20 WHERE KolegijID=3 ROLLBACK TRANSACTION T1 Primjer transakcije BEGIN TRANSACTION T1 UPDATE Kolegij SET ECTS=10 WHERE KolegijID=2 BEGIN TRANSACTION T2 DELETE Kolegij WHERE KolegijID=5 SAVE TRANSACTION sacuvaj_brisanje DELETE Kolegij WHERE KolegijID=4 ROLLBACK TRANSACTION sacuvaj_brisanje UPDATE Kolegij SET ECTS=20 WHERE KolegijID=3 COMMIT TRANSACTION T2 INSERT INTO Kolegij (Naziv,ECTS) VALUES ('Tehniki engleski jezik',3) COMMIT TRANSACTION T1 @@TRANCOUNT SELECT @@TRANCOUNT -- ispisuje 0 BEGIN TRAN A SELECT @@TRANCOUNT -- ispisuje 1 BEGIN TRAN B SELECT @@TRANCOUNT -- ispisuje 2 BEGIN TRAN C SELECT @@TRANCOUNT -- ispisuje 3 COMMIT TRAN C COMMIT TRAN B SELECT @@TRANCOUNT -- ispisuje 1 COMMIT TRAN A SELECT @@TRANCOUNT -- ispisuje 0 Svojstva transakcija Transakcije imaju 4 svojstva (ACID): Atomicity (Atomarnost) - transakcija je jedinstvena jedinica posla (atom) - nakon to transakcija zavri ili su obavljene sve operacije ili niti jedna Consistency (Konzistentnost) - transakcija bazu mora ostaviti u konzistentno stanju - ako neka operacija narui neka od pravila ili ogranienja u bazi, transakcija se ne moe potvrditi 5 Svojstva transakcija Durability (Trajnost) - transakcija kada se jednom potvrdi mora ostati trajno u bazi - ako se raunalo pokvari, rezultati potvrene transakcije su vidljivi kada se raunalo ponovo pokrene Isolation (Izolacija) - jedna transakcija ne vidi prijelazno stanje drugih transakcija - ako se na nepromijenjenim podacima izvedu sve transakcije jednakim redoslijedom efekt uvijek mora biti jednak Koritenje transakcija Transakcije troe resurse! Savjeti za upotrebu: - Unutar transakcije se ne smije ekati intervencija korisnika podaci bi mogli biti predugo zakljuani za upotrebu - Ne zapoinjati transakcije zbog jednog SQL upita - Unutar jedne transakcije mijenjajti to manju koliinu podataka - Transakciju zapoinjati tek kada je korisnik spreman aurirati podatke, a ne dok ih pretrauje - Transakcije trebaju biti to krae