Informacijske tehnologije
SEMINARSKI RAD
SQL SERVER
Mentor: Student:
Povijest
Prva verzija SQL Servera koji ima veze sa Microsoftom (ranije je Sybase proizvodio
SQL server pod imenom „Sybase SQL server“) izašla je na svjetlo dana 1989. godine
pod imenom „SQL Server for OS/2 1.0“. Ta verzija bila je identična Sybase-ovom
SQL serveru 3.0 koji je radio pod Unix sistemom. Microsoft SQL Server pod tim
imenom se počeo prodavati 1992. godine, a puno ime mu je glasilo Microsoft SQL
Server 4.2 koji se još uvijek vrtio na OS/2 platformi. Prvi SQL Server za Windows
NT izašao je isto kada i sami Windows-i. U tom trenutku Sybase i Microsoft su se
razišli, te je Sybase počeo razvijati svoju bazu podataka pod imenom Adaptive
Server Enterprise da bi se izbjeglo zbunjivanje korisnika oko imena. Do 1994.
Microsoft je svejedno morao na sada svojem sustavu nositi Sybaseovu oznaku zbog
autorskih prava.
Od trenutka raskida sa Sybaseom, Microsoft je napravio značajne pomake u razvoju
svoje baze podataka. SQL Server je prva baza podataka na svijetu koja je
posjedovala korisničko sučelje. Sve baze su u tadašnje vrijeme radili pomoću
„command-line“ sistema koji zna biti izrazito nezgodan i nezgrapan. Također, SQL
Server je prva komercijalna baza podataka koja je podržala Intelovu 64-bitnu
arhitekturu procesora. Aktualna je verzija SQL Server 2008 iz 2008. godine.
Od SQL Servera 2000 do SQL Servera 2005 napravljeni su golemi pomaci u
poboljšanju same baze podataka. Najbitniji od njih su: Klijentski dio IDE alata, SQL
Server Integration Services, Reporting Server, OLAP server, podrška za data mining,
Notification Services itd.
Kreiranje baze podataka
Uvod
Baze podataka u različitim oblicima i formatima postoje od same pojave računara. Potreba
za čuvanjem i pretraživanjem podataka postoji od uvijek, a tek od skoro, sa omasovljenjem
računara, postaje dostupna svima. Načini elektronskog čuvanja podataka su od početka do
danas doživjeli više evulucionih i revolucionih promena. Počev od jednostavnih datoteka u
tekst formatu, preko mainframe baza podataka, prvih desktop baza sve do današnjih moćnih
database servera koji osim osnovne namene donose mnoge dodatne mogućnosti.
Na našem tržištu u početku su bile veoma popularne Clipper aplikacije iza kojih je stajao
Dbase (popularni dbf) format baze podataka u različitim verzijama. Veliku popularnost zbog
jednostavnosti upotrebe i pouzdanosti je postigao i Microsoft Access, koji nije samo baza
podataka već je u njemu moguće pisati i Windows aplikacije. Međutim, kada govorimo o
velikim sistemima koji treba da čuvaju i manipulišu velikim brojem podataka i istovremenih
korisnika, referišemo se na servere baza podataka (eng. Database servers) koji mogu da
zadovolje ovakve potrebe u smislu perfomansi, bezbednosti, mogućnosti i administracije.
Teško je naći aplikaciju koja ne koristi nekakvu bazu podataka za svoj rad. Ovde je bitno
napomenuti da se pod terminom podaci ne smatraju samo numerčke i tekstualne informacije.
Potrebe su porasle, tako da sada u bazu možete smjestiti i druge informacije kao što su
slike, audio i video informacije, geografske podatke, dokumente i generalno bilo koji vid
informacije koji se pojavljuje u svakodnevnom radu.
Microsoft već odavno nudi server baze podataka pod nazivom SQL Server. Trenutna verzija
nosi komercijalni naziv Microsoft SQL Server 2008, interno u pitanju je verzija 10. SQL
Server je već odavno zreo proizvod, dokazan u praksi i u ovom serijalu se upravo
posvećujemo njemu.
Preduslovi za instalaciju
Imajući u vidu da je SQL Server kompleksni serverski proizvod, potrebno je znati postupak
instalacije i preduslove kako bi opšte mogli da izvršimo instalaciju. Ako instalaciju vršite na
Windows XP operativnom sistemu, neophodno je zadovoljiti sljedeće uslove:
Ako SQL Server instalirate na operativnom sistemu Windows Vista potrebno je samo
instalirati .NET Framework 3.5 sa SP1.
Instalacija
Kada ste zavisno od operativnog sistema, uradili sve neophodne korake pre instalacije
možete pokrenuti instalaciju SQL Servera. Postupak je gotovo identičan, bez obzira da li ste
preuzeli SQL Server 2008 Express with Tools ili SQL Server 2008 Express with Advanced
Services verziju.
Pokrenite izvršnu instalacionu datoteku koju ste preuzeli i sačekajte da se "raspakuje" jer je u
pitanju arhiva koja sadrži sve datoteke potrebne za instalaciju. U narednom tekstu biće
prikazani samo dijelovi instalacije gde je potrebno unijeti ili izabrati neku vrednost. Na svim
ostalim ekranima prilikom instalacije prihvatite ponuđene opcije i kliknite na dugme "Next" ili
"OK".
Nakon ovoga se otvara novi dijalog, gdje treba kliknuti na prvu opciju koja instalira novi SQL
Server:
Instalaciona procedura sada vrši prvi set provera sistema i neophodnih uslova za
postavljanje SQL Servera. Ako je sve u redu treba da vidite sljedeće:
Na ekranu "Feature Selection" je potrebno izabrati koje opcije želite da instalirate. U narednoj
slici je prikazan ovaj ekran za SQL Server with Advanced Servises verziju. Potvrdite opcije
kao na sljedećoj slici:
Na kraju, treba definisati koji korisnički račun (ili više njih) predstavljaju administratora SQL
Servera. Administrator ima sva prava nad svim bazama i podacima i u praksi treba biti pažljiv
prilikom izbora. Dobra odluka je da administrator operativnog sistema ima i administratorska
prava nad SQL Serverom. U ovom dijalogu kliknite na dugme "Add..." u i narednom dijalogu
upišite "Administrator". Ako ste već ulogovani kao administrator operativnog sistema,
dovoljno je samo da kliknete na dugme "Add Current User":
Baze podataka
Na jednoj instalaciji SQL Servera može da se napravi više baza podataka. Teoretski
maksimum je daleko veći od onoga što će bilo kome ikad zatrebati ili što jedan računar može
podneti, tako da to nije problem. Jedna baza podataka je zapravo logično grupisan skup
informacija i predstavlja jednu poslovnu celinu. Na primer, ako na istom SQL Serveru želite
da imate podatke o đacima škole, finansijske informacije i evidenciju inventara, to će se
verovatno držati u tri različite baze podataka. Naravno, uvek sve možete staviti u jednu
jedinu bazu, ali to će kasnije bespotrebno zakomplikovati administraciju.
U svakom slučaju, treba znati da je obezbjeđena jednostavna komunikacije između više
baza podataka, tako da po potrebi možete lako napisati upit koji kombinuje podatke iz
različitih baza.
Sada kliknite na plus levo od "Databases", a potom na plus levo od "System Databases"
kao što je prikazano na sledećoj slici:
U Object Exploreru su svi objekti baze prikazani hijerarhijski. Postoje dve grupe baza
podataka:
Sistemske baze podataka
Korisničke baze podataka
Mi trenutno nemamo ni jednu korisničku bazu podataka (uskoro ćemo ih praviti), dok svaki
SQL Server ima set od četiri sistemske baze koje se vide u folderu "System Databases". Kao
što se može videti, sistemske baze su:
Master – glavna sistemska baza SQL Servera u kojoj se čuvaju informacije o konfiguraciji,
korisnicima, svim bazama koje postoje i još mnogo toga.
Model – predstavlja šablon na osnovu koga se kreiraju sve korisničke baze podataka. Svi
atributi model baze se prenose na novo kreiranu bazu, osim ako drugačije nije rečeno. Na
primer, ako želite da u svakoj novoj bazi imate tabelu sa istim podacima, najjednostavnije je
prvo napraviti tu tabelu u model bazi.
Msdb – ovu bazu SQL Server koristi za neke svoje servise i automatizovane poslove.
Tempdb – jasno po imenu, baza podataka koja služi za privremeni smeštaj podataka
prilikom obrade. Na primer, kada se zada složeniji upit, SQL Server će ga automatski razložiti
na jednostavnije činioce i međurezultate smestiti u ovu bazu. Po završetku upita,
međurezultati se automatski brišu
Važno je naglasiti da ne treba ni na koji način menjati strukturu i podatke sistemskih baza
(izuzetak od ovoga je Model baza), jer na taj način možete narušiti ili čak potpuno
onemogućiti normalan rad SQL Servera. Ove sistmeske baze se automatski menjaju zavisno
od upotrebe SQL Servera.
Inicijalno, SQL Server drži ove baze zaključane i ne dozvoljava njihove izmene ili brisanje
čak ni administratoru SQL Servera. Ovo se može izmeniti u konfiguraciji, ali svakako nije
preporuka tako nešto uraditi.
Kreiranje baze podataka je na početnom nivou veoma jednostavno i dovoljno za skoro sve
primjene. Jednu bazu podataka sačinjavaju dve fizičke datoteke. U jednoj se čuvaju svi
podaci i informacije o svim objektima u toj bazi – metapodaci. Ova datoteka najčešće ima
isto ime kao i baza podataka, a ekstenzija je mdf. Druga datoteka služi za čuvanje dnevnika
rada (log datoteka) ka toj bazi i pomoću nje je implementiran transakcioni sistem o kome će
biti riječi kasnije. Ova datoteka ima ekstnziju ldf.
U literaturi se često nazivaju data i log datoteka, respektivno.
Ove dve datoteke predstavljaju minimum za svaku bazu, međutim jedna baza može da se
sastoji od nekoliko data i log datoteka. Osnovna ideja iza ovoga je mogućnost proširenja
baze na više diskova u računaru. Na primer, napravili ste jednu bazi sa jednim data i jednim
log fajlom. Vremenom baza podataka je "narasla" i preti da zauzme sav raspoloživ prostor na
disku. Tada se na računar instalira još jedan disk, i bazi dodaju po jedna data i jedan log
datoteka koji se fizički nalaze na novom disku.
Očigledno nema opravdanja da se dve data ili log datoteke iste baze nalaze na istom
fizičkom disku. Tehnički, to je izvodljivo ali potpuno nepotrebno, a kasnije otežava
administraciju baze. Ovo je česta početnička greška.
Prilikom kreiranja baze podatka, osnovni parametar je njeno ime. Na jednom SQL Serveru
svaka baza mora da ima jedinstveno ime. Pravila za zadavanje imena objekata (što uključuje
i ime baze) su slična pravilima za davanje imena varijablama u programiranju. Maksimalna
dužina imena je 128 karaktera. Ime može sadržati i brojeve, ali ne sme početi sa brojem. Na
primer, ime MojaBaza1 je ispravno, a ime 1MojaBaza nije ispravno.
U nazivu možete koristiti i razmake, ali opet, to će vam iskomplikovati rad kasnije. Bolje je
koristitu Upper Case notaciju – MojaPrvaBazaPodataka – potpuno čitljivo i bez korišćenja
razmaka.
Sada uradite desni klik na folder "Databases" i u popup meniju kliknite na "New
Database...".
Otvara se dijalog za kreiranje baze podataka. Novu bazu ćemo nazvati "MojaBaza" kao što
je prikazano na sledećoj slici:
U polju "Database name" je upisano ime baze, a u listi ispod su prikazani atributi data i log
datoteka od kojih se baza sastoji. Inicijalne opcije su potpuno odgovarajuće za većinu
primena, a to su:
Logical Name: logičko ime data i log datoteka kako ih vidi SQL Server. Očigledno, ova
logička imena su bazirana na imenu baze koje ste uneli.
File Type: opisuje tip datoteke, "Rows Data" za data datoteku, odnosno "Log" za log
datoteku.
Filegroup: napredna opcija koju nećemo obrađivati.
Initial size (MB): inicijalna veličina datoteke u megabajtima. Prilikom kreiranja baze, uvek se
zadaju početne veličine data i log datoteka. Procena se vrši na osnovu veličine seta
podataka koji se očekuje u nekom narednom periodu. Ovo nije kritična odluke zbog sledećeg
parametra:
Autogrowth: definiše da li će i na koji način automatski "rasti" datoteka kada je podaci
popune. Za data datoteku inicijano je postavljeno da raste automatski, svaki put za jedan
megabajt, a za log po 10% od trenutne veličine. Inače, teoretski maksimum veličine jedne
baze na Express ediciji SQL Servera je 4GB. Na višim verzijama, teoretski maksimum je
preko pola miliona terabajta. Specifikaciju maksimuma SQL Servera možete videti na
http://msdn.microsoft.com/en-us/library/ms143432.aspx
Sada skrolujte tabelu na desno kako bi videli atribute "Path" i "File Name" koji očigledno
pokazuju fizički lokaciju gde će datoteke baze biti kreirane. Ovu lokaciju možete promeniti, ali
ona mora da pokazuje na lokalne diskove računara gde je instaliran SQL Server. Ne mogu
se koristiti mrežni diskovi, niti usb memorije ili usb diskovi.
Pri vrhu dijaloga polje "Owner" definiše korisnika koji je vlasnik baze – što znači da ima sva
prava nad njom. Ostavite "<default>" čime je vlasnik baze onaj korisnik ko je i kreira. U
našem slučaju administrator Windows – setite se da smo se tako i ulogovali na SQL Server.
Kliknite na dugme "OK" i posle nekoliko trenutaka baza je kreirana i prikazana u Object
Exploreru, u okviru foldera "Databases". Napravili smo svoju prvu bazu.
Za napredne korisnike:
Studio je SQL Serveru prosledio skript koji kreira bazu podataka. Po SQL standardu postoji
set naredbi CREATE ... kojima se kreiraju različiti objekt. Najjednostavniji oblik CREATE
naredbe za bazu podatka je:
U pretodnom nastavku smo napravili svoju prvu bazu podataka na Microsoft SQL Serveru.
Sada je vreme da se upoznamo sa osnovnim objektima koji se nalaze u svakoj bazi.
Naučićemo njihovu funkciju i kakve su preporuke za njihovo korišćenje.
Imajući u vidu da ovaj serijal namenjen početnicima, proučićemo samo osnovne objekte.
Prije svega treba razrešiti moguću pogrešnu interpretaciju. Kada se kaže "objekti SQL
servera", ne misli se na objekte u smislu objektnog programiranja, već jednostavno na
određene kategorije funkcionalnosti koje pruža SQL Server. Naravno, SQL Server podržava i
pravo objektno orijentisano programiranje, ali to su napredne tehnike koje prevazilaze
ambicije ovog serijala.
Pokrenite Microsoft SQL Server Management Studio i povežite se na lokalni server kao što
smo naučili u predhodnom nastavku.
Potom, sa lijeve strane kliknite na plus ikonu pored naše baze podataka koju smo nazvali
MojaBaza kao što je prikazano na slici:
Hijerarhijski je prikazana baza podataka i ispod nje svi pripadajući objekti. Na slici je takođe
otvoren i čvor "Programmibility" sa svojim pod objektima.
Tabela
Možemo slobodno reći da je tabela (eng. Table) osnovni objekat SQL Servera, kao i svake
druge baze podataka. Tabela je nosilac informacija i nju kreira korisnik u skladu sa svojim
potrebama. Predstavlja jednu logičku celinu – entitet u kome se čuvaju podaci. Postoji
jednostavan način na osnovu koga se može odrediti koje tabele ćete imati u bazi i šta će se
u njima nalaziti. Pažljivo slušajte zahteve korisnika (ili vlastite ako pravite bazu za sebe) i
obratite pažnju na imenice. Ako zahtev izgleda na primjer ovako: "Želim da imam informacije
o odeljenjima, učenicima, profesorima i predmetima", prilično je jasno da ćemo u bazi imati
tabele "Odeljenja", "Učenici", "Profesori" i "Predmeti". Obično ih bude još jer treba nekako
međusobno povezati odeljenja, učenike i predmete ali o tome kasnije.
Fizički tabela predstavlja matricu sa redovima i kolonama u kojoj se nalaze (ili će se nalaziti)
podaci. Obavezno je poređenje sa radnim listom u aplikaciji Excel, samo što tabela u bazi
ima mnogo striktnija pravila.
Kada krećete sa pravljenjem tabele koja će predstavljati neki entitet, počnite od karakteristika
(atributa) tog entiteta koje želite da imate u toj tabeli.
Na primer ako želite da napravite tabelu u kojoj će se nalaziti podaci o učenicima škole,
jasno je da treba imati sledeće atribute:
Bez ovakovog primarnog ključa bilo kakva manipulacija podacima bi bila, otežana, sklona
greškama ili nemoguća.
Tehnički gledano, tabela ne mora da ima primarni ključ, odnosno ovakvo jedinstveno polje,
ali to apsolutno ne treba raditi. Svaka tabela koju pravite, treba da ima i primarni ključ.
Primer tabele koja sadrži podatke o kupcima (eng: Customers) je prikazan na sledećoj slici:
U zaglavlju tabele se nalaze nazivi atributa tabele: CustomerID, CompanyName,
ContactName, ContactTiltle, Address i City.
Svaki red tabele (eng: row) predstavlja informacije o jednom kupcu. Kod nas se ovakav red
zove i "slog" ili "zapis".
Atribut CustomerID u ovom primeru predstavlja primarni ključ tabele. Ovo znači da svaki
kupac ima jedinstvenu vrednost tog atributa. Ovo takođe znači da bi SQL Server odbio da
unese novog kupca koji nema jedinstvenu vrednost atributa CustomerID.
Ovo je jako važno razumeti – praktično baza podataka se sama brine i sebi na osnovu
pravila koje smo definisali. Važno pravilo je primarni ključ, ali ima ih još dosta i mogu se
implementirati na razne načine.
Osnovno pravilo koje definišemo prilikom kreiranja tabele je tip atributa. Podatak koji želite
da čuvate u atributu definiše i njegov tip. Ponoviću primer atributa jednog učenika, ali sada i
sa njegovim tipom:
Ovaj upit prikazuje podatke iz nekoliko tabela i u praksi nije bitno veliki – ima i manjih i većih
od njega.
Sada zamislite ako nešto ovako stalno provlačite kroz aplikaciju ili još gore, zahtevaju se
neke izmene na već gotovoj aplikaciji.
Umesto toga, napravićemo pogled na osnovu ovog upita i na primer nazvaćemo ga
"Fakture".
Prilično jednostavnije, a ako kasnije treba nešto menjati, dovoljno je promeniti ovaj pogled,
aplikacije ne treba dirati.
Ovde je važno napomenuti da pogled NE sadrži podatke. On sadrži samo definiciju na koji
način treba prikazati podatke iz tabela.
Dalje ćemo proučiti osnove za kreiranje tabele u SQL Server bazi podataka.
Kao što je ranije rečeno, tabela je ključni objekat svake baze podataka jer je nosilac
informacija i osnovni „čuvar“ integriteta podataka. Baza podataka predstavlja strogo uređen
sistem koji funkcioniše po pravilima koja oslikavaju poslovne potrebe.
Osnovno pravilo kada se radi sa podacima je tip podatka. Neophodno je, zavisno od
konkretne potrebe, odabrati odgovarajući tip podataka za svaku kolonu tabele u bazi.
Zbog ovoga ćemo ukratko proći sve raspoložive tipove podataka na SQL Serveru, kako bi na
jednom mestu imali sve potrebne informacije za ispravno postavljanje tipova kolona u tabeli.
Tipove podataka možemo podeliti u nekoliko kategorija zavisno od potrebe.
Binarni tipovi – bilo koji binarni sadržaj uključujući sliku, zvuk ...
Binary 1 do 8000 (fiksne dužine) 1 do 8000 bajtova
Varninary 1 do 8000 (varijabilne dužine) 1 do 8000 bajtova
Image 0 do 231-1 (varijabilne dužine) 0 do 231-1 bajtova
Specijalni tip:
uniqueidentifier globalni jedinstveni identifikator koji služi za 16 bajtova
čuvanje rezultata funkcije NEWID()
Osim pobrojanih tipova postoje još nekoliko specijalizovanih koji se ne mogu koristiti kao tip
podataka u tabeli, već služe kao tipovi varijabli prilikom pisanja TSQL skripti.
Sve u svemu, očigledno je da su podržani svi mogući tipovi podataka koje možete upisati u
tabelu, a u narednom tekstu ćemo dodatno objasniti pojedine tipove i grupe.
Celobrojni numerički tipovi mogu predstavljati samo cele brojeve u zadatom opsegu.
Zauzimaju malo prostora i često se koriste kao primarni ključevi tabele, kada se postavi da
se automatski povećavaju – IDENTITY atribut. Ovo znači da će (inicijalno) brojač početi od 1
i povećavati se automatski za 1 svaki put kada se doda nov slog u tabelu. Kada postavljate
IDENTITY atribut možete naglasiti od kog broja počinje i koji je korak povećavanja (ili
smanjivanja ako stavite negativnu vrednost).
Slično je kod tipa smallmoney, samo što se radi sa 4 bajta, te je i opseg manji.
Decimal tip je specifičan jer je moguće odrediti preciznost i skalu, odnosno koliko cifara
ukupno ima (preciznost) i koliko od njih se koristi sa desne strane decimalne tačke (skala).
Dozvoljene vrednosti za preciznost su od 1 do 38. Dozvoljene vrednosti za skalu su od 0 do
38. Ovo znači da od decimal tipa možete da napravite celobrojni (preciznost=38, skala=0) ali
i broj sa velikim brojem decimala (preciznost= 38, skala=38) i naravno sve između ove dve
krajnosti.
Očigledno, money i smallmoney tipovi su namenjeni finansijskim podacima, a decimal se
najčešće koristi za različite naučne i inženjerske proračune koji zahtevaju veliku preciznost.
Datum i vreme su se ranije zajedno čuvale u tipu datetime i potom prikazivali po potrebi i
zadatom formatu. SQL Server ima veliki broj funkcija za rad sa datumom i vremenom, tako
da se može uraditi sve što je bilo potrebno. SQL Server 2008 uvodi neke nove tipove gde se
može čuvati odvojeno samo datum ili samo vreme – date i time tipovi. Koji tip ćete izabrati u
praksi zavisi naravno od potrebnog opsega i preciznosti.
Tekstualni podaci
Tekstualne podatke takođe delimo u dve grupe:
ASCII i Unicode. Kao što je opšte poznato, ASCII standard (skraćeno od American Standard
Code for Information Interchange), koristi samo jedan bajt po karakteru, odnosno opseg od 0
do 255 što predstavlja maksimalni broj različitih karaktera koje može prikazati. Verovatno se
neki čitaoc seća takozvanog YUSCII seta karaktera kojim su se zamenjivali neki karakteri
našim slovima jer u postojećih 255 nije bilo mesta za naša latinična slova, ćirilicu da ne
pominjem.
Tipovi char, varchar i text su ASCII tipovi i u praksi ćemo ih retko koristiti.
Prefiks „var“ označava da je tip varijabilne dužine. Na primer ako deklarišemo tip nchar(10)
ovo znači da imamo Unicode string sa maksimalno 10 karaktera. Ako u njega upišemo „SQL“
ostatak do 10, odnosno još 7 karaktera će biti automatski dodato i to 7 znakova razmaka.
Zato se zovi stringovi fiksne dužine. Koliko god upisali teksta u njih oni će uvek biti
deklarisane dužine. Ovo zna da pravi prilične probleme u praktičnom radu, pogotovo prilikom
pretrage.
S druge strane, pošto su fiksne dužine, SQL Server je efikasniji u pretrazi ovih podataka.
Ako sada deklarišemo tip nvarchar(10) i u njega upišemo isto „SQL“ on će zaista samo to i
sadržati. Nema dopunjavanja do 10 karaktera, te se zato i zovu stringovi varijabilne dužine.
Očigledno, oni su efikasniji što se tiče iskorišćenja prostora, ali nešto sporiji prilikom
pretrage.
Ova razlika u perfomansama pretraživanja je jako mala i ne treba da bude činilac odluke u
praktičnom radu. U praksi se gotovo uvek koristi nvarchar tip koji može da prikaže i latinicu i
ćirlicu.
Text i ntext tipovi polja su odranije poznati i kao memo polja. Služe za čuvanje ASCII
odnosno Unicode teksta velike dužine do 2GB, odnosno 1GB u Unicode verziji. Uvek su
varijabilnog tipa.
Binarni tipovi
Ovi tipovi su donekle slični tekstualnim tipovima, samo što se u njima ne čuva tekst, već bilo
koji niz bajtova. Posebno koristan je tip image čije ime i asocira na upotrebu. Osim slika,
ovde možete na primer smestiti audio i video materijal, različite objekte i slično.
Specijalni tipovi
Postoji više specijalnih tipova podataka, a najčešće se koristi uniqueidentifier. On
funkcioniše zajedno sa SQL funkcijom NEWID (). Ova funkcija generiše ogroman jedinstveni
broj koje se može smjestiti u ovaj tip.
Probajte:
Otvorite Microsoft SQL Server Management Studio, otvorite novi prozor za upite (New Query
dugme) i ukucajte sledeće:
SELECT NEWID()
Često se koristi kao vrijednost primarnog ključa kada se podaci unose na više SQL Servera,
a potom svi skupljaju na jednom. Ako koristite uniqueidentifier tip i punite ga vrednošću koju
generiše NEWID() funkcija, nećete imati problema sa dupliranim primarnim ključevima
prilikom grupisanja podataka.
Posle ove malo duže, ali neophodne teorijske priče, u sledećem nastavku ćemo kreirati svoje
prve tabele.
U predhodnom nastavku smo naučili koji tipovi podataka postoje na Microsoft SQL Serveru.
Prilikom projektovanja tabela od velikog značaja je izabrati pravi tip podataka zavisno od
potrebe i namjene. Kada je u pitanju tekstualni tip podataka, potrebno je ispravno odabrati i
maksimalne dužine stringova, što nije uvek jednostavno. Na primer, ako želite da sačuvate
adresu (ulicu i broj) koliko maksimalno karaktera za to predvidjeti? Za bilo koji broj je obično
odmah jasno da li je u pitanju celobrojna vrednost ili broj sa decimalnim zarezom. Ali treba
voditi računa o opsegu i potrebnoj preciznosti. Metod „stavićemo više nego što treba pa neće
biti problema u budućnosti“ se u praksi često koristi, što uvek kao rezultat daje neefikasan
dizajn.
Pre projektovanja baze i tabela potrebno je izvršiti detaljnu analizu potreba na osnovu ranijih
podataka, izveštaja, iskustva korisnika itd. Tek tada možemo krenuti u tehničku realizaciju.
Nije strašno ako se ponekad dogodi da naknadno treba proširivati kolone, pogotovo u
implementacijama gde nemamo dovoljno informacija na koje se možemo osloniti.
Svako kreiranje, izmjena i brisanje objekata u SQL Serveru se može izvršiti ili pomoću
vizuelnih alata (SQL Server Management Studio) ili pomoću odgovarajućih TSQL naredbi.
Naravno, vizuelni alati na osnovu unetih podataka u pozadini formiraju TSQL naredbu i
izvršavaju je, tako da je tehnički gledano TSQL jedini način za rad sa SQL Serverom.
Vizuelni alati su tu samo kao pomoć, a svaki iskusni administrator će brže uraditi svoj posao
dirketnim izvršavanjem TSQL naredbi.
U drugom nastavku ovog serijala smo kreirali bazu podataka pomoću vizuelnog alata, a sada
ćemo za vežbu to uraditi pomoću TSQL naredbe.
Pokrenite SQL Server Management Studio, konektujte se na SQL Server kao što smo to i
ranije radili. Kliknite na dugme „New Query“ u toolbar-u na vrhu čime ste otvorili prozor za
ipisivanje i izvršavanje upita. Obratite pažnju na dugme „Execute“ kojim se pokreće
izvršavanje upita:
Na osnovu ovih atributa treba definisita strukturu tabele i ispravno izabrati tip i dužinu
tekstualnih polja.
Nazivi kolona mogu imati do 128 karaktera, ali to ne treba zloupotrebljavati jer će kasniji rad
biti komplikovaniji. Potrebno je izabrati imena koja su razumljiva i dovoljno kratka. Struktura
naše tabele bi mogla da izgleda ovako:
JedBrojVozila - int, primarni ključ tabele, obavezno za unos
Proizvodjac – nvarchar (20) , obavezno za unos
Model – nvarchar (15) , obavezno za unos
DatumProizvodnje - date, obavezno za unos
Registrovan - bit, obavezno za unos
PredjenaKilometraza - int, obavezno za unos
ZapreminaMotora - smallint, obavezno za unos
SnagaMotora – real
TipGoriva – nvarchar (6) , obavezno za unos
TipKaroserije – nvarchar (8) , obavezno za unos
Cena – smallmoney, obavezno za unos
Napomene - ntext
Na osnovu tipova i dužina očekivanih podataka smo formirali strukturu i definisali koji podaci
su obavezni za unos, a koji ne.
Sada u dizajneru treba uneti sve atribute i njihove tipove kao što je prikazano na slici:
Svaka tabela treba da ima primarni ključ, odnosno kolonu čija vrednost jedinstveno
identifikuje svaki slog tabele. Rekli smo da će kolona JedBrojVozila biti primarni ključ, pa ga
treba i napraviti nad njom.
Uradite desni klik na naziv kolone JedBrojVozila i iz padajućeg menija izaberite stavku „Set
primary key“. Kada ovo uradite, obratite pažnju na malu ikonu levo od kolone JedBrojVozila
koja označava da je ova kolona primarni ključ:
Ostaje još da snimimo ovu tabelu i pri tome joj damo naziv, u našem slučaju Automobili. U
toolbaru kliknite na ikonu diskete, čime se prikazuje dijalog za davanje imena tabeli. Unesite
Automobili i kliknite na dugme OK:
U pozadini je SQL Serveru poslat upit za kreiranje tabele – CREATE TABLE ... sa
odgovarajućim parametrima:
CREATE TABLE Automobili
(
JedBrojVozila int NOT NULL,
Proizvodjac nvarchar(20) NOT NULL,
Model nvarchar(15) NOT NULL,
DatumProizvodnje date NOT NULL,
Registrovan bit NOT NULL,
PredjenaKilometraza int NOT NULL,
ZapreminaMotora smallint NOT NULL,
SnagaMotora real NULL,
TipGoriva nvarchar(6) NOT NULL,
TipKaroserije nvarchar(8) NOT NULL,
Cena smallmoney NOT NULL,
Napomene ntext NULL,
CONSTRAINT PK_Automobili PRIMARY KEY (JedBrojVozila)
)
Proučite ovaj upit i videćete da nije ni približno komplikovan koliko to na prvi pogled izgleda.
Uvod
Svima je poznat termin „relaciona baza podataka“ a u ovom, poslednjem nastavku ćemo se
pozabaviti upravo ovom tematikom.
Kada se kaže „relacija“ misli se na vezu između dve tabele u istoj bazi podataka. Najbolje je
objasniti na primeru učenika i njegovih ocena:
Potrebno je da vodimo informacije o svim učenicima i njihovim ocenama. Za ovo je očigledno
potrebno imati dve tabele: „Učenici“ i „Ocene“. U tabeli „Učenici“ ćemo imati sve potrebne
podatke o učeniku (lični podaci, odeljenje, godina itd), a u tabeli „Ocene“ sve potrebne
podatke o oceni (koji učenik, koja ocena, datum, profesor, predmet...).
Kada gledamo podatke u tabeli „Ocene“, neophodno je da znamo podatke o učeniku koji je
dobio tu ocenu. Pre koncepta relacionog modela ovo je značilo da uz svaki slog tabele
„Ocene“ imamo kompletne informacije o svakom učeniku. Ovo praktično znači da ako jedan
isti učenik ima N ocena, svi njegovi podaci će biti ponovljeni (klonirani) takođe N puta uz
svaku ocenu.
Očigledna je neefikasnost ovakvog koncepta. Bespotrebno se set istih podataka klonira na
puno mesta. U praksi stvari su još gore je svaki učenik ima i svoje izostanke, predmete koje
pohađa, sekcije i tako dalje.
Manje očigledan, a veliki problem se događa prilikom izmena podataka o učeniku. Ako na
primjer, učenik promeni adresu stanovanja, ovu izmenu moramo propagirati na mnogo tabela
i slogova – svuda gde se nalazi set podataka o ovom učeniku. Ovo će u praksi da potraje, a
za to vreme ima puno šansi da nešto podje naopako pa da na kraju negde ove izmene prođu
a negde ne.
Teorija
Na našem primjeru treba primjeniti takozvanu prvu normalnu formu (prvi nivo normalizacije),
koji eliminiše bespotrebno ponavljanje istih podataka. Da bi ovo mogli uraditi predhodno
moramo kreirati primarni ključ u tabeli „Učenici“. Kao što smo pričali ranije, primarni ključ je
kolona u tabeli koja ima jedinstvene vrednosti. Zavisno od potreba, ova kolona može biti
različitih tipova – numerička ili tekstualna. Ako za tabelu „Učenici“ usvojimo da kolona koja
sadrži broj knjižice u formatu broj učenika/godina upisa, vrednost može biti na primer
24/2009. Ovo znači da kada se referišemo na učenika sa ovakvom vrednošću primarnog
ključa, uvek imamo informacije o jednom i samo jednom učeniku u tabeli.
Osnovna ideja prve normalne forme je da se umesto svih podataka o nekom entitetu, čuva
samo vrijednost primarnog ključa.
U našem slučaju ovo znači da u tabeli „Ocjene“ imamo samo informaciju o vrednosti
primarnog ključa učenika koji se nalazi u tabeli „Učenici“. Ovo znači da gledajući tabelu
„Ocjene“ uvek možemo pogledati i podatke o učeniku jednostavnim zadavanjem filtera za
vrijednost primarnog ključa u tabeli „Učenici“.
Da bi ovo ilustrovali na primjeru, pogledajte dvije tabele sa test podacima na sledećoj slici:
U tabeli „Ucenici“ kolona „UcenikID“ predstavlja primarni ključ tabele čija vrjednost
identifikuje jedinstvenog učenika.
U tabeli „Ocene“ istoimena kolona „UcenikID“ predstavlja jedinstveni identifikator učenika koji
je dobio zadatu ocjenu. Samo ta vrjednost se ponavlja onoliko puta koliko učenik ima ocjena
– ne ponavljaju se svi atributi učenika. U tabeli „Ocene“ kolona „UcenikID“ se zove spoljni
ključ tabele (eng. Foreign key) jer se ova vrednost referiše na vrednost neke druge (spoljne)
tabele.
Na slici je uspostavljena relacija između ove dve tabele. Semantički napisano, uspostavljena
je 1:N relacija između Ucenici.UcenikID i Ocene.UcenikID. Pravilna notacija je
ImeTabele.ImeKolone.
1:N znaci da jedan učenik može da ima N ocena (ovo N uključuje i nijednu ocenu). Relacija
se standardno čita od strane tabele sa primarnim ključem ka tabeli sa spoljnim ključem i otud
1:N. Međutim možemo pročitati i u obrnutom smeru pa relacija postaje N:1, odnosno N
ocena može biti dodeljeno jednom učeniku.
Kolona „UcenikID“ u obe tabele ne mora isto da se zove (mada je preporučljivo radi lakšeg
snalaženja), ali ove dve kolone moraju biti istog tipa jer sadrže iste vrjednosti.
Implementacija relacije
Na kraju, u našoj test bazi ćemo kreirati gore obrađen primjer između učenika i njihovih
ocjena.
Pokrenite Microsoft SQL Server Management Studio i u ranije kreiranoj bazi „Test“ napravite
tabele „Ucenici“ i „Ocjene“ sa sledećim atributima (konsultujte predhodni nastavak serijala):
„Ucenici“
UcenikID char (8) NOT NULL PRIMARY KEY (format nnn/gggg)
Ime nvarchar(10) NOT NULL
Prezime nvarchar(15) NOT NULL
Ostale atribute dodajte po zahtevu...
„Ocjene“
OcjenaID int NOT NULL PRIMARY KEY
UcenikID char(8) NOT NULL
Ocjena tinyint NOT NULL
Datum datetime NOT NULL
Takođe ostale atribute dodati po zahtevu...
Ocjene:
Sada je potrebno ove dve tabele povezati relacijom 1:N, odnosno Ucenici.UcenikID :
Ocene.UcenikID.
Sa leve strane Management Studia u Object Exploreru otvorite čvor Database, potom bazu
podataka „Test“, uradite desni klik na stavku „Database Diagrams“ i na kraju izaberite stavku
„New Database Diagram“:
Posto se kreira prva relacija u bazi, na postavljeno pitanja o dodavanju objekata za podršku
relacijama odgovorite potvrdno sa „Yes“:
U narednom dijalogu treba izabrati tabele koje treba da učestvuju u relaciji. U našem slučaju
„Ucenici“ i „Ocjene“, zatim kliknite na dugme „Add“ i potom na dugme „Close“ kako bi zatvorili
dijalog za izbor tabela:
Otvoren je prozor za kreiranje relacija između tabela. U njemu se nalaze naše dve tabele
koje sada treba povezati. Pomoću „drag and drop“ načina treba prevući kolonu „UcenikID“ iz
tabele „Ucenici“ na istoimenu kolonu u tabeli „Ocjene“. Uradite ovo kako bi kreirali relaciju
prikazanu na sledećoj slici (na oba dijaloga koje ste dobili posle kreiranja relacije odgovorite
sa „OK“).
Linija koja povezuje kolone u relaciji sigurno neće biti kao na slici. Poziciju tabela i linija
relacije možete rasporediti kako vama odgovara. Zvezdice pored naziva tabela znače da ova
relacije još uvek nije snimljena u bazu. Da bi to uradili kliknite na ikonu diskete u gornjoj liniji
alata. Management Studio će pre snimanja pitati za naziv ovog Database dijagrama – upišite
na primer „Relacije“ (bez znakova navoda) i kliknite na dugme „OK“ i potom na „Yes“ da bi
potvrdili izmene u tabelama koje se odnose na kreiranje spoljnog ključa.
Primetićete da su sada nestale zvezde pored imena tabela, što znači da je relacija snimljena
u bazu.
Zaključak
Ovom vežbom smo postigli prvi nivo normalizacije između dve tabele – nema bespotrebno
ponovljenih podataka.
Osim ovoga, uradili smo još dve značajne stvari koje nisu vidljive na prvi pogled, a sa
kreiranjem relacije su automatski „ugrađene“ u bazu podataka.
Kada dodajemo nov slog u tabelu „Ocjene“ moramo koloni „UcenikID“ dodati vrednost tj.
učenika koji postoji u bazi „Ucenici“. U suprotnom, dodavanje (a i izmena) sloga neće biti
moguća. Na ovaj način baza podataka štiti logičko pravilo koje smo uspostavili relacijom –
svaka ocena mora da ima svog postojećeg učenika.
Ako učenik ima bar jednu ili više ocena, nije dozvoljeno da se on obriše iz tabele „Ucenici“. U
suprotnom, imali bi ocene pridodeljene učeniku koji ne postoji, što opet narušava pravilo
relacije i referencijalnog integriteta.
U savremenim bazama podataka osim ovakvih moguće je kreirati još mnogo drugih pravila
koja se proveravaju na nivou same baze podataka, a ne na nivou aplikacije koja komunicira
sa bazom.
Sa ovim nastavkom završavamo serijal o Microsoft SQL Express 2008 bazi podataka.
Dalje informacije možete pronađi na puno lokacija na Web-u, gde bih izdvojio sledeće:
Matična strana: http://www.microsoft.com/express/sql/default.aspx
Domaći web portal za programere i baze podataka: http://msforge.net/
Sajt za učenje generalnog programiranja uključujući i SQL Server:
http://msdn.microsoft.com/en-us/beginner/default.aspx
Pregled karakteristika i drugi resursi: http://www.devx.com/MicrosoftISV/Article/38728
SQL Express WebLog: http://blogs.msdn.com/sqlexpress/