fix
Logo
fix
Nalazite se na Region-SQL_SERVER_2000
Za dodavanje novih poruka na ovu stranicu kliknite ovdje
Za pregled svih najnovijih poruka kliknete ovdje

sql_server_2000- 325 - 27.10.2004 : Zeljko Tomic Sokolac - best (1)

Zašto baš SQL Server


Kao prvo, dobro došli u moju malu školu SQL Servera 2000. Materijal koji je objavljen na ovoj stranici, su ustvari biljeske koje sam ja pravio u elektronskoj formi dok sam ucio SQL Server. Nedavno sam, sasvim slucajno, nasao taj materijal pa sam odlucio da ga, uz malu obradu, stavim na ovu stranicu. Siguran sam da negdje u svijetu postoji bar jedna osoba zeljna znanja, kojoj ce ovaj materijal pomoci da nauci SQL Server.

SQL Server definitivno nije najbolja baza! Kralj baza podataka je Oracle i na ovom sajtu, jos od 2001. godine postoji kurs od nekih 600 stranica, koji mozete da vidite ako kliknete ovdje. Medjutim, pored toga sto je perfektan, Oracle je i skup, a i komplikovan za nauciti. Sve u svemu, ja sam ovdje da nesto kazem i o SQL Serveru.

SQL Server je jedna dosta dobra baza podataka, sa jako lijepim interfejsom, koji se veoma lako uci. Ako imate imalo programerskog iskustva, mislim da ce vam ove biljeske biti dovoljne - ne morate trositi pare ni na kakvu knjigu.

Kao i vecina Mikrosoftovih proizvoda, instalacija SQL Servera je prilicno jednostavna. Treba imati u vidu da ima nekoliko varijanti SQL Servera, pa vam preporucujem da obratite paznju koju(e) od njih podrzava vasa verzija Windows operativnog sistema. O tome ce biti rijeci i u narednih par lekcija ovoga kursa.

Kurs je besplatan, a ukoliko nemate stalan pristup internetu, ovu stranicu mozete snimiti na vas kompjuter. U svakom slucaju, bio bih vam jako zahvalan ukoliko biste me obavjestili ako vam je ovo moje "pisanije" pomoglo da naucite SQL Server, pa bi mi bilo jako drago ako bite mi poslali neki e-mail na moju adresu: slavicnetŽhotmail.com. Takodje sve sugestije, ispravke i komentari su dobro dosli.
sql_server_2000- 326 - 27.10.2004 : Zeljko Tomic Sokolac - best (1)

Lekcija 1 - Verzije SQL Servera 2000


Napomena: Svaka od dolje navedenih verzija može da se nadgradi u veću

  • 1) Enterprise edition - ova verzija podrzava racunare sa vise procesora i razne druge vrste hardvera. Pored toga, ova opcija uklucuje Data Transformation Services. Jako je preporucujem za firme koje hoce da razviju aplikacije koje ce raditi na internetu. Osnovne komponente ove verzije su tkz. "Enterprise Manager", tj. alat za kreiranje baza podataka i svih objekata unutar baze. Sledeca komponenta je tkz. "Query Analyzer" koji se uglavnom koristi za pisanje programa i upita. Ova verzija moze da se izvrsava samo na sledecim operativnim sistemima: Windows NT4 (SP5), Win 2000, Win 2000 Advanced Server, Windows 2000 Data Center Server. Treba napomenuti i to da ova verzija ne radi sa Windows 2000 Professional.

  • 2) Developer Edition - ovo je po meni, za vas najbolja verzija. Jedina razlika izmedju ove verzije i gore pomenute je da nema graficki interfejs za setovanje ostalih jezika, sem engleskog. Dobra stvar je da je licenca mnogo jeftinija od "Enterprise Edition", a radi i na Windows 2000 Professional. Jedan od problema je da, po ugovoru tj. licenci koju dobijate od Mikrosofta, nemate pravo da je izvrsavate na serveru, nego samo na radnoj stanici (workstation).


  • 3) Standard Edition - ova verzija nema mnogo opcija koje imaju gornje verzije. Ona takodje ne radi na Windows 2000 Professional, ali ima jednu jako dobru opciju, tj. pomocu alata za tkz. replikaciju, cijelu bazu mozete veoma brzo i lako replicirati na drugi kompjuter. Ova verzija nije za pocetnike, i ja bih je preporucio jedino onima koji su novi u ovoj oblasti, hoce da kupe licencu jer im za biznis treba racunar na internetu, ali nisu sigurni da hoce da se u svom daljem radu vezu za SQL Server.

  • 4) Personal Edition - ova verzija je skoro ista kao i Standardna verzija izuzev sto moze da se izvrsava na Windows 2000 Professional, Windows NT Workstation and Windows 98. Ukoliko nemate racunar bolji od Pentijum 2, ja bih vam preporucio ovu verziju.

  • 5) SQL Server CE Edition - ova verzija radi na Windows CE, tj. na onoj verziji Windows-a koju mozete naci na tkz. "hand held devices", tj. na dzepnim kompjuterima. Kako je glavna osobina ovih dzepnih kompjutera da imaju veoma ogranicen kapacitet memorije, tako i ova verzija ima ogranicene mogucnosti. Ova verzija se moze konektovati na server, i sa njega skinuti podatke za osobe koje su stalno u pokretu, npr. trgovacki putnici itd.

  • 6) Desktop Edition - Ukoliko je neko za vas razvio neku aplikaciju na "Enterprise Edition", ali vi hocete da prodjete sa minimalnim ulaganjima, a uz to ne znati ama bas nista o razvoju aplikacija, onda je ova verzija za vas. Ova verzija nema nikakav inerfejs, niti administrativni alat. Jedina stvar koju mozete da radite sa ovom verzijom, je da koristite aplikaciju za rad sa bazom podataka.
  • sql_server_2000- 328 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 2 - Kakav racunar trebate


    Za rad sa SQL Serverom 2000 morate imati minimalno:

  • 1) Pentijum I - P166 ili bolji

  • 2) Minimalno 64 Mb RAM-a, izuzev za Windows CE. "Personal Edition" moze da radi i na 32 Mb, dok za "Enterprise Edition" morate da imate najmanje 128 Mb, preporucivo 256 Mb da biste imali "swapping processes", ali to je duga prica.

  • 3) Hard Disk - 250 Mb za instalaciju, bez ikakvih podataka u bazi.

  • 4) Ekran rezolucije minimalno 800x600, preporucivo bar 1024x768.

  • 5) CD ROM za instalaciju

  • 6) Uredjaj za pravljenje kopije podataka (ne mislim na disketnu jedinicu. )
  • sql_server_2000- 330 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 3 - Operativni sistem


    Ukoliko instalirate "Windows 2000 Professional" na:

  • 1) Windows 95 - imacete samo "Client Tools" ( bazi mozete pristupiti samo preko URL adrese, ili upitom sa komandne linije) i "Connectivity Only" (mozete se konektovati na server preko aplikacije koju ste napravili u nekom programskom jeziku

  • 2) Windows 98 - ovaj operativni sistem podrzava "Personal" i "Desktop" verziju. Na server se mozete povezati jedino koristeci "SQL Server Authentication", a ne kroz "System authentication". To znaci da ne mozete koristiti ime i lozinku koju koristite da se prijavite kada startujete Windows 98 (ja to ionako nikada nisam koristio. )

    U lekciji 1. i 2. smo rekli da Windows 2000 Professional radi sa "Developer" i "Personal" edition. Skoro sve verzije SQL Servera 2000 rade na Windows 2000 Server ili vecim verzijama.
  • sql_server_2000- 335 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 4 - Baze unutar SQL Server-a


    Nakon instaliranja SQL Servera, ustanovicete da vec imate nekoliko baza podataka koje dodju sa serverom:


    1. Master baza

    Ova baza je srce SQL Server-a. Prvu stvar koju treba da naucite o njoj je da nikada nista ne promjenite unutar baze. Ova baza sadrzi:

  • Korisnicke podatke potrebne za konektovanje u bazu.
  • Sistemske parametre - setovanje jezika, nacina sortiranje, sigurnosti pristupa.
  • Imena i informacije vezane za bazu: ime DB datoteka...
  • Lokacija baze podataka
  • Nacin na koji je server inicijalizovan.

    Tabele ove baze podataka sadrze:

  • Kako je "cache" koristen, tj. kako je memorija rasporedjena izmedju OS i baze.
  • Sifra jezika koji je instalisan.
  • Lista jezika koji su na raspolaganju.
  • Sistemske greske i opomene koje mogu biti upucene korisniku u toku rada.

    2. tempdb baza

    Ova baza podataka je tkz. "privremena" baza, tj. traje samo dok je SQL Server aktivan. Ako zaustavite server, ili ponovo startujete vas kompjuter, ova baza ce biti ponovo kreirana, ali potpuno prazna, bez podataka. Ova baza se koristi za smjestaj privremenih podataka, prilikom sortiranja ili nekih matematickih operacija. Kada se jedna obrada tj. transakcija zavrsi, ti podaci vise nisu potrebni.


    3. model baza

    Ova baza se koristi kao model za kreiranje svih ostalih baza podataka, koje cete vi kao korisnik kreirati. U njoj se nalazi parametar koji definise pocetnu velicinu baze, koji vi mozete promjeniti u ovoj bazi, ukoliko hocete da buduce baze budu razlicite velicine. Pored toga, ako zelite da sve vase buduce baze imaju vec definisane neke objekte, na primer tabele itd. vi mozete njih kreirati u ovoj bazi. Baza se koristi i kao sablon za kreiranje
    tempdb baze.

    4. msdb baza

    Ova baza se koristi od strane SQL Server Agent-a za izvrsavanje poslova koji su programirani da pocnu u odredjeno vrijeme dana ili noci. Pored toga u ovoj bazi mozete naci i poruke o greskama koje su upucene korisniku u toku izvrsavanja upita. Neki drugi procesi koriste ovu bazu, npr. backup i restore.

    5. pubs baza

    Ova baza podataka je jako korisan primjer iz koga mozemo mnogo nauciti, prije nego sto pocnemo da pravimo nase baze podataka. U ovoj bazi imamo primjer baze podataka nekog fiktivnog izdavaca knjiga. Baza podataka sadrzi podatke o knjigama, autorima, zaposlenim, kao i druge informacije.

    Northwind baza

    Ovo je drugi primjer baze podataka koja sadrzi podatke o nekoj fiktivnoj kompaniji koja snabdjeva trgovine robom. Baza sadrzi tabele tipa: Korisnici, Narudzbe, Fakture, Proizvodi itd.
  • sql_server_2000- 337 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 5 - Tipovi podataka


    SQL Server moze da sacuva dvije vrste podataka:

  • Podatke u ASCII formatu - koristi se jedan bajt, koji moze sacuvati 256 razlicitih znakova jezika
  • Podatke u UNICODE formatu - koriste se dva bajta, sa 65536 znakovnih mjesta, sto je dovoljno za sve jezike

    SQL Server ima sledece pri-definisane tipove podataka:

  • 1) char - ovaj tip je tkz. fiksne duzine, tj. svaki podatak zauzima definisanu duzinu; maksimalna duzina je 256 znakova char(256).
  • 2) nchar - i ovaj podatak ima fiksnu duzinu, maksimalno nchar(65536), koristi se za UNICODE podatke

  • 3) varchar - ovaj tip podataka ima promjenjivu duzinu, tj. zauzima samo onoliko znakova kolika je duzina podatka, maksimalno varchar(8000)
  • 4) nvarchar - isto kao varchar, ali za UNICODE podatke - maksimalna duzina varchar(4000), jer UNICODE zauzima dva bajta po znaku

  • 5) text - ova vrsta podataka je varijabilne duzine, maksimalno 2 Gb. Ako je podatak manji od text(7000) podaci se cuvaju u skupa sa ostalim podacima, inace se u slog smjesti samo pointer na stvarne podatke.
  • 6) ntext - ova vrsta podataka je varijabilne duzine, maksimalno 1 Gb, jer cuva UNICODE podatke.

  • 7) image - ova vrsta podataka je slicna "text" tipu, izuzev sto cuva binarne podatke - slike.

  • 9) bigint - cuva cijele brojeve, izmedju -9x10**18 i 9x10**18
  • 8) int - cuva cijele brojeve izmedju -2, 147, 483, 648 i 2, 147, 483, 647
  • 10) smallint - cuva cijele brojeve, izmedju -32768 i 32767
  • 11) tinyint - between 0 and 255

  • 12) decimal, numeric - cuva decimalne brojeve izmedju -10**38+1 i 10**38
  • 13) float - cuva brojeve sa pokretnim zarezom izmedju -1. 79E308 i 1. 79E308. Brojevi koji se zavrsavaju na 3, 6 i 7 se zaokruzuju, pa moze doci do gubljenja preciznosti.
  • 14) real - cuva podatke izmedju -3. 40E38 and 3. 40E38. Vrijednost je priblizna, kao u prethodnom primjeru.

  • 15) money - cuva vrijednosti izrazene u valuti vase zemlje, vrijednosti su izmedju -9x10**14 i 9x10**14 sa 4 decimalna mjesta.
  • 16) smallmoney - cuva vrijednosti izrazene u nekoj valuti, vrijednosti su izmedju -214, 748. 3648 i 214, 748. 3647

  • 17) datetime - cuva podatke tipa datum i vrijeme, vrijednosti su izmedju January 1, 1753 i December 31, 9999. Default vrijeme je "12:00:00".
  • 18) smalldatetime - Cuva datum i vrijeme izmedju January 1, 1900 i June 6th, 2079.

  • 19) timestamp/rowversion - Ukoliko kreirate slog koji sadrzi polje tipa "timestamp", svaki put kada je taj slog modifikovan u ovo polje ce biti automatski upisan datum i vrijeme promjene. Mikrosoft preporucije koristenje "rowversion" posto je ovaj tip kompatibilan sa SQL-92 standardom.
  • 20) uniqueidentifier (GUID) - vrijednost za ovo polje se generise automatski na osnovu broja koji je upisan u procesor vaseg racunara, kao i broja vase mrezne kartice, i naravno, datuma i vremena kada je transakcija uradjena. Ovo je jako vazno za neke institucije, kao drzavne organe, koji ponekad hoce da udju u trag koji je pojedinac izvrsio promjenu nekih podataka. Podatak je jedinstven za svaki kompjuter u svijetu.
  • 21) binary - koristi se za tkz. programske "flagove", ili kombinaciju "flagova".
  • 22) varbinary - pinarni podatak promjenjive duzine.
  • 23) bit - podatak zauzima samo 1 bit (cuva samo vrijednosti 0 i 1).
  • sql_server_2000- 339 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 6 - SQL Server alati


    Za uspjesan rad sa SQL serverom, potrebno je znati nekoliko njegovih alata. Najvazniji su:

  • Enterprajz Menadzer (Enterprise Manager) - je jedan od najvaznijih alata SQL Servera. On nam omogucuje da izvrsimo skoro svaki administrativni zadatak potreban za rad sa ovom bazom podataka.

  • Kveri Analajzer (Query Analyzer) - koristi se za kreiranje, debagiranje i testiranje T-SQL (MS SQL jezik) skripti, kao i analiziranje brzine njihovog izvrsavanja.
  • sql_server_2000- 341 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 7 - Enterprajz menadzer


    Engleski: Enterprise Manager

    Ako ste tek instalirali i poceli da ucite SQL Server, vjerovatno se ova baza nalazi na istom kompjuteru na kome sada radite. Medjutim, SQL Server je obicno instaliran na posebnom racunaru, koji je povezan u mrezu sa drugim racunarima. U skvakom slucaju, princip je isti. Glavna stvar koju vi treba da znate u vezi komunikacije sa bazom podataka je da na racunaru na kome je instaliran SQL Server, postoji jedan mali proces (program koji je stalno aktivan) koji "osluskuje" zahtjeve drugih programa i ispunjava njihove zelje. Funkcija pomenutog servisa je da prosledi nase zahtjeve SQL masini, koja je srce SQL Servera i koja u stvari izvrsava sve prosledjene upite nad podacima spremljenim u bazi podataka.

    Mozda je dobro pomenuti i to da, posto se ovaj servis izvrsava pod Windows-ima, onda su Windows-i odgovorni za uspjesnost izvrsavanje ovog programa jer mu oni dodjeljuju potrebnu kolicinu memorije, procesorskog vremena i ostalih kompjuterskih resursa.

    Posto je jedini nacin komuniciranja sa SQL Serverom putem ovog malog servisa, a on nema nikakvog korisnickog interfejsa (programa za komunikaciju sa bazom podataka, tj. SQL Server masinom), bilo je potrebno napraviti alate, kao sto je Enterprajz menadzer.

    Enterprajz menadzer je program koji moze biti koristen za razvoj programa i administraciju vise baza podataka istovremeno.

    1. Mikrosoft menadzment konzola - je graficki alat koji predstavlja srz Enterprajz menadzera, zbog toga sto povezuje alate kao sto su Enterprajz menadzer i IIS server (Internet Information Server tj. Informacioni internet server). Za startovanje SQL server enterprajz menadzera izaberite Start->Programs->Microsoft SQL Server->Enterprise Manager. U prozoru koji ce se otvoriti, vidjecete tkz. nodove (nodes) koji su oznaceni sa + znakom. Nodovi su obicno zatvoreni, i otvaraju se ako kliknete na njih. Ukoliko pod opcijom SQL Server Group ne vidite ni jednu bazu podataka, provjerite da li imate instaliranu bazu ili pokusajte da se konektujete na neku od njih. Ako ste medjutim, uspjeli da se konektujete u vasu bazu podataka, pored imena vase baze vidjecete nekoliko nodova tj. cvorova, o kojima cemo jos da diskutujemo u narednim lekcijama.

    Security node - cvor za sigurnost baze - ovaj nod definise ko ima pravo da se konektuje (logins), koja prava korisnik ima u toj bazi (roles), koji su povezani serveri (Linked Servers) i udaljeni serveri (Remote Servers) sa kojima moze da radi.

    Database Node - cvor za baze podataka - ovaj nod, sadrzi ikone za svaku vrstu objekata koje baza podataka posjeduje. Na primjer, ako u desnom prozoru kliknemo na Tables, vidjecemo sve tabele koje su kreirane u bazi.

    View Node - cvor za dinamicke table - ovaj cvor sadrzi listu upita, koji se koriste za kreiranje dinamickih tabela, baziranih na jednoj ili vise tabela u bazi podataka.

    Napomena: Kod rada sa ovim vizuelnim alatima, veoma je vazno na kojem je nodu (cvoru) pozicioniran kursor. U zavisnosti od toga, dobijate na raspolaganje mnostvo drugih komandi na glavnom meniju i kada kliknete na desni taster misa

    2. Menadzer servisa (Service Manager) - je programski alat koji omogucuje startovanje i zaustavljanje servisa, neophodnih za komuniciranje sa bazom podataka.
    sql_server_2000- 342 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 8 - Analizator upita


    Analizator upita (Query Analyser) - je mocan alat za pisanje, testiranje i izvrsavanje SQL upita, kao i prikazivanje dobijenih rezultata.

    Prvobitna verzija ovog alata se zvala, ISQL i mozete je probati startovanjem is CMD (DOS) prozora. Jako puno podsjeca na Oracle SQL*Plus.

    Za startovanje ovoga alata potrebno je izabrati opciju Start->Programs->Microsoft SQL Server->Query Analyzer.

    Prilikom startovanja ovog alata, potrebno je unijeti korisnicko ime i lozinku (password). Ukoliko ste instalirali bazu, ali niste kreirali novog korisnika, mozete se konektovati kao korisnik "sa". Za lozinku ostavite prazno polje. Drugi nacin je konektovanje koristeci prava koja ste stekli kada ste se prijavili kao Windows korisnik. Naime, vase korisnicko ime i lozinka, bice koristeni za konektovanje u bazu. Ukoliko je baza instalirana na istom kompjuteru, necete imati nikakvih problema ako izaberete ovu opciju.

    U desnom okviru prozora koji se otvorio kada smo startovali Analizator upita (The Object Browser), mozemo vidjeti nekoliko baza podataka (cetiri baze su neophodne za startovanje SQL servera; dvije baze su primjeri). Ova grupa baza podataka poznata je pod nazivom "sistemski objekti" ili System Objects. Ona ukljucuje sistemske table, poglede (dinamicke tabele), kao i cijele baze podataka.

    Druga grupa objekata se naziva "zajednicki objekti" ili Common Objects i ona ukljucuje sve one objekte koji su zajednicki za sve baze podataka.
    sql_server_2000- 345 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 9 - meni Analizatora upita (1)



    FILE->Connect - ovu opciju koristimo za konektovanje na novi server.
    FILE->Disconnect - ova opcija je za odjavu sa servera
    FILE->Disconnect All - ova opcija ukida sve konekcije SQL Servera
    FILE->New - Otvara prazan okvir za pisanje upita. To mozemo uraditi i sa <Ctrl+Shift+P> tasterima.
    FILE->Save - Ova opcija snima upit koji smo napisali ili rezultat tog upita.
    FILE->Exit - Odjavljuje nas od svih servera na koje smo konektovani, i zatvara Analizator upita. <Alt+F4>

    Edit->Clear Window - Opcija brise upit u radnom okviru <Ctrl+Shift+Delete >
    Edit->Bookmarks - Markira tekucu liniju u radnom okviru <Shift+F2>. Za skakanje na sledeci bookmark koristite F2 taster, na prethodni Shift+F2 a sa ukidanje bukmarka Ctrl+F2. Za brisanje svih bukmarka kucajte Ctrl+Shift+F2.
    Edit->Insert template - Ova komanda bacuje templejt u radni panel <Ctrl+Shift+Ins>
    Edit->Replace Template Parameters - Mijenja parametre sablona koji smo ubacili u radni panel <Ctrl+Shift+M>
    Edit->Advanced - Ova opcija se koristi za setovanje pod-meni opcija
  • Edit->Advanced->Make Selection Lower Case - Pretvara selektovani tekst u velika slova. <Ctrl+Shift+L>
  • Edit->Advanced->Make Selection Upper Case - Pretvara selektovani tekst u mala slova. <Ctrl+Shift+U>
  • Edit->Advanced->Increase Indent - uredjuje tekst, povecava broj praznina na pocetku redova <Tab>
  • Edit->Advanced->Decrease Indent - uredjuje tekst, smanjuje broj praznina na pocetku selektovanih redova <Shift+Tab>
  • Edit->Advanced->Comment out - stavlja znakove komentara na komande, tako da se nece izvrsiti <Ctrl+Shift+C>
  • Edit->Advanced->Remove Comments - Brise komentare iz selektovanog koda <Ctrl+Shift+R>
    Query->Change Database - Koristite ovu opciju ako hocete da se konektujete na drugu bazu podataka <Ctrl+U>
    Query->Parse - Kompajlira selektovani kod u cilju provjere gresaka <Ctrl+F5>
    Query->Execute - Izvrsava selektovani tekst <F5> <Ctrl+E>
    Query->Cancel Executing Query - Prekida izvrsavanje selektovanog teksta <Alt+Break>
    Query->Results in Text - Prebacuje rezultat nekog upita u format, pogodan za snimanje u tekst datoteku <Ctrl+T>
    Query->Results in Grid - Prikazuje rezultate u grid obliku <Ctrl+D>
    Query->Results to File - Salje rezultat upita direktno u datoteku <Ctrl+Shift+F>
    Query->Current Connection Properties - Prikazuje atribute vase konekcije na bazu podataka
  • SET noexec ON
  • SET parseonly ON
  • SET rowcount 20 - return only 20 redova iz upita
  • SET quoted_identifier OFF - omogucuje upotrebu duplih navodnika za definisanje vrijednosti stringa unutar skripta.
  • sql_server_2000- 346 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 10 - meni Analizatora upita (2)


    Tools->Options Menu - <Ctrl+Shift+O> - ova opcija se koristi za setovanje mnogo opcija u Analizatoru upita. Ima vise tabulator dijalog boksova.
  • The General Tab - radni folder, ekstenzije datoteka...
  • The Tab Editor - definise karakteristike vaseg editora. Mozete da definisete i koliko praznih mjesta je vas tabulator, kao i da li hocete da snimite znakove za prazno umjesto "tab" znaka, ili da li hocete da snimate u UNICODE formatu.
  • The Result Tab - definise kako su rezultati prikazani u Kveri analajzeru.
  • The Connection Tab - mozete selektovati vas "regional setting", tj. nacin na koji ce biti prikazani datumi, brojevi, valute...
  • The Connection Properties Tab - Isto kao "Query->Current Connection Property", izuzev sto se koristi za setovanje konekcije na SQL Server.
  • The Fonts Tab - definise fontove koje zelite da koristite.
  • The Script Tab - Definishe atribute skripti koje pisete.
    Tools->Customize Menu - programira funkcijske tastere da izvrse odgovarajucu radnju.
  • sql_server_2000- 347 - 27.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 11 - Ostali alati SQL Servera


    Analysis Services - koriste se za "data mining" i "data warehousing".
    English Query - Omogucavaju onima koji nisu programeri da postavljaju upite na engleskom jeziku.
    Data Transformation Services - Koriste se za "obradu" i ciscenje podataka, povecavajuci njihovu tacnost. Izvor podataka moze biti bilo koja druga baza podataka, npr. Oracle, Access...
    SQL Profiler ovaj alat koriste administratori baza podataka za nadgledanje performansi baze, tj. kako se procesi baze odvijaju.
    sql_server_2000- 362 - 28.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 12 - Kreiranje baze podataka


    Prvi korak pri radu SQL Servera je da kreirate svoju bazu podataka. Kreiranje baze podataka vrsi se u SQL Server Enterprise Manager-U. Prvo je potrebno da startujete Enterprajz Menadzer (Start->Programs->Sql Server->Enterprise Manager. Bazu podataka mozete kreirati na sledece nacine:

  • 1. Kliknete na "Databases", a zatim kliknete na desni taster misa. Na meniju koji dobijete izaberite opciju "New Database.. ". Slijedite instrukcije koje dobijete. Ukoliko nemate posebnih zahtjeva, ostavite sve kako vam Enterpajz menadzer predlozi. Naravno, preporucujem da promjenite ime baze podataka.

  • 2. Kliknite na "Wizard" taster na vasem "Toolbar"-u (to je mala ikona na vrhu ekrana, u obliku carobnog stapica). Slijedite instrukcije. Na kraju, kada je baza kreirana, dobicete poruku: "Would you like to create a maintenance plan.... ". Kliknite na "No", i sa ovim je proces kreiranja baze zavrsen, ukoliko izvrsenje koda koji je Wizard generisao ne naidje na neki problem prilikom izvrsavanja.

  • 3. Otvorite "Query Analyzer" i kucate sledecu komandu:

    CREATE DATABASE snet_Test
    ON (NAME='snet_Test_Data',
    FILENAME='C:–Program Files–Microsoft SQL Server–MSSQL–data–snet_Test_Data. MDF',
    SIZE=1, FILEGROWTH=10%)
    LOG ON (NAME='snet_Test_Log',
    FILENAME='C:–Program Files–Microsoft SQL Server–MSSQL–data–snet_Test_Log. LDF',
    SIZE=1, FILEGROWTH=10%)
    COLLATE SQL_Latin1_General_CP1_CI_AS
    GO

    Nakon sto ste ukucali ovu komandu, kliknite na zeleni trougao u "Toolbar"-u da izvrsite komandu.

    Prilikom instalacije nove baze podataka, SQL Server setuje mnogo parametara, koje mi nismo naveli u nasoj komandi. To zbog toga sto default vrijednost SQL Server cuva u "model" bazi podataka, tako da ih koristi prilikom kreiranja baze. Ukoliko niste zadovoljni sa nekom od ovih opcija vi ih mozete promjeniti ako ih ukucate u Kveri analizer. Evo i nekoliko primjera za to:
    EXEC sp_dboption 'snet_Test', 'autoclose', 'True'
    GO
    EXEC sp_dboption 'snet_Test', 'read only', 'False'
    GO
    EXEC sp_dboption 'snet_Test', 'dbo use', 'False'
    GO
    EXEC sp_dboption 'snet_Test', 'single', 'False'
    GO
    EXEC sp_dboption 'snet_Test', 'autoshrink', 'False'
    GO
    EXEC sp_dboption 'snet_Test', 'quoted identifier', 'True'
    GO
    EXEC sp_dboption 'snet_Test', 'ANSI null default', 'False'
    GO

    Treba reci da je sp_dboption jedna sistemska funkcija, koja nam omogucava da setujemo ove parametre. Rijec je o tkz. "stored procedure", tj. proceduri koja je uskladistena u samoj "master" bazi SQL Servera.

    Moj omiljeni parametar je 'quoted identifier' koji ja setujem na 'False'. U tom slucaju, vrijednosti za stringove unutar baze podataka mogu biti definisani koristenjem bilo apostrofa ili navodnika. Napominjem i to da su navodnici tj. znak " koristeni za varijable koje imaju prazno mjesto u imenu.

    Napomena: Ukoliko u "Object browser"-u ne vidite bazu koju ste kreirali, kliknite na ikonu "Refresh", koja se nalazi u Toolbar-u, a ista je kao u Internet Explorer-u.
  • sql_server_2000- 363 - 28.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 13 - komande Query Analyser-a


    1. Prikazivanje informacija o bazi podataka
    Unesite "sp_helpdb snet_test" komandu. Ova komanda ce prikazati sve podatke o bazi podataka.


    2. Brisanje baze podataka
    Za brisanje baze podataka, koja vam vise nije potrebna kucate:
    "DROP DATABASE snet_test" u Query Analyser u pritisnete Execute ikonu.
    Ova komanda ce izbrisati sve podatke o ovoj bazi podataka iz sistem tabela, kao i fizicke datoteke na disku servera.
    Napominjem i to da morate pritisnuti ikonu "Refres", da bi baza podataka nestala iz "Object Navigator"-a.
    sql_server_2000- 365 - 28.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 14 - Kreiranje Tabela


    U prethodnoj lekciji smo naucili kako da kreiramo i izbrisemo bazu podataka. Baza podataka se definise kao jedan kontejner za sve ostale objekte koje baza moze sadrzati. Sa druge strane, tabele su osnovni objekti baze podataka, koji se koriste za smjestanje podataka. Baza podataka bez tabela je beskorisna. U ovoj lekciji cete nauciti kako da kreirate, modifikujete i izbrisete neku tabelu iz baze podataka. Kao i u prethodnoj lekciji, i ovdje cemo koristiti "Enterprise Manager" i "Query Analyzer" da izvrsimo ovaj zadatak.

    Za tabelu kazemo da je kontejner za slogove (ili vrste), koji su opet podjeljeni na polja(ili kolone). Svaka kolona ima svoj tip podataka, koji moze da cuva. Svako polje ima i dvije specijalne osobine: NULL i IDENTITY. Ako kolona dozvoljava smjestanje NULL vrijednosti ("nije poznata vrijednost polja"), to znaci da mi mozemo dodati novu vrstu u tabelu bez unosenja vrijednosti tog polja. Naravni, vrijednos uvijek moze biti naknadno dodata. Drugi atribut polja je IDENTITY. Ovaj atribut omogucuje da se polje popuni sa numerickom vrijednoscu, koja je generisana automatski.


    Using "IDENTITY" properti

    IDENTITY properti je vrlo slican "AutoNumber" u Access-u, izuzev sto ne garantuje jedinstvenu vrijednost za svaku kolonu. IDENTITY, kao i "SEQUENCE" u Oracle-u, ima svoju pocetnu vrijednost (default 1), kao i svoj inkrement (default 1). Drugim rijecima, to znaci da ce prvi slog koji unesemo u tabelu dobiti vrijednost 1, a svaki sledeci ce biti uvecan za 1 ( tj. 2, 3, 4. . . ).

    Kucajte u "Query Pane" sledecu komandu:

    CREATE TABLE Test
    (
    testID int IDENTITY NOT NULL,
    testName varchar(20) NULL
    )


    sledeca komanda je malo drugacija, ali daje isti rezultat:

    SET ANSI_NULL_DFLT_OFF ON

    CREATE TABLE Test
    (
    testID int IDENTITY(1, 1) NOT NULL,
    testName varchar(20) NULL
    )

    Jedina razlika je sto smo kod druge komande eksplicitno naznacili da se polje "testID" automatski popunjava sa pocetnom vrijednostu 1 i svaki sledeci put se uvecava za 1. Stvar je sto su to iste vrijednosti, kao i one koje su unaprijed definisane.

    Jos nekoliko interesantnih stvari:

  • IDENTITYCOL kljucna rijec nam omogucuje da izvrsimo upit na IDENTITY koloni, cak ako ne znamo ni ime kolone. Postoji nekoliko nacina da nadjemo informacije o IDENTITY koloni u SQL Serveru.
  • Funkcije IDENT_SEED() i IDENT_INCR() nam omogucuju da vidimo pocetnu vrijednost i inkrement za definisanu kolonu.
  • Sistemska funkcija ŽŽIDENTITY vraca vrijednost zadnje kolone koja je dodata u tabelu.


    Using "NULL" properti

    SQL Server "Allow Null" property ("dozvoli nule property"), definise da li neka kolona moze biti ostavljena nepopunjena tj. prazna. Vrijednost "NULL", znaci da vrijednost za to polje postoji, ali jos nije poznato. Primjera radi, broj odsutnih studenata moze biti "NULL", sto bi znacilo da vrijednost nije poznata, tj. da je profesor zaboravi da prebroji studente. Sa druge strane, vrijednost moze biti nula tj. "0", sto znaci da su svi studenti bili prisutni tj. da je profesor prebrojao studente i ustanovio da nema odsutnih. Prilikom racunanja prosjecne posjecenosti nastave, profesor moze izostaviti "NULL" vrijednosti i na taj nacin ce dobiti mnogo bolji prosjek, nego da pretpostavi da su "NULL" vrijednosti vrijednost 0.

    U gornjem primjeru, kada smo kreirali nasu prvu tablu na ovom kursu, vidjeli smo da smo za "testID" naznacili da vrijednost ne moze biti NULL. Sa druge strane, vrijednost "testName" NULL vrijednost je dozvoljena.


    Primljer: Kreiraj tabelu "Test2" i dodaj jedan slog. Nakon toga, izbrisi tabelu iz baze.

    CREATE TABLE Test2
    (
    testID int,
    testName varchar(20)
    )
    GO

    INSERT INTO TEST2
    VALUES
    (
    '2', 'MARIJA'
    )
    GO

    DROP TABLE TEST2
    GO
  • sql_server_2000- 366 - 28.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 15 - Korisnicki tipovi podataka


    Tabela u SQL Server moze da ima do 1024 kolone. Medjutim, duzina jedne vrste je ogranicena na 8060 bajtova, izuzev za podatke tipa "IMAGE" i "TEXT", jer se oni cuvaju izvan vrste.

    Pored sistemskih tipova podataka koji su ugradjeni u bazu podataka ( npr. VARCHAR, INT, NUMBER, TEXT... ) i vi mozete definisati svoje tipove podataka. Oni se u SQL Serveru nazivaju "user-defined types". Oni se mogu koristiti za standardizaciju tipova kolone unutar svih tabela.

    Treba napomenuti i to da su ovi tipovi podataka smjesteni u bazi koju ste vi kreirali, a ne u "master" bazi.

    Kreiranje definicije korisnickog tipa podataka

    Tip podataka MORA biti kreiran prije tabele u kojoj hocete da ga koristite. Za kreiranje se koristi sledeca sintaksa:

    sp_addtype PostanskiBroj, 'int', 'NOT NULL'
    go

    Da vidite koji sistemski tipovi postoje kucajte:

    SELECT * FROM systypes
    go

    name
    ----------------
    image
    text
    uniqueidentifier
    tinyint
    smallint
    int
    smalldatetime
    real
    money
    datetime
    float
    sql_variant
    ntext
    bit
    decimal
    numeric
    smallmoney
    bigint
    varbinary
    varchar
    binary
    char
    timestamp
    nvarchar
    nchar
    sysname
    PostanskiBroj



    Za brisanje tipa podataka iz tabele koristimo:

    sp_droptype PostanskiBroj


    Dobijamo poruku:


    (1 row(s) affected)
    Type has been dropped.
    sql_server_2000- 367 - 28.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 16 - Odrzavanje tabela


    Ako ste nekada kreirali tabelu, pa kasnije ustanovili da u nju niste ukljucili neke vazne kolone, susreli ste se sa problemom izmjene strukture tabele. U SQL Serveru mozete dodati kolonu, promjeniti parametre kolone, ili jednostavno izbrisati kolonu. U ovoj lekciji cemo vidjeti kako je to moguce.

    MODIFIKOVANJE TABELE

    Modifikovanje strukture tabele mozemo uraditi iz "Enterprise Manager"-a ili iz "Query Analyser"-a.

    Dodavanje kolone u tabelu

    ALTER TABLE Test2
    ADD MojaAdresa VARCHAR(40)

    Modifikovanje kolone u tabeli
    Ako smo nakon izvjesnog vremena ustanovili da je duzina polja "MojaAdresa" premala za nase potrebe, polje mozemo povecati koristeci sledecu komandu:

    ALTER TABLE Test2
    ALTER COLUMN MojaAdresa VARCHAR(60)


    Brisanje kolone u tabeli

    Ako nakon nekog vremena, ustanovite da imate suvisnu kolonu u tabeli, mozda biste trebali da je izbrisete. Brisanje tabele je moguce samo ukoliko kolona nije indeksirana.

    ALTER TABLE Test2
    DROP COLUMN MojaAdresa

    Kliknite na tabelu Test2 u Objekt navigatoru, a onda sa desnim tasterom na misu, pozovite "Refresh" da bi kolona "MojaAdresa" nestala i iz "Objekt Navigatora".
    sql_server_2000- 368 - 29.10.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 17 - Generisanje skripti


    Ako imate jednu SQL bazu, sa jednom ili vise tabela, kao i drugih objekata baze podataka, bilo bi dobro da znate i kako generisati T-SQL skriptu, tako da imate:

  • kopiju baze podataka, u slucaju da morate opet da je kreirate
  • mozete da kreirate identicnu bazu na drugom serveru
  • koristite taj skript da napravite slicnu bazu podataka.


    Recimo da hocete da napravite skript za kreiranje "Nortwind" baze podataka. U "Object Navigator" prozoru kliknite na "Northwind", a zatim kliknite na desni taster misa. Izaberite opciju "All Tasks->Generate SQL Script". Na "General" panelu kliknite na "Show All" opciju, nakon cega ce svi objekti baze biti prikazani. Izaberite objekte za koje zelite da napravite skript. Na "tab"-u "Formatting" izaberite opcije kako hocete da skript bude kreiran. Npr. skript moze prvo da pokusa da pobrise bazu podataka (ukoliko vec postoji), mozete imati komentare, ili skript moze biti kompatibilan sa starijim verzijama SQL Servera. Na "tab"-u "Options" imate jos nekoliko nacina na koji skript moze biti kreiran. Nakon sto ste izabrali sve zeljene opcije, kliknite na "OK" i program ce vas pitati gdje i pod kojim imenom zelite da kreirate skript.


    Vjezba:

  • Kreirajte "type" BrojTelefona:
    EXEC sp_addtype BrojTelefona 'VARCHAR(12)', 'NULL'
    GO

  • Kreirajte tabelu "Korisnici"
    CREATE TABLE Korisnici
    ID int IDENTITY NOT NULL,
    Ime VARCHAR(20),
    Prezime VARCHAR(20),
    Telefon BrojTelefona
    )
    GO

  • Upisite neki podatak u tabelu:
    INSERT INTO Korisnici
    VALUES
    (
    'Zeljko', 'Tomic', '604-528-0990'
    )
    INSERT INTO Korisnici
    VALUES
    (
    'Marija', 'Tomic', '604-528-0487'
    )

  • kucajte:
    EXEC sp_help BrojTelefona
    Dobicete sve potrebne informacije o objektu koji ste kreirali na pocetku ove vjezbe.


  • Ukoliko vam ova tabela ne treba kucajte:
    DROP TABLE Korisnici
    GO

  • Da biste izbrisali tip podataka "BrojTelefona" morate koristiti proceduru sp_droptype:
    EXEC sp_droptype 'BrojTelefona'
    GO

  • U sledecem primjeru imamo skript za kreiranje jedne male baze podataka za neku videoteku. Baza ima sledece tabele: Actors( ili Glumci), Customers (ili Kupci), Genres (ili KategorijaFilma), MovieCasts( ili Uloge), Movies ( ili Filmovi), Rentals (ili Iznajmljivanje).

    CREATE TABLE Customers
    (
    CustomerID INT IDENTITY NOT NULL,
    Last_Name VARCHAR(30),
    First_Name VARCHAR(30),
    Address VARCHAR(50),
    Apartment INT,
    City VARCHAR(20),
    Province VARCHAR(20),
    PostalCode VARCHAR(7),
    AreaCode VARCHAR(3),
    PhoneNumber VARCHAR(12)
    )
    GO

    CREATE TABLE Movies
    (
    MovieCode int IDENTITY(100, 1) NOT NULL,
    MovieTitle VARCHAR(100),
    YearReleased CHAR(4),
    PlotSummary VARCHAR(4000),
    RentalPrice SMALLMONEY,
    GenreID SMALLINT
    )
    GO

    CREATE TABLE Genres
    (
    GenreID SMALLINT IDENTITY(200, 1) NOT NULL,
    GenreName VARCHAR(100)
    )
    GO

    CREATE TABLE Actors

    ActorID int IDENTITY(300, 1) NOT NULL,
    FirstName VARCHAR(30),
    LastName VARCHAR(30)
    )
    GO

    CREATE TABLE MovieCasts
    (
    ActorID int NOT NULL,
    MovieID int NOT NULL
    )
    GO

    CREATE TABLE Rentals
    (
    TransactionID int IDENTITY(1000, 1) NOT NULL,
    CustomerID int NOT NULL,
    TransactionDate SMALLDATETIME,
    DueDate SMALLDATETIME,
    MovieID SMALLINT NOT NULL,
    TransactionAmount SMALLMONEY
    )
  • sql_server_2000- 381 - 01.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 18 - Rad sa indeksima


    Indeksi su objekti baze podataka koji ze baziraju na jednoj ili vise kolona tabele. Svrha im je da ubrzaju pretrazivanje tabela. Za pravilno koriscenje indeksa treba dosta iskustva. Ponekad neki indeks radi jako dobro, medjutim nakon sto tabela postane velika, brzina dobijanja podataka pomocu tog indeksa moze znacajno da degradira. Iako indeksi ubrzavaju pretrazivanje podataka, oni u isto vrijeme usporavaju unosenje novih podataka u tablu, azuriranje i brisanje podataka, jer se sa svakom od ovih operacija istovremeno azuriraju svi indeksi napravljeni na toj tabeli.

    U ovoj lekciji cemo da objasnimo razlicite tipove indeka koji se mogu kreirati u SQL Serveru, koristenjem "Enterprise Manager"-a i "Query Analyzer"-a.


    Kreiranje indeksa

    Indeksi ubrzavaju pronalazenje podataka, sortiranje podataka ili spajanje tabela ("join"). Pored toga omogucavaju kreiranje kolona koje ne mogu sadrzati duplikate, kao i sortiranje podataka po odredjenom pravilu.

    Medjutim, ako indeks ima manje od 90% jedinstvenih vrijednosti, za njega kazemo u SQL Serveru da nije "SELEKTIVAN", tj. SELECT komanda ga ne koristi, jer je skeniranje tabele brze. Sa druge strane, treba biti oprezan sa kreiranjem indeksa, jer SQL Server mora da azurira sve indekse prilikom ubacivanja (insert), azuriranja (update) i brisanja (delete) podataka u toj tabeli.

    SQL Server podržava tkz. "Clastered Indexes". Ova struktura forsira fizicki redosled podataka na disku, koji se na disk smjestaju sortirani po vrijednosti indeksa. Pretrazivanje podataka uredjenih na ovaj nacin je jako brzo. Kod indeksa koji nisu uredjeni na ovaj nacin, podaci (slogovi) se smjestaju onim redosledom kako se unose u bazu. Takodje treba primjetiti, da je za indekse koji su tipa "klaster", treba mnogo vise prostora na disku.

    SQL Server koristi tkz. "Balanced Tree" ili "Balansirano stablo" ili "B-Tree" za smještanje indeka.

    Ako mi zatražimo od SQL Servera pretraživanje podataka po nekoj tabli koja nije indeksirana, SQL Server ce da skenira cijelu tabelu, tj. procita sve slogove tabele.

    U SQL Serveru možemo kreirati, ne samo indekse zasnovane na jednoj, nego i indekse zasnovane na više kolona. Na primjer, mozemo kreirati indeks koji je zasnovan na prezimenu, a unutar prezimena i po imenu. Ovakav indeks se naziva "composite" ili "mjesoviti" indeks. SQL Server podrzava maksimalno 16 kolona u jednom indeksu sa maksimalnom kombinacijom od 900 bajtova. Kod kreiranja slozenih indeksa preporucuje se da se na prvo mjesto stavi kolona koja ima najmanje duplikata. Takodje, kod pravljenja upita, nakon "WHERE" rijeci treba staviti polja tabele u redosledu kombinovanog indeksa. Ako ne ispostujete redoslijed, SQL Server nece moci da koristi indeks za pretrazivanje.
    sql_server_2000- 382 - 01.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 19 - Rad sa indeksima (2)


    Za kreiranje indeksa mozete koristiti "Template" tj. šablon iz Analizatora upita. U "object navigator", kliknite na "Templates" tabulator. Izaberite "Create Index Basic" opciju. Nakon toga idite na "Edit-Replace Template Parameters" opciju i ukucajte vrijednosti za ponudjene parametre. Nakon toga dobicete sledecu DDL komandu:


    CREATE INDEX Fudbaleri_Ime_Prezime_ndx
    ON Test. dbo. Fudbaleri
    (Prezime, Ime)
    GO


    Ova komanda ce kreirati indeks nad tabelom "Fudbaleri". Indeks je zasnovan na dvije kolone: Prezime i Ime. Primjetili ste da je prva kolona u indeksu "Prezime". To je zbog toga sto u vecini slucajeva izvjestaje koje pravimo, ili pretrazivanje koje vrsimo, koristimo "Prezime" kolonu.


    Clastered indeks kreiramo komandom:
    CREATE UNIQUE CLASTERED INDEX Fudbaleri_ID_Prezime_ndx
    ON Test. dbo. Fudbaleri
    (ID, Prezime DESC)
    GO


    Ovaj indeks je zasnovan na kolonama "ID" i "Prezime". Primjecujete i to da iza rijeci "Prezime" ide kljucna rijec "DESC", sto znaci da hocemo da indeks bude uredjen u opadajucem redoslijedu prezimena. Takodje treba naglasiti da ovaj indeks nema smisla, jer "ID" kolona je jedinstvena, prema tome kolona "Prezime" nema nikakvog uticaja na indeks.

    Opcija DROP_EXISTING se koristi kao direktiva SQL Serveru da se postojeci index, sa istim imenom, zamijeni sa novim indeksom.

    Sledeca komanda se koristi da se kreira indeks nad tabelom "Fudbaleri" u bazi podataka "Glasinac", nad kolonama "Prezime" i "Ime".


    CREATE UNIQUE CLUSTERED INDEX Fudbaleri_Ime_Prezime_ndx
    ON Glasinac. dbo. Fudbaleri
    (Prezime DESC,
    Ime)
    WITH
    PAD_INDEX,
    FILLFACTOR = 50,
    IGNORE_DUP_KEY,
    DROP_EXISTING,
    STATISTICS_NORECOMPUTE
    ON ŠPRIMARY?
    GO


    Da biste vidjeli koji indeksi su kreirani u SQL Serveru, koristite sledeci upit u "Query Analyser"-u.

    SELECT o. name AS ŠTable Name? , i. name AS ŠIndex Name? , i. indid AS ŠIndex ID? , i. FirstIAM
    FROM sysobjects AS o JOIN sysindexes AS i
    on o. id = i. id
    WHERE o. id > 100
    ORDER BY o. name

    Ovaj upit iz sistemskih tabela dobija podatke koji indeksi su kreirani u bazi podataka sa kojom mi trenutno radimo. Primjeticete da se indeks kreira svaki put kada mi kreiramo tabelu sa kolonom za koju definisemo da ne moze imati nule.
    sql_server_2000- 383 - 01.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 20 - Rad sa indeksima (3)


  • Indeksi u SQL Serveru su takodje organizovani u vidu tabela, kao i sami podaci.
  • Indeksne tebele su obicno mnogo manje nego tabele sa podacima.
  • Zbog brzine pretrazivanja, u velikim bazama podataka, indeksne tabele se cuvaju na posebnim diskovima.
  • Kada se trazeni podatak nadje u indeksnoj tabeli, iz indeksne tabele dobijemo fizicku adresu na disku gdje se nalaze podaci.
  • Indeks moze biti kreiran na jednoj koloni simple index ili na vise kolona compound index.

  • Postoje dvije vrste indeksa, clastered i non-clastered.
  • Kod klasterovanih indeksa, podaci i indeksi se cuvaju skupa, tj. indeksi kontrolisu fizicki raspored podataka.
  • Kod indeksa koji nisu klasterovani, podaci i indeksi se cuvaju odvojeno. Podaci se smjestaju na disk u redosledu u kome se unose u bazu.
  • Primarni kljuc se moze kreirati na koloni (ili grupi kolona) koje uvijek vracaju jedinstvenu vrijednost, tj. nemaju duplikate.
  • Alternativni kljuc ("Alternate Key") je kolona u tabeli, koja bi takodje mogla biti proglasena za kljuc. Primjera radi, ukoliko imamo tabelu sa maticnim brojem i brojem licne karte, bilo koja od ove dvije kolone bi mogla da bude proglasena primarnim kljucem.
  • Samo kolone tabele cije vrijednosti se ne mjenjaju cesto, su dobri kandidati za kljuceve.
  • Strani kljuc, ili Foreign key je kolona u tabeli koja mora imati vrijednost primarnog kljuca neke druge tabele. Na primjer, u tabeli "Ispiti", imamo polje "Sifra_Studenta", koja mora odgovarati polju "Sifra_Studenta" u tabeli "Studenti".
  • Kod tkz. klasterovanih indeksa, ili clastered indexes, ubacivanje novih slogova moze znaciti da se vec postojeci slogovi moraju prepisati na drugu lokaciju na disku. SQL Server ima opciju da "full factor" bude specificiran, tj. da mjesto za slogove bude rezervisano. Primjera radi, ako imamo slogove sa kljucem: 1, 2, 3, 4, 6, 7, 8, 9, i 10 vec upisane na disku, SQL Server bi ostavio prazno mjesto za slog sa kljucem 5.
  • Ako niste sigurni da li pravilno koristite indekse u nekoj bazi podataka, koristite Index Tuning Wizard, alat u SQL Serveru.
  • sql_server_2000- 384 - 01.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 21 - Kreiranje indeksa


    Kreiranje indeksa iz Enterprise Manager-a

    U "Object Navigator"-u, kliknite na tabelu nad kojom hocete da kreirate indekse. Zatim, kliknite na desni taster misa, i izaberite opciju "Design Table". Nakon toga, kliknite na "Manage Indexes/Keys" na toolbar-u. Na tabulatoru "Indexes/Keys", kliknite na "New" taster, a zatim: upisite ime indeksa, izaberite kolonu (ili kolone) na kojoj je indeks baziran, "order" - da li je indeks rastuci ili opadajuci, da li zelite "UNIQUE" i "CLUSTERED" indeks.


    Definisanje primarnog kljuca iz Enterprise Manager-a

    U "Object Navigator"-u, kliknite na tabelu nad kojom hocete da kreirate indekse. Zatim, kliknite na desni taster misa, i izaberite opciju "Design Table". U prozoru koji ce se otvoriti, selektujte polje koje hocete da proglasite za primarni kljuc, a onda kliknite na desni taster misa i izaberite opciju "Set Primary Key".


    Kreiranje indeksa koriscenjem "wizard"-a

    Wizard Mozete startovati sa "Tools->Wizards" ili kliknite na "Wizard" ikonu na toolbar-u. Izaberite "Create Index Wizard", selektujte odgovarajucu bazu podataka i tabelu nad kojom hocete da kreirate kljuc. Zatim, izaberite kolonu(e) nad kojima hocete da kreirate indeks.

    Kreiranje indeksa koriscenjem "All Tasks" opcije

    Kliknite na tabelu u "Object Navigator"-u za koju zelite da kreirate indeks. Kliknite na desni taster na vasem misu, a zatim izaberite opciju "All Tasks->Manage Indexes". Ukucajte ime indeksa, izaberite kolone na kojima hocete da kreirate indeks i izaberite "Clustered index" opciju. Ova opcija vam omogucava da vidite "SQL Script" koji se kreira u pozadini, ako kliknete na taster "Edit SQL... ". Kliknite na taster "OK", kada ste spremni da kreirate indeks.


    Kreiranje indeksa u Query Analyzer - Template

    Otvorite SQL Server Query Analyzer, i na "Object Browser" kliknite na "Templates" tab, koji se nalazi na dnu "Object Browser" okvira. Izaberite "Create Index Full Sintax" templejt, a onda idite na "Edit->Replace Template Parameters" opciju. Ukucajte odgovarajuce vrijednosti za parametre a onda pritisnite "OK". Kada je komanda pripremljena pritisnite na "Execute" na "Toolbar"-u.
    Da biste provjerili da li je indeks kreiran, kliknite na "Tools->Manage Indexes". Izaberite bazu podataka i tabelu. Kliknite na indeks koji vas interesuje, a zatim na "Edit" ako zelite nesto da promjenite.

    Kreiranje indeksa u Query Analyzer - kucanjem komande

    USE Test_Baza

    CREATE CLASTERED INDEX Ix_Rezultati_Vrijeme
    ON Tabela_Rezultata(Broj_utakmice, Datum)
    ON ŠPRIMARY?
    GO

    Brisanje indeksa

    Indeks se brise iz baze podataka sa komandom "DROP INDEX ime_indeksa"

    USE Test_Baza
    DROP INDEX Ix_Rezultati_Vrijeme
    GO

    Takodje treba obratiti paznju da ne kreiramo dupli indeks, na primjer da indeksiramo istu kolonu dva puta, ali pod razlicitim imenom.
    sql_server_2000- 386 - 01.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 22 - "CREATE INDEX" komanda


    CREATE ŠUNIQUE? ŠCLUSTEREDđNONCLUSTERED?
    INDEX index_name
    ON table_name (column1 ŠASCđDESC? ,...... )
    ŠWITH šIGNORE_DUP_KEYđDROP_EXISTINGđSORT_IN_TEMPDBć?
    ŠON filegroup?


  • CREATE - obavezna kljucna rijec.
  • UNIQUE - opcionalna rijec. Ako je koristena, znaci da indeks ne moze imati duplikate.
  • CLUSTEREDđNONCLUSTERED - opcionalna rijec. Ako nista nije specificirano, NONCLUSTERED indeks ce biti kreiran.
  • index_name - obavezna rijec, koju vi izmislite. Takav objekat ne smije postojati u bazi.
  • ON - obavezan. Koristi se ispred imena tabele nad kojom se indeks kreira.
  • table_name - obavezna rijec. Oznacava ime tabele koja postoji u bazi.
  • column1 - obavezna rijec. Oznacava ime kolone koja se indeksira.
  • ASCđDESC - opcionalna rijec. Osnacava da su podaci uredjeni u rastucem (ASC) ili opadajucem (DESC) redoslijedu. Ako nista nije naznaceno, podaci se uredjuju u rastucem (ASC) redosledu.
  • WITH - opcionalna rijec.
  • IGNORE_DUP_KEY - Ako je ova rijec koristena, kod unosa novih slogova, dupli slogovi ce biti ignorisani, tj. nece biti upisani u tabelu. Umjesto greske, samo ce opomena biti generisana. Kontrolisite sistemsku varijablu ŽŽERROR poslije svakog DML iskaza.
  • DROP_EXISTING - ova opcija ce ponovo kreirati indekse. Indeksi se samo reorganizuju, a ne brisu ("DROP INDEX"). To je dobro, ako imamo "forein key" koji zavisi od ovog indeksa.
  • SORT_IN_TEMPDB - u ovom slucaju "TEMPDB" baza podataka ce biti koristena za sortiranje prilikom kreiranja indeksa.
  • ON - opcionalna. Iza ove rijeci slijedi "filegroup". Standardna vrijednost je "PRIMARY", koja se koristi, ako nista nije definisano.
  • sql_server_2000- 387 - 01.11.2004 : Zeljko Tomic Sokolac - best (0)

    Vjezba 2


    SELECT * FROM Fudbaleri
    WHERE Prezime LIKE 'To%'

    Ova komanda ce iz tabele "Fudbaleri" izlistati sve fudbalere cije prezime pocinje sa slovima "To".
    sql_server_2000- 390 - 02.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 23 - Dijagrami podataka


    Lekcija 23 - Relacije i crtanje dijagrama

    Relacije definisu vezu izmedju dvije table. Kada je relacija devinisana izmedju dvije table, za table kazemo da su povezane. U bilo kojoj vezi izmedju tabela, postoji "roditelj" i "dijete" tabela.

    Postoje tri tipa direktne veze izmedju tabela i jedan tip indirektne veze. Tipovi direktne veze su: 1:1, 1:M i M:1. Indirektna veza se naziva: M:M. Ova veza se smatra indirektnom zato sto se ona ne moze direktno implementirati u bazi, bez kreiranja nove tabele, koja je sa dvije postojece tabele povezana relacijom 1:M.

    Referencijalni integritet je niz pravila koje se koriste da definisu i sacuvaju vezu izmedju tabela u nekoj bazi podataka. Na primjer, referencijalni integritet osigurava da tabele ne sadrze tkz. "slogove siročad", tj. da neki slog iz zavisne tabele ("dijete") nije povezan sa nekim slogom iz tabele tipa "roditelj", a da slog u "roditelj" tabeli ne postoji.
  • Referencijalni integritet povecava tacnost vasih podataka.
  • Pretpostavimo da imamo tabele Studenti(stud_id, Ime, Prezime, Smjer) i tabelu Knjige(Knjiga_ID, Naziv, Stud_id, Broj_Strana, Datum). Ukoliko je referencijalni integritet definisan izmedju ove dvije tabele, onda vrijednost Stud_ID u tabeli knjiga mora biti prazna tj. NULL ili pokazivati na postojecu vrijednost Stud_ID u tabeli Studenti. Ovaj primjer nije normalizovan ali moze posluziti da shatite o cemu govrim.
  • Slog "siroče" je slucaj kada imamo definisan podatak u jednoj tabeli, a taj podatak ne postoji u drugoj tabeli. Primjera radi, ako u tabeli Filmovi(Film_ID, Naziv_Filma) nemamo film pod rednim brojem 7 i nazivom "Mars na Drinu", a u tabeli Iznajmljeni_Filmovi(Broj, Film_ID, Datum) imamo film sa "Film_id=7", onda slog sa tim podatkom u tabeli "Iznajmljeni_Filmovi" smatramo siročetom, jer ne pripada nikome.
  • Primjer sa "slogom tipa siroče" javlja se kada neko u tabeli "Filmovi" izbrise neki film, a da se zavisni podaci ne izbrisu i u zavisnim tabelama. Baze podataka (RDMS) podrzavaju kaskadno brisanje i azuriranje slogova u cilju zastite referencijalnog integriteta. Ovo znaci da ukoliko promjenite vrijednost kljuca u jednoj tabeli, sva pojavljivanja tog istog kljuca u drugim tabelama ce biti takodje promjenjen. Isto tako, ako izbrisete podatak u jednoj tabeli, svi zavisni podaci ce takodje biti izbrisani.


    ER Dijagrami ili Dijagrami entitet-veza, su praktican i jednostavan nacin za dizajniranje i dokumentovanje baza podataka. Ovi dijagrami su jednostvni za razumjevanje.
  • Koristite Database Diagram Wizard da brzo kreirate osnovni dijagram.
  • Mozete dodavati labelu sa komentarom prilikom kreiranja dijagrama.
  • Dijagrami mogu biti koristeni da se kreiraju relacije izmedju tabela vizuelnim putem.
  • sql_server_2000- 391 - 02.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 24 - Kreiranje relacija


    Da biste kreirali vezu izmedju dvije tabele potrebno je:

  • Startovati SQL Server Enterprise Manager, izabrati bazu u kojoj se nalaze vase tabele i kliknuti na tabelu koja je glavna u vezi (naziva se "parent" ili "master").
  • Kliknuti desnim tasterom misa, i nakon sto dobijete meni izaberite opciju "Design Table". Na toolbar-u izaberite opciju Manage Relationships, cija ikona je predstavljena sa tri kockice povezane sa dvije linije.
  • Na tabulatoru Relationships upisite ime za naziv relacije (ukoliko vam se ponudjeno ime ne svidja), a zatim iz ponudjene liste izaberite: Primary Key Table i Foreign Key Table, kao i odgovarajuce kljuceve iz ovih tabela. Ostale parametre ne morate mijenjati. Kliknite na Close dugme da zatvorite i snimite ove promjene. Nakon toga, dobicete tkz. "Snimi dijalog boks", na kome treba da kliknete Yes za zavrsite operaciju.

  • Ukoliko zelite da napravite relaciju izmedju dvije tabele, medjutim tabla tipa "Roditelj" nema za primarni kljuc polje koje nam je potrebno, onda nad tim poljem mozemo definisati "Unique" kljuc. Nakon toga cemo moci da napravimo relaciju izmedju dvije tabele.

    CREATE UNIQUE CLASTERED INDEX IX_Igraci_IgracID
    on TestDB. dbo. Igraci
    (IgracID)
    ON ŠPRIMARY?
    GO


    Relaciju mozemo kreirati i putem SQL upita:

    USE TestDB
    GO
    CREATE UNIQUE INDEX IX_Utakmice_UtakmicaID
    ON Utakmice (UtakmicaID)
    ON ŠPRIMARY?
    GO

    ALTER TABLE Utakmice_Rezultati
    ADD CONSTRAINT FK_Utakmice_Rezultati_Utakmica
    FOREIGN KEY (UtakmicaID)
    REFERENCES Utakmice (UtakmicaID)
    GO

    Kao sto vidite, prvo smo nad tabelom "Utakmice" kreirali jedinstven indeks nad kolonom UtakmicaID, a onda smo pomocu iskaza "ALTER TABLE" nad tabelom "Utakmice_Rezultati" kreirali relaciju ("CONSTRAINT") sa imenom "FK_Utakmice_Rezultati_Utakmica", koju smo proglasili stranim kljucem ("FOREIGN KEY") na tabelu "Utakmice".

    Prikazivanje zavisnosti izmedju tabela

    Sada kada smo kreirali relaciju izmedju dvije tabele, treba da znamo i kako mozemo da provjerimo koje relacije postoje izmedju tabela u bazi. Recimo da hocemo da provjerimo da li tabela "Utakmice" ima bilo kakvu relaciju u odnosu na ostale tabele. Da bismo to uradili treba da u "Enterprise Manager"-u kliknemo na tabelu "Utakmice", a onda kliknemo na desni taster misa i izaberemo opciju Display Dependencies.
  • sql_server_2000- 392 - 03.11.2004 : Zeljko Tomic Sokolac - best (0)

    Vježba 3


    U sledecem primjeru cemo kreirati bazu podataka za Ligu RS.

    U bazi podataka cemo imati sledece podatke:

  • 1. Klubovi - Svaki klub ima svoj broj, ime, broj telefona i adresu.
  • 2. Utakmice - Svaku utakmicu igraju dva kluba, pa zato imamo dva strana kljuca u tabeli utakmice, kao i broj golova za klub A i klub B.
  • 3. Titule - Ova table je staticna i ima samo dvije vrijednosti: 1. Prvak RS, 2. Prvak kupa RS.
  • 4. Klubovi_Titule - U ovoj tabeli registrujemo prvaka za svaku godinu i pobjednika kupa za svaku godinu.

    Ovo je samo jedan primjer za koji mi je trebalo 15 minuta da ga napravim. Naravno, stvarna baza bi bila mnogo komplikovanija.

    U ovom slucaju, tabela rezultata bi trebala da se racuna programski, posto su u bazi smjesteni samo rezultati.




    CREATE DATABASE ŠLigaRS? ON (NAME = N'LigaRS_Data', FILENAME = N'C:–Program Files–Microsoft SQL Server–MSSQL–data–LigaRS_Data. MDF', SIZE = 1, FILEGROWTH = 10%) LOG ON (NAME = N'LigaRS_Log', FILENAME = N'C:–Program Files–Microsoft SQL Server–MSSQL–data–LigaRS_Log. LDF', SIZE = 1, FILEGROWTH = 10%)
    COLLATE SQL_Latin1_General_CP1_CI_AS
    GO

    use ŠLigaRS?
    GO

    CREATE TABLE Šdbo?. ŠKlubovi? (
    ŠKlubID? Šint? NOT NULL,
    ŠKlub_Ime? Švarchar? (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    ŠKlub_Adresa? Švarchar? (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    ŠKlub_Telefon? Švarchar? (12) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    ŠKlub_Faks? Švarchar? (12) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    ŠPredsjednik? Švarchar? (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    ŠGodina_Osnivanja? Šdatetime? NULL
    ) ON ŠPRIMARY?
    GO

    CREATE TABLE Šdbo?. ŠTitule? (
    ŠID? Šint? NOT NULL,
    ŠNaziv_Titule? Švarchar? (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    ŠKomentar? Švarchar? (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ) ON ŠPRIMARY?
    GO

    CREATE TABLE Šdbo?. ŠKlubovi_Titule? (
    ŠKlubID? Šint? NOT NULL,
    ŠTitulaID? Šint? NOT NULL,
    ŠGodina_Osvajanja? Švarchar? (4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ) ON ŠPRIMARY?
    GO

    CREATE TABLE Šdbo?. ŠUtakmice? (
    ŠKlubIDa? Šint? NOT NULL,
    ŠKlubIDb? Šint? NOT NULL,
    ŠDatum? Šdatetime? NULL,
    ŠGolova-a? Šint? NULL,
    ŠGolova-b? Šint? NULL
    ) ON ŠPRIMARY?
    GO

    ALTER TABLE Šdbo?. ŠKlubovi? WITH NOCHECK ADD
    CONSTRAINT ŠPK_Klubovi? PRIMARY KEY CLUSTERED
    (
    ŠKlubID?
    ) ON ŠPRIMARY?
    GO

    ALTER TABLE Šdbo?. ŠTitule? WITH NOCHECK ADD
    CONSTRAINT ŠPK_Titule? PRIMARY KEY CLUSTERED
    (
    ŠID?
    ) ON ŠPRIMARY?
    GO

    ALTER TABLE Šdbo?. ŠKlubovi_Titule? WITH NOCHECK ADD
    CONSTRAINT ŠPK_Klubovi_Titule? PRIMARY KEY CLUSTERED
    (
    ŠKlubID? ,
    ŠTitulaID?
    ) ON ŠPRIMARY?
    GO

    ALTER TABLE Šdbo?. ŠUtakmice? WITH NOCHECK ADD
    CONSTRAINT ŠPK_Utakmice? PRIMARY KEY CLUSTERED
    (
    ŠKlubIDa? ,
    ŠKlubIDb?
    ) ON ŠPRIMARY?
    GO

    CREATE INDEX ŠIX_Utakmice? ON Šdbo?. ŠUtakmice? (ŠKlubIDa? ) ON ŠPRIMARY?
    GO

    ALTER TABLE Šdbo?. ŠKlubovi_Titule? ADD
    CONSTRAINT ŠFK_Klubovi_Titule_Klubovi? FOREIGN KEY
    (
    ŠKlubID?
    ) REFERENCES Šdbo?. ŠKlubovi? (
    ŠKlubID?
    ),
    CONSTRAINT ŠFK_Klubovi_Titule_Titule? FOREIGN KEY
    (
    ŠTitulaID?
    ) REFERENCES Šdbo?. ŠTitule? (
    ŠID?
    )
    GO

    ALTER TABLE Šdbo?. ŠUtakmice? ADD
    CONSTRAINT ŠFK_Utakmice_Klubovi? FOREIGN KEY
    (
    ŠKlubIDa?
    ) REFERENCES Šdbo?. ŠKlubovi? (
    ŠKlubID?
    ),
    CONSTRAINT ŠFK_Utakmice_Klubovi1? FOREIGN KEY
    (
    ŠKlubIDb?
    ) REFERENCES Šdbo?. ŠKlubovi? (
    ŠKlubID?
    )
    GO
  • sql_server_2000- 394 - 03.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 25 - Punjenje tabele podacima


    Do sada smo naucili kako se kreira baza podataka, tabele u bazi, kao i indeksi nad tabelama, a zatim i veze (relacije) izmedju tabela. Medjutim baza podataka bez podataka je beskorisna.

    Proces upisivanja podataka u tabelu je poznat pod nazivom punjenje tabela tj engleski population.

    Kod popunjavanja podataka SQL Server vodi racuna o kontroli integriteta podataka. To znaci da ce samo podaci koji zadovoljavaju skup kriterijuma koje smo mi definisali, biti upisani u tabele. Integritet podataka je omogucen putem trigera (triggers) i tkz. ogranicivaca (CONSTRAINTS). Svaki put kada definisemo neku relaciju, SQL Server ce da definise tkz. ogranicivac ili uslov. Prilikom ubacivanja podatataka u tabelu, provjeravaju se svi uslovi, i ukoliko su svi zadovoljeni podaci ce biti upisani u tabelu. Trigeri su programi, smjesteni u bazi podataka. Svaki triger je vezan za jednu tabelu, i oni se izvrsavaju prije ili poslije svakog upisivanja, brisanja ili azuriranja neke tabele. Triger takodje moze da zabrani operaciju nad tabelom, ukoliko podaci ne zadovaljaju kriterijum definisan u trigeru.

    Podatke mozemo upisati u tabelu iz Query Analyzer-a. Sledeca komanda ce upisati jedan slog u tabelu Customers.


    Primjer 1: Upisivanje slogova u tabelu Klubovi

    INSERT INTO LigaRS. dbo. Klubovi
    (KlubID, Klub_Ime, Klub_Adresa, Klub_Telefon, Klub_Faks, Predsjednik, Godina_Osnivanja)
    VALUES(1, 'Glasinac', 'Milana Sarca bb', '057-868-324', '057-868-325', 'Crni Djordje', '1960')



    Primjer 2: Upisivanje slogova u tabelu "CUSTOMERS"

    INSERT INTO CUSTOMERS
    VALUES (
    'John',
    'Travolta',
    '1050 Smithe',
    '305',
    'Vankuver',
    'BC',
    'V6E 1J1',
    '604',
    '111-1111'
    )


    Primjer 3: Resetovanje vrijednosti kljuca

    Ukoliko sledeci upit izvrsimo u Query Analyzer-u, vrijednost kolone Society_GroupID ce biti resetovano na vrijednost 4. Ovo je dobro u slucaju ako smo ubacili u tabelu veliki broj podataka, a onda ih izbrisali. Na taj nacin kljuc tabele, koji je automatski generisan, ce opet poceti od nekog malog broja.

    DBCC CHECKIDENT('Society_Groups', RESEED, 4)

    Kod sledeceg inserta, vrijednost kljuca ce biti 5.


    Primjer 4: Greske kod upisa

    SET QUOTED_IDENTIFIER OFF
    INSERT INTO Society_Groups (Society_Group_Desc) VALUES ("Blues Country")

    Izvrsite ovu komandu sa <Ctrk>+E ili sa <F5> uku pritiskom na Execute ikonu na toolbar-u.
    Dobicete poruku da je potrebno navesti podatke i za jos neka druga polja koja ne mogu da budu NULL vrijednost.
    sql_server_2000- 396 - 03.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 26 - Dodavanje Constraint-a


    Dodavanje constraint-a ili ograničivača je moguce izvesti pomocu:

  • 1. Pomocu "Enterprise Manager"-a koriscenjem "Table Properties" dijalog boksa.
  • 2. Koristenjem T-SQL iskaza iz "Query Analyzer"-u.

    Primjer 1: Dodavanje primarnog kljuca u tabelu

    ALTER TABLE Players ADD CONSTRAINT
    Pk_Players PRIMARY KEY NONCLUSTERED
    (
    PlayerID
    ON ŠPRIMARY?
    )
    GO


    Primjer 2: Dodavanje "CONSTRAINT"-a za provjeru vrijednosti


    ALTER TABLE Players WITH NOCHECK ADD CONSTRAINT
    Ck_Players_PointsCheck CHECK (( Points_Scored >= 0))
    GO


    Primjer 3: "CONSTRAINT"-a za "DEFAULT" vrijednost polja

    ALTER TABLE Players WITH NOCHECK
    ADD CONSTRAINT Df_Plaers_Games_Played DEFAULT (0) FOR Games_Played
    GO

    Izvrsite ove komande sa <Ctrl>+E ili sa <F5> ili pritiskom na Execute ikonu na toolbar-u.
  • sql_server_2000- 398 - 04.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 27 - INSERT iz tabele u tabelu


    Ponekad je potrebno podatke, ili dio podataka, iz jedne tabele prebaciti u drugu tabelu.


  • U sledecem primjeru, iz tabele NoviKorisnici selektujemo samo korisnike cije prezime pocinje sa T i dodajemo ih u tabelu korisnici.

    INSERT INTO Korisnici
    (Ime, Prezime, Adresa, Grad, Telefon)
    SELECT ime, prezime, adresa, grad, telefon
    FROM NoviKorisnici
    WHERE SUBSTRING(prezime, 1, 1) = 'T'

    Primjetili ste da smo koristili i SUBSTRING funkciju. Ova funkcija iz neke promjenljive (u nasem slucaju prezime) izdvaja dio stringa koji pocinje od prve pozicije, a duzina je jedan znak. Takodje treba primjetiti da indeks u SQL Serveru pocinje od jedan, ne od nule kao u Javi, C#, C, C++ i drugim programskim jezicima.

    Nova tabele, tj. tabela koju zelimo da kreiramo moze biti permanentna (stalna) ili privremena (temporary). Privremena tabela moze biti dostupna samo vama, ili moze biti privremena globalna tabela, kojoj mogu pristupiti svi korisnici SQL Servera. Da bismo kreirali privremenu lokalnu tabelu ispred tabele stavimo znak '#', a za privremenu globalnu tabelu stavimo dupli znak '#', tj. '##'.

    #Korisnici -> Privremena lokalna tabela
    ##Ispiti -> privremena globalna tabela

  • Tabela koju kreiramo, tj. nova tabela, ne mora imati ista imena kolona kao tabela iz koje uzimamo podatke. Da bismo to ostvarili koristimo tkz. alias-e, tj. u nasem upitu dodjeljujemo nova imena kolona. Evo i jednog primjera:

    SELECT Ime AS ImeKupca, Prezime AS PrezimeKupca
    INTO #temp_Kupci
    FROM Kupci

    U gornjem primjeru smo kreirali privremenu lokalnu tabelu, koja ima samo dvije kolone sa imenima ImeKupca i PrezimeKupca.

  • U sledecem primjeru koristimo NULL i DEFAULT vrijednost za kolone. Pomenuo sam ranije da null znaci da vrijednost nije poznata. SQL Server takodje dozvoljava da prilikom kreiranja tabele dodijelimo default value, sto je neka vrijednost koja se najcesce javlja u bazi. Npr. u nasoj bazi za videoteku, broj kaseta za neki film je uglavnom 1. Zbog toga, ako smo za "default" vrijednost kolone izabrali 1, onda mozemo da umjesto te vrijednosti samo upisemo "DEFAULT", rijec. Mozda se pitate, zasto je ovo potrebno! Pa, jednoga dana mozemo vrijednost "Default" za tu kolonu da promjenimo u definiciji tabele u 2. Ne moramo da idemo kroz nasu aplikaciju i na svakom INSERT iskazu mijenjamo vrijednost "1" u "2".

    INSERT INTO Filmovi (id, naslov, duzina, datum, Kategorija)
    VALUES ('T_601', 'Yojimbo', NULL, DEFAULT, 'Drama');
  • sql_server_2000- 399 - 04.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 28 - Intgritet podataka


    Bez tacnih podataka, baza podataka je beskorisna. zbog toga je veoma bitno da korisnicima ne dozvolimo da u bazu unose nepotpune i netacne podatke.

    Postoje dva metoda pomocu kojih mi regulisemo integritet podataka. To su: deklerativni i proceduralni. Kod deklerativnog metoda, integritet je definisan na nivou objekata, tj. tabela. Kod proceduralnog integriteta podataka, potrebno je napisati programe (trigere i uskladistene procedure) koji kontrolisu integritet podataka.

    Postoje tri razlicita tipa deklerativnog integriteta podataka: entitet, domejn, i referencijalni integritet (engleski: entity, domain, referential integrity).

    Deklerativni integritet podataka

  • Domain - ovo je integritet podataka nad kolonom (da li su dozvoljene NULL vrijednosti, u kom opsegu su podaci... )
  • Entity - ovo je integritet na nivou tabele. Npr. Primarni kljuc je primjer ovog integriteta jer svi slogovi tabele moraju imati razlicitu vrijednost i ne smiju biti NULL.
  • Referential - ovo je integritet koji se definise izmedju dvije tabele. U ovom slucaju, svaki podatak iz kolone jedne tabele, mora postojati u koloni druge tabele nad kojom je definisan primarni kljuc.

    SQL Server ima sledeca deklerativna ograničenja (engleski: constraints):

    CHECK - definisan na koloni
    DEFAULT - definisan na koloni
    REFERENTIAL - definisan na koloni

    FOREIGN KEY - referencijalni (izmedju dvije tabele)
    CHECK - referencijalni (izmedju dvije tabele)

    PRIMARY KEY - definisan nad tabelom
    UNIQUE - definisan nad tabelom
  • sql_server_2000- 402 - 04.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 29 - kreiranje ograničenja


    Prije svega potrebno je znati kao mozemo provjeriti koja su ograničenja definisana nad nekom tabelom. Kao i za vecinu zadataka vezanih za bazu podataka, u SQL Serveru postoje uskladistene procedure, koje mozemo pozvati iz Query Analyzer-a:

  • exec sp_helpconstraint 'ime_tabele' -> prikazuje sva ograničenja definisana nad tabelom.
  • exec sp_help 'ime_ograničenja' -> prikazuje pdatke o specificiranom ogranicenju
  • exec sp_helpdb 'ime_tabele' -> prikazuje podatke o tabeli, kao i ograničenja nad tabelom


    Ograničenje po primarnom kljucu - PRIMARY KEY CONSTRAINT

  • Kreiranje primarnog kljuca prilikom kreiranja tabele

    CREATE TABLE Klubovi
    ( KlubID int CONSTRAINT PK_Klubovi_KlubID PRIMARY KEY CLUSTERED,

    ......


  • Kreiranje primarnog kljuca nakon kreiranja tabele:

    ALTER TABLE dbo. Klubovi WITH NOCHECK ADD
    CONSTRAINT PK_Klubovi PRIMARY KEY CLUSTERED
    (
    KlubID
    ) ON PRIMARY
    GO

    Ograničenje po jedinstvenom kljucu - UNIQUE CONSTRAINT

  • Kreiranje jedinstvenog kljuca prilikom kreiranja tabele

    CREATE TABLE Radnici
    (Rjesenje_O_Prijemu VARCHAR
    CONSTRAINT Ux_Radnici_Rjesenje UNIQUE NONCLUSTERED,....

  • Kreiranje jedinstvenog kljuca nakon kreiranja tabele

    ALTER TABLE Radnici
    ADD CONSTRAINT Ux_Radnici_Rjesenje1 NONCLUSTERED (Rjesenje_O_prijemu)


    Ograničenje po stranom kljucu - FOREIGN CONSTRAINT

  • Kreiranje stranog kljuca prilikom kreiranja tabele

    CREATE TABLE Utakmice
    ( Kluba INT CONSTRAINT Fk_Utakmice_kluba
    FOREIGN KEY REFERENCES Klubovi(KlubID),....

  • Kreiranje stranog kljuca nakon kreiranja tabele

    ALTER TABLE Utakmice
    ADD CONSTRAINT FK_Utakmice_Kluba
    FOREIGN KEY (Kluba)
    REFERENCES Klubovi(KlubID)

    SQL Server ne kreira automatski indeks po stranom kljucu. Vi treba da to uradite sami!

    Kaskadni integritet - Cascading Integrity

    SQL Server 2000 ima moducnost da dozvoli promjenu ili brisanje podataka na svim slogovima koji imaju strani kljuc prema tom primarnom kljucu.

    CREATE TABLE ime_tabele
    (ime_kolone INT CONSTRAINT Fk_Tabela_Kolona
    FOREIGN KEY REFERENCES ref_tabela(ref_kolona)
    ŠON DELETE (CASCADE đ NO ACTION)?
    ŠON UPDATE (CASCADE đ NO ACTION)?


    Osnovno ogranicenje - Default constraint

    CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric DEFAULT 9. 99
    );


    Ogranicenje provjere vrijednosti - Check Constraint

  • Kreiranje ogranicenja provjere prilikom kreiranja tabele

    CREATE TABLE Studenti
    (ocjena INT CONSTRAINT Cs_Studenti_Ocjena CHECK (ocjena > 5),
    .....

  • Kreiranje ogranicenja provjere nakon kreiranja tabele

    ALTER TABLE Studenti
    ADD CONSTRAINT Cs_Studenti_Ocjena CHECK (ocjena >= 5 AND ocjena <= 10),
    ....
  • sql_server_2000- 403 - 04.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 30 - Rad sa ogranicenjima


    Ogranicenja definisana na tabeli mogu biti:
  • izbrisana
  • privremeno ukinuti, tj. onesposobljeni ili deaktivirani

    Brisanje ogranicenja

    ALTER TABLE Studenti
    DROP CONSTRAINT Cs_Studenti_Ocjena

    Deaktiviranje ogranicenja

  • Dodavanje ogranicenja koje je neaktivno ("disabled"):

    ALTER TABLE Ispiti
    WITH NOCHECK
    ADD CONSTRAINT Cs_Ispiti_Ocjena
    FOREIGN KEY (StudentID)
    REFERENCES Studenti(StudentID)

  • Dodavanje ogranicenja provjere, koje nije aktivno:

    ALTER TABLE Ispiti
    WITH NOCHECK
    ADD CONSTRAINT cH_Ispiti_Ocjena
    CHECK (ocjena >= 5 AND ocjena <= 10)

  • Deaktiviranje ogranicenja provjere, prilikom upisivanje velikog obima podataka u bazu.

    ALTER TABLE Ispiti
    NOCHECK CONSTRAINT ALL


    ili

    ALTER TABLE Ispiti
    NOCHECK CONSTRAINT cH_Ispiti_Ocjena


  • Aktiviranje ogranicenja provjere, kada je to potrebno:

    ALTER TABLE Ispiti
    CHECK CONSTRAINT ALL


    ili

    ALTER TABLE Ispiti
    CHECK CONSTRAINT cH_Ispiti_Ocjena
  • sql_server_2000- 405 - 04.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 31 - Komanda ALTER TABLE


  • Dodavanje nove kolone tipa varchar u tablu:

    ALTER TABLE distributors ADD COLUMN address VARCHAR(30);


  • Brisanje kolone iz tabele:

    ALTER TABLE distributors DROP COLUMN address RESTRICT;


  • Preimenovanje kolone u tabeli:

    ALTER TABLE distributors RENAME COLUMN address TO city;


  • Preimenovanje postojece tabele:

    ALTER TABLE distributors RENAME TO suppliers;


  • Dodavanje NOT NULL ogranicenja nad kolonom:

    ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;

  • Uklanjanja NOT NULL ogranicenja nad tabelom:

    ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;


  • Dodavanje check constraint-a nad tabelom:

    ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);


  • Ukidanje check constraint-a iz table i sve njegove djece:

    ALTER TABLE distributors DROP CONSTRAINT zipchk;


  • Dodavanje stranog kljuca u tabelu:

    ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL;


  • Dodavanje ogranicenja sa vise kolona:

    ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);


  • Dodavanje primarnog kljuca u tabelu, koji ce biti imenovan automatski:

    ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
  • sql_server_2000- 423 - 08.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 32 - Pretrazivanje podataka


    Pretrazivanje podataka je najcesci zadatak koji izvrsavamo nad nekom bazom podataka. Moc baza podataka je upravo u cinjenici da na veoma jednostavan i brz nacin mozemo naci odgovor na pitanje poput ovog: "Koja prodavnica ima najvecu prodaju u zadnjih 15 dana".

    Za dobijanje informacija iz baze podataka koristimo "SELECT" komandu. Za vracanje samo slogova koji zadovoljavaju neki kriterijum koristimo "WHERE" iskaz. Ukoliko zelimo da kolone koje zadovoljavaju uslov pretrazivanja (one se nazivaju u result set) budu sortirane u odredjenom redosledu, koristimo i "ORDER BY" iskaz. Pored toga, "GROUP BY" iskaz nam omogucuje da podaci budu grupisani po nekoj kategoriji ( na primjer po radniku ili radnoj jedinici).

    Za dobijanje zeljenih rezultata obicno moramo da izvrsimo pretrazivanje vise tabela. Da bismo podatke izvukli iz vise tabela moramo izvsiti tkz. spajanje tabele tj. join.

    Korisne informacije kod koriscenja SELECT iskaza

  • NULL vrijednost nije isto sto i nula ("0") ili prazan string. Ukoliko zelite da pronadjete koj vrijednosti neke kolone imaju NULL vrijednosti koristite sintaksu WHERE ime_kolone IS NULL.
  • Za pretrazivanje podataka u nekom opsegu koristite BETWEEN kljucnu rijec:

    SELECT Ime_Proizvoda, Cijena
    FROM Proizvodi
    WHERE CIJENE BETWEEN 10. 00 AND 14. 00

  • Moguce je uporedjivati vrijednosti u nekoj koloni sa listom vrijednosti:

    SELECT ImeKompanije, Direktor, Telefon
    FROM Korisnici
    WHERE Drzava IN ('Austrija', 'Njemacka', 'Holandija')

  • Preporucuje se koriscenje operatora"<>" umjesto "! =" jer ovaj drugi nije ANSI SQL 92 standard.


    Formatiranje izlaza

    Kod formatiranja izlaza treba obratiti paznju da je modguce kreirati kolone koje su dobijene kao rezultat neke matematicke operacije, eliminisati duplikate, i dodjeliti koloni novo ime.

  • Za eliminisanje duplikata iz dobijenih rezultata koristimo DISTINCT kljucnu rijec.

    SELECT DISTINCT Autor
    FROM Knjige

  • Za spajanje dvije ili vise kolone koristimo + operator.

    SELECT Ime + ' ' + Prezime
    FROM
    RADNICI

  • Veoma cesto, imena kolona nemaju ime koje je razumljivo za korisnike sistema. Zbog toga, kod pisanja upita, mozemo koristi i tkz. "ALIAS"-e, koji sluze da preimenujemo kolonu u prikazivanju rezultata upita.

    SELECT Ukupno0001 AS Sati_U_Sedmici
    FROM
    Plate
    WHERE Ukupno0001 < 40


    Rezultat bi izgledao ovako:

    Sati_U_Sedmici
    33
    0
    35
    38
  • sql_server_2000- 424 - 08.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 33 - Grupne funkcije


    Rad sa grupnim funkcijama

    Grupne funkcije se izvrsavaju nad podacima jedne kolone u tabeli, i vracaju jedan rezultat.

  • AVG() - ova funkcija vraca prosjek svih numerickih vrijednosti u koloni, koji su vraceni kao rezultat upita.
    SELECT AVG(sati)
    FROM PLATE
    WHERE MJESEC = 'Decembar'

  • COUNT(*) - ova funkcija vraca broj kolona koje zadovoljavaju neki uslov:

    SELECT COUNT(*)
    FROM Proizvodi
    WHERE Cijena > 10

  • COUNT(DISTINCT Radne_Jedinice) - Ove funkcije vracaju broj jedinstvenih podataka, od kojih ni jedna nije NULL.
  • COUNT() - funkcija vraca broj vrijednosti u nekom izrazu. Funkcija izbacuje sve kolone koje su NULL.
  • MAX() - Funkcija vraca najvecu vrijednost u koloni

    SELECT MAX(Cijena) AS 'Maksimalna cijena'
    FROM Proizvodi

  • MIN() - ova funkcija vraca minimalnu vrijednost izraza.

    SELECT MIN(Cijena)
    FROM Proizvodi

    MAX() i MIN() funkcije ne mogu da se koriste kod podataka tipa BIT.

  • Da bismo imali vise od jedne kolone u SELECT iskazu koji ima grupnu funkciju, moramo koristiti i GROUP BY iskaz.

    SELECT Kategorija, MAX(Cijena)
    FROM Proizvodi
    GROUP BY Kategorija

  • TOP ili TOP n PERCENT kljucne rijeci se koriste za vracanje odredjenog broja vrsta.
    Sledeci iskaz ce vratiti 4 najskuplja proizvoda:

    SELECT TOP 4 ImeProizvoda, Cijena
    FROM Proizvodi
    ORDER BY Cijena DESC

    naravno, morali smo da kazemo SQL Serveru da proizvode poredja po opadajucoj vrijednosti cijena.

    Komanda SELECT TOP N uvijek vraca onoliko slogova koliko smo trazili. Recimo da u prethodnom primjeru 4. proizvod koji smo dobili je knjiga "SQL Server", koja kosta $19. 99. Medjutim, u nasoj bazi podataka ima jos 2 knjige sa istom cijenom. Ako zelimo i njih da ukljucimo u nasu listu koristicemo TOP WITH TIES klaz.

    SELECT TOP 4 WITH TIES ImeProizvoda, Cijena
    FROM Proizvodi
    ORDER BY Cijena DESC

    U nasem primjeru ovaj upit ce vratiti 6, a ne 4 sloga.
  • sql_server_2000- 425 - 08.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 34 - Rad sa vise tabela


    Da bismo pretrazivali vise od jedne tabele, moramo da izvrsimo tkz. spajanje tabela ili join. Postoje cetiri tipa join operacije, ali je tkz. unutrasnje spajanje ili "inner join" najcesce korisceno.

    Spajanje tabela se obicno vrsni na osnovu kolona koje sadrze isti tip podataka. Najcesce spajanje je izmedju primarnog kljuca jedne tabeli i tkz. stranog kljuca druge tabele tj. tkz. "foreign relationship" izmedju tabla.

  • INNER JOIN - spajanje dvije tabele koje imaju zajednicke vrijednosti u nekim os svojih kolona. Primjera radi, mozemo spojiti tabele Radnici i Plate, jer tabela "Plate" ima sifru radnika.

    SELECT Radnici. Prezime, Radnici. Ime, Radnici. Odeljenje, Plate. Iznos
    FROM Radnici INNER JOIN Plate
    ON Radnici. RadnikID = Plate. RadnikID

  • OUTER JOIN - Postoji "LEFT OUTER JOIN" i "RIGHT OUTER JOIN" tj. lijevo i desno vanjsko spajanje. Recimo da imamo sledeci primjer:

    SELECT Korisnici. ImeKompanije, Korisnici. BrojTelefona, Narudzbe. DatumNarudzbe
    FROM Korisnici LEFT JOIN Narudzbe
    ON Customers. KorisnikID = Narudzbe. KorisnikID

    U ovom primjeru rezultat pretrazivanja ce sadrzati sve korisnike, bez obzira da li imaju nula, jednu ili vise narudzbi. Korisnici sa vise narudzbi bice prikazani u rezultujucoj tabeli onoliko puta koliko narudzbi imaju.

  • CROSS JOIN je takodje poznato kao Kartazijanski proizvod. Rezultat koji dobijemo je kombinacija svih vrsta jedne tabele sa svim vrstama druge tabele.
    Primjera radi, mozemo napraviti novu tabelu spajanjem tabela "Studenti" i "Ispiti".

    SELECT Studenti. StudentID, Kursevi. KursID
    FROM Studenti AS s CROSS JOIN Kursevi AS k

    Primjetite da ON iskaz nije koristen.


  • SELF JOIN je slucaj kada spajamo kolonu samu sa sobom. Recimo da imamo tabelu "Radnici" koja ima kljuc "RadnikID". Zelimo da napravimo listu svih radnika, sa imenima njihovih menadzera. Naravno, menadzer je takodje u tabeli "Radnici".

    SELECT e1. Prezime AS "Prezime", e1. Ime AS "Ime", e2. Prezime AS "Menadzer"
    FROM Radnici e1 INNER JOIN Radnici e2
    ON e1. MenadzerID = e2. RadnikID
  • sql_server_2000- 426 - 08.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 35 - String funkcije


  • LTRIM() - uklanja praznine sa lijeve strane
  • RTRIM() - uklanja praznine sa desne strane
  • LEFT(string) ili LEFT(string, 30) -> vraca prvi znak ili 30 znakova nekog stringa.
  • RIGHT(string) ili RIGHT(string, 3) -> isto kao left, ali pocinje sa desne strane, tj. sa kraja string.


    SET ROWCOUNT n Ova komanda se moze koristiti sa bilo kojom DML komandom. Zaustavlja izvrsavanje komandi cim je odredjeni broj kolona obradjen.
    LIKE oprator

  • Procenat (%) - koristi se da zamjeni bilo koji broj znakova

    SET QUOTED_IDENTIFIER OFF

    SELECT grad
    FROM Gradovi
    WHERE Grad LIKE "%oko%"

    Ova komanda ce da izlista sve gradove koji imaju "oko" u njihovom nazivu:

    Izlaz:

    Grad
    ----
    Sokolac
    Visoko

  • Donja crtica (_) - zamjenjuje jedan znak (bilo koju vrijednost)

    SET QUOTED_IDENTIFIER OFF

    Select Rijec
    FROM Rijecnik
    WHERE Rijec LIKE "_a"

    Ova komanda ce izlistati sve rijeci koje imaju dva slova, a drugo slovo je "a".


  • Srednje zagrade.

    SET QUOTED_IDENTIFIER OFF

    SELECT ImeKluba
    FROM Klubovi
    WHERE ImeKluba LIKE "ŠD-G? %"

    Ova komanda ce da izlista sve klubove koji pocinju sa: D, E, F ili G.


  • Iskljucivanje vrijednosti pomocu znaka ?

    SET QUOTED_IDENTIFIER OFF

    SELECT ImeKluba
    FROM Klubovi
    WHERE ImeKluba LIKE "Š? D-G? %"

    Ova komanda ce izlistati sve klubove cije ime ne pocinje sa slovima: D, E, F, G.
  • sql_server_2000- 427 - 08.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 36 - UNION kljucna rijec


    Kljucnu rijec UNION koristimo u upitima ukoliko hocemo da rezultat iz dvije ili vise tabela spojimo u jedan izvjestaj. Pri tome koristimo dva SQL iskaza, koje spajamo sa rijecju UNION. Prilikom koristenja UNION kljucne rijeci treba znati sledece:
  • 1. Oba SELECT iskaza moraju na izlazu imati isti broj kolona istog ili kompatibilnog tipa
  • 2. Oba SELECT iskaza moraju imati isti broj selektovanih kolona
  • 3. Resosled kolona mora biti identican u oba SELECT upita
  • 4. Duplikati ce biti automatski ignorisani. Ukoliko zelimo da vidimo duplikate, moramo koristiti UNION ALL frazu prilikom spajanja iskaza.

    PRIMJERI

  • U sledecem primjeru spajamo tabelu klubovi ( u kojoj imamo samo jedan klub - "Glasinac") sa tabelom "Titule" gdje imamo dvije vrste "Kup RS" i "Prvak RS".

    select Klub_Ime AS Zajednicko_ime
    FROM Klubovi
    UNION
    SELECT Naziv_Titule
    FROM
    Titule

    Rezultat ovog upita ce izgledati ovako:


    Zajednicko_ime
    -------------------------------
    Glasinac
    Kup RS
    Prvak RS

    (3 row(s) affected)


    Takodje trebamo primjetiti da ovaj izlaz bas nema mnogo smisla, jer spajamo "babe i zabe", tj. "Klubove" i "Titule".


  • U sledecem primjeru spajamo dvije tabele: "Studenti" i "Diplomirani_Studenti". Tabele imaju iste kolone

    SELECT Prezime+' '+Ime AS ŠIme i prezime?
    FROM Studenti
    UNION
    SELECT Prezime+' '+Ime
    FROM Diplomirani_Studenti

    Ovaj primjer ima mnogo vise smisla, jer ce nam vratiti spisak svih studenata: onih koji jos studiraju, kao i onih koji su diplomirali.
  • sql_server_2000- 430 - 08.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 37 - Pisanje podupita


    Podupiti (Subqueries) su upiti koje koristimo unutar slozenih upita. Za podupite kazemo da su "ugnjezdeni" ili "uglavljeni" unutar slozenih upita. Podupiti vracaju samo jednu kolonu. Podupit moze imati svoj podupit, i tako do 32 nivoa. Naravno u stvarnom zivotu, rijetko imamo vise od jednog nivoa podupita. Koriscenje podupita se preporucuje samo u slucaju kada zeljeni rezultat ne mozemo dobiti spajanjem tabela (JOIN).

    Podupit unutar WHERE iskaza


    SELECT ime, prezime, starost
    FROM Studenti
    WHERE Starost < (SELECT AVG(starost) FROM Studenti)

    U gornjem primjeru, podupit nam koristi da izracunamo prosjecnu starost svih studenata, a onda izlistamo podatke o svim studentima koji slu mladji od prosjecne starosti.

    Podupit unutar SELECT iskaza

    SELECT Naslov, Cijena, (SELECT AVG(Cijena) FROM Knjige WHERE Kategorija = 'Kompjuteri')
    FROM Knjige
    WHERE Kategorija = 'Kompjuteri'

    Ovaj upit ce vratiti spisak svih knjiga, njihovih cijena, i prosjecnih cijena za knjige iz kategorije "Kompjuteri".


    Kreiranje izvedenih tabela (Derived Tables)

    Izvedene tabele mozemo kreirati koristenjem podupita nakon FROM iskaza

    SELECT Ime
    FROM (SELECT Ime FROM Glumci WHERE GlumacID = 300) Glumci

    Ime
    ------------------------------
    Ljubisa

    (1 row(s) affected)



    Upotreba podupita u JOIN klazu

    I u ovom slucaju, podupit je isto sto i privremena tabela.

    SELECT lista_kolona
    FROM Tabela1 JOIN (podupit)


    Upotreba podupita nakon IN kljucne rijeci

    Podupit se moze koristiti da vrati listu vrijednosti, koji ce se kasnije uporedjivati unutar glavnog upita:

    SELECT ime, prezime
    FROM Studenti
    WHERE StudentID IN (SELECT StudentId FROM Ispiti WHERE IspitID = 17)

    Ovo je i najcesci nacin koriscenja ugnjezdenih upita. Primjer prikazuje sve studente koji su polozili ispit sa sifrom 17. Primjer nije bas najbolji jer bi ga bilo bolje uraditi spajanjem tabela "Studenti" i "Ispiti", ali prikazuje princip rada.

    Medjutim, sledeci primjer, koji koristi NOT IN sintaksu, ne mozemo dobiti spajanjem tabela. Primjer prikazuje studente koji nisu polozili ispit sa sifrom 17.

    SELECT ime, prezime
    FROM Studenti
    WHERE StudentID NOT IN (SELECT StudentId FROM Ispiti WHERE IspitID = 17)


    Upiti sa EXISTS i NOT EXISTS iskazom

    Kada hocemo da povezemo vise od jedne kolone iz glavnog upita sa podupitom, onda koristimo EXIST i NOT EXISTS operatore. EXISTS vraca "true" ili "istina" ako je bar jedna kolona pronadjena u podupitu. U protivnom vraca "false" ili "laz".

    SELECT k. ImeKompanije
    FROM Kompanija AS k
    WHERE k. Drzava = 'Srbija'
    AND EXISTS
    (SELECT DatumNarudzbe FROM Narudzbe WHERE Narudzbe. BrojKorisnika = k. BrojKorisnika)

    U ovom primjeru listamo sve kompanije iz Srbije, koje su narucile bar jedan proizvod.
    sql_server_2000- 431 - 08.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 38 - Optimizacija upita


    Primjetili ste da je iste rezultate moguce dobiti pomocu upita napisanih na sasvim drugi nacin. Medjutim, treba da znate, da brzina izvrsavanja upita u velikim bazama podataka moze biti kriticna, pa treba nesto znati i o tome kako napisati optimalan upit, tj. upit koji ce baza podataka (tj. RDBMS) najbrze izvrsiti.

    Vecine baza podataka imaju tkz. Optimajzer, jedan inteligentan program, koji u zavisnosti od velicine tabele, uslova spajanje, raspolozivih indeka nad tabelama, i fizicke organizacije podatka (CLASTERED ili NONCLASTRED) kreira plan za izvrsavanje upita koji dobija rezultate koji su vama potrebni. Mada sve ovo nije toliko vazno za male baze podataka sa vise stotina slogova, vi biste trebali da znate stvari koje vi treba da uradite da Optimajzeru olaksate rad.

  • Kreirajte indekse

    U sustini, kljuceve treba kreirati nad poljima koji se koriste za filtriranje kolona, kao i za spajanje tabela, zatim grupisanje i sortiranje podataka, kao i izvrsavanje matematickih operacija. Indekse nemojte kreirati nad kolonama koje su primarni kljucevi u tabelama, jer te su kolone vec indeksirane.

  • Koristite filtere ("Restrict Criteria")

    Prije svega, izbjegavajte da selektujete veliku kolicinu slogova iz tabela, ukoliko je to moguce. Pored toga koristite filtere prije spajanja tabela. Na primjer "Drzava = 'Srbija'", je jedan od filtera, nakon cega mozete spojiti dvije tabele. Ako primjenite filtere prije spajanja tabela, odmah cete dobiti jednu malu tabelu, umjesto jedne ogromne, iz koje DBMS masina mora da brise nepotrebne slogove.

  • Izbjegavajte koristenja "GROUP BY" iskaza

    Ukoliko morate koristiti ovaj iskaz u vasem upitu, koristite sto manje "grupnih polja". Pored toga, grupiranje radi brze nad jednom, nego nad vise tabela. Konacno, koristite grupiranje prije spajanja tabela (knjiga SQL Servera ovo tvrdi, mada ja nisam siguran da je to tako.

  • Provjerite da li koristite prava ogranicenja

    Ponekad neka ogranicenja rade brze od drugih. Primjera radi uslov >300 radi sporije od BETWEEN 300 and 1000.

  • Denormalizujte tabele
    Vec ranije smo govorili o denormalizaciji. Ponekad je dobro ne pretjerivati sa normalizacijom baze podataka, da bi performansa baze bila bolja.
  • sql_server_2000- 432 - 08.11.2004 : Zeljko Tomic Sokolac - best (0)

    Vjezba 4 - Rad sa "Videoteka" bazom


  • Primjer za "LEFT OUTER JOIN" nad tabelama "Movies" i "Rentals". Rezultujuca lista je spisak svih filmova koji nikada nisu bili iznajmljivani.

    SELECT m. MovieTitle
    FROM Movies m
    LEFT OUTER JOIN Rentals r
    ON m. MovieID = r. MovieID
    WHERE r. TransactionID IS NULL

    Kako ovaj upit radi? LEFT OUTER JOIN se prvo izvrsi kao INNER JOIN tj. napravi se jedna velika, rezultujuca tabela koja sadrzi sve kolone obje tabele, na osnovu zajednickog polja, u ovom slucaju (MovieID). Zatim se u tu privremenu tabelu dodaju svi slogovi iz lijeve tabele koji ne postoje u desnoj tabeli. Sva polja iz desne tabele se popune NULL vrijednostima. Nakon toga, mi smo filtrirali samo slogove koji imaju NULL vrijednost u nekom od polja iz desne tabele.


    MovieTitle
    ----------------------------------------
    Harry PotterL The Philosopher's Stone
    Braveheart
    Last of the Mohicans

    (3 row(s) affected)

  • Sledeci upit koristi unutrasnji (NESTED) upit, umjesto "LEFT OUTER JOIN". Rezultat je identican kao u prethodnom primjeru.

    SELECT m. MovieTitle
    FROM Movies m
    WHERE NOT EXISTS
    (SELECT r. TransactionID FROM RENTALS r
    WHERE r. MovieID = m. MovieID)

    MovieTitle
    ----------------------------------------
    Harry PotterL The Philosopher's Stone
    Braveheart
    Last of the Mohicans

    (3 row(s) affected)


    Ovo je jos jedan dobar primjer da se identicni podaci iz baze podataka mogu dobiti pomocu dva potpuno razlicita upita.
  • sql_server_2000- 486 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 39 - Azuriranje i brisanje


    Azuriranje i brisanje podataka je veoma vazno za odrzavanje baze podataka koja vjerodostojno predstavlja neki organizacioni sistem. Kada govorimo o azuriranju i brisanju podataka, treba imati u vidu da da sa jednom bazom podataka moze istovremeno raditi i hiljade korisnika, pa se moze desiti da vise njih istovremeno pokusa da promjeni jedan podatak. Da bi korisnik azurirao jedan slog (npr. tabela Radnici, radnik "Marko Markovic"), SQL Server treba da taj slog procita i proslijedi na kompjuter operatera. U trenutku citanja, SQL Server "zakljuca" taj slog, tj. oznaci ga da je u fazi azuriranja. Nakon sto operater promjeni informacije o radniku, SQL Server snimi novu vrijednost sloga, i naravno "otkljuca" slog, tako da je dostupan i ostalim korisnicima baze podataka. Ukoliko u procesu azuriranja sloga o nasem radniku iz prethodnog primjera, onda drugi operater mora da ceka dok se slog ne otkljuca, pa onda moze nastaviti sa svojim radom. Napominjem i to da su ovakvi slucajevi rijetki u bazama podataka, medjutim, SQL Server mora onemoguciti da se to desi.

    Takodje se moze desiti i tkz. deadlock ili "mrtvo zakljucavanje". Naime transakcija jednog operatera (transakcija A) je zakljucala jedan slog, npr. slog o Marku Markovicu u tabeli "Radnici". Istovremeno, transakcija drugog operatera (transakcija B) je zakljucala podatke o Mariji Markovic, kcerci Marka Markovica u tabeli "Djeca". Da bi se transakcija A zavrsila, treba da zakljuca i slog o svoj Markovoj djeci, dok transakcija B mora da zakljuca i slog o Marku Markovicu iz tabele "Radnici". Da bi se ovaj problem razrijesio, SQL Server mora da nakon odredjenog vremena izvrsi tkz. "ROLLBACK transakcije koja ima manji prioritet. Treba napomenuti i to da se problem "mrtvih zakljucavanja" dobrim dijelom moze razrijesiti i dobrim programiranjem.
    sql_server_2000- 487 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 40 - pojam "Transakcije"


    Ponekad je potrebno obraditi nekoliko SQL iskaza kao jednu jedinicu. Ako bilo koja od ovih SQL komandi naidje na neki problem onda bi trebalo da se sve komande poniste, tj. da se baza podataka vrati na prvobitno stanje. Na primjer, ako bankarski sluzbenik pokusa da prebaci novac sa jednog klijenta na racun neke organizacije, on treba da izvrsi dvije SQL operacije. U prvoj operaciji, novac se skida sa racuna korisnika. U drugoj operaciji novac se prebacuje na racun neke organizacije. Recimo da se druga operacija zavrsi bezuspjesno. U tom slucaju, novac korisnika bi bio izgubljen. Da se ovo ne bi desilo, SQL Server ima sposobnost da obradi grupu komandi kao jedna transakcija. Ova njegova osobina se zove atomicnost ("atomicity").

    Transakcija je moguca zato sto SQL Server kopira originalne podatke baze podataka u privremenu memoriju ("byffer cache"), SQL Server upisuje podatke u privremenu memoriju i arhivu ("transaction log"). Kada su promjene prihvacene ("commited"), SQL Swrver upisuje promjene u arhivu na disku, kao i u samu bazu podataka. Ako je transakcija zavrsena bezuspjesno, onda se promjene ne upisuju na disk, a brisu se i iz memorije racunara.

    Osnovni ("default") nacin rada SQL Servera tako sto se promjene nad podacima snime u bazu nakon svake transakcije ("autocommit mode").


    Eksplicitna transakcija

    Mikrosoft preporucuje da se koriste eksplicitne transakcije. One se pisu u sledecem formatu:

    BEGIN TRANSACTION ime_transakcije
    .....
    COMMIT TRANSACTION ime_transakcije

    Izmedju "BEGIN... " i "END... " idu DML komande, koje smo radili u prethodnim lekcijama (SELECT, INSERT, UPDATE, DELETE... ).

    Unutar SQL Transakcije nisu dozvoljene komande:
  • ALTER DATABASE
  • BACKUP LOG
  • CREATE DATABASE
  • RECONFIGURE
  • RESTORE DATAVASE
  • RESTORE LOG
  • UPDATE STATISTICS
  • bilo koja uskladistena procedura koja kreira privremenu tabelu (npr. sp_dboption).


    Implicitna transakcija

    Implicitna transakcija je karakteristicna za starije baze podataka. Implicitna transakcija ne zahtjeva komandu za pocetak i kraj transakcije, jer je svaka komanda prihvacena kao jedna transakcija dok se ne otkuca "COMMIT TRANS", ili "COMMIT WORK", ili "ROLLBACK TRAN".

    Da bismo omogucili koristenje implicitne transakcije kucamo:

    SET IMPLICIT_TRANSACTIONS ON


    Kod implicitne transakcije, mozemo koristiti sledece komande:

  • ALTER TABLE
  • CREATE
  • DROP
  • DELETE
  • FETCH
  • GRANT
  • INSERT
  • OPEN
  • REVOKE
  • SELECT
  • TRUNCATE TABLE
  • UPDATE

    SAVEPOINT

    Svaka transakcija moze imati vise tacaka ("bookmark"), koje se nazivaju "savepoints". Na primjer:

    BEGIN TRANSACTION
    ....
    SAVE TRANSACTION ime_1
    ...
    ...
    COMMIT TRANSACTION ime_1
    ...
    COMMIT TRANSACTION


    U gornjem primjeru vidimo da mozemo da trajno snimimo ("COMMIT") samo dio transakcije. Na pocetku transakcije imamo nekoliko komandi ("... "). Zatim smo obiljezili tacku "ime_1". Nakon toga imamo nekoliko SQL komandi ("... ). Konacno, sa komandom COMMIT TRANSACTION ime_1 smo trajno snimili na disk samo dio transakcije od mjesta gdje smo definisali tkz. savepoint "ime_1", do trenutka kada smo koristili komandu "COMMIT TRANSACTION ime_1". Drugim rijecima, jos imamo sansu da ponistimo dio transakcije koji nismo snimili.
  • sql_server_2000- 488 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 41 - Napomene o transakcijama


    Vazne napomene kod dizajniranja transakcije

  • Transakcije bi trebalo da budu male, da bi se smanjio posao koji SQL Server traba da uradi kod ponistavanja transakcije ("rollback").
  • Prilikom transakcije, SQL Server zakljucava objekte koje transakcija koristi (tabele itd. )
  • Izbjegavaj koristenje petlji unutar jedne transakcije
  • Nemoj koristiti DDL komande, npr. "CREATE TABLE" unutar eksplicitne transakcije
  • Nemoj zahtjevati od korisnika da ukuca neki podatak prilikom transakcije
  • Izbjegavaj ugnijezdene transakcije, tj. nemoj definisati drugu transakciju unutar prve.
  • sql_server_2000- 489 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 42 - Zakljucavanje resursa


    Zakljucavanje resursa je veoma vazno u sistemima koje koriste vise korisnika istovremeno.

    Zakljucavanje stiti od:

  • Gubitka pri azuriranju: onemogucuje da dva korisnika izvrse azuriranje istog sloga u istom trenutku.
  • Nedosljednih podataka: transakcija cita isti slog dva puta, medjutim vrijednosti su razlicite.
  • Fantomskih slogova: jedan korisnik promjeni vrijednost vrste, dok drugi korisnik upise novi slog u isto vrijeme.
  • "Prljavog citanje": ovo se desava kada jedna transakcija pokusava da cita podatke, koji jos nisu trajno upisani u bazu podataka ("noncommited data").


    Zakljucavanje je moguce nad:

  • jednim slogom u tabeli. Pri tome se koristi RID (identifikator vrste>)
  • jednog sloga u indesknoj tabeli. Pri tome se koristi kljuc indeksa.
  • 8 KB strane, koja je dio neke tabele.
  • tkz. "extent", tj. osam strana od 8 KB
  • cijele tabele, ukljucujuci indekse
  • cijele baze podataka

    VRSTE ZAKLJUVAVANJA

    Dva su osnovna tipa zakljucavanja:

  • Zakljucavanje sa dijeljenjem - Shared Locking

    Ova vrsta zakljucavanja primjenjuje se kod transakcija koje ce samo citati podatke, i nemaju namjeru da ih azuriraju. U ovom slucaju, vise transakcija mogu zakljucati iste podatke. Sve ostale transakcije mogu citati zakljucane podatke, ali ih niko ne moze azurirati.

  • Potpuno zakljucavanje - Exclusive Locking

    Ovaj nacin zakljuvavanja se koristi kada korisnik hoce da zakljuca podatke da bi ih modifikovao (INSERT, UPDATE, DELETE). Samo transakcija koja je zakljucala podatke moze da im pristupa.

    Posebno zakljucavanje

    U specijalnim situacijama, SQL Server koristi tkz. specijalno zakljucavanje:

  • INTENT LOCK kod ovog zakljucavanja, SQL Server kreira tkz. hijerarhiju zakljucavanja, tako da ne dolazi do medjusobnog konflikta vise transakcija.
  • INTENT SHARED (IS) kreiranje hijerarhije kada transakcija samo cita podatke.
  • INTENT EXCLUSIVE (IX) kreiranje hijerarhije kod ekskluzivnog zakljucavanja, tj. zakljucavanja u cilju azuriranja
  • Shared with intent exclusive (SIX) kada ce transakcija citati sve podatke, i azurirati neke od njih.

    Zakljucavanje u cilju azuriranja - UPDATE LOCK (UL)

    Ova vrsta azuriranja se primjenjuje kada transakcija planira da azurira podatke. Na strane tabele, koju SQL Server cita, se zakljucavaju koristeci tkz. UPDATE LOCK. Svrha ovog zakljucavanja je da ne dozvoli drugom korisniku da ekskluzivno zakljuca istu stranicu. Ukoliko se podaci na toj strani promjene, SQL Server promjeni status zakljucavanja u ekskluzivno zakljucavanje, tako da ni citanje tog dijela tabele nije moguce dok se transakcija ne zavrsi.

    Schema locks šema je kontejner za sve podatke iz jedne baze podataka. Ova vrsta zakljucavanja se koristi da se zakljuca tabela ili indeks ako je u upotrebi.
  • Schema stability lock ovo zakljucavanje onemogucava brisanje ("drop") tabele ili indeksa, ukoliko su u upotrebi.
  • Schema modification lock ovo zakljucavanje onemogucuje korisnicima pristup tabeli ili indeksu u toku modifikovanja njihove strukture.
  • sql_server_2000- 490 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 43 - Nivoi izolacije


    Nivoi izolacije odredjuju kako neka transakcija zakljucava i stiti podatke. Sto je zakljucavanje podataka duze, veca je vjerovatnoca da ce transakcija izazvati probleme ostalim transakcijama.

  • Session level locking - ovo zakljucavanje odredjuje do kog stepena ce biti izvrsena izolacija transakcije. SQL Server ce ovaj nivo da primjeni na sve transakcije. Koristite sledecu komandu za setovanje izolacionog nivoa:

    SET TRANSACTION ISOLATION LEVEL (READ COMMITTED đ READ UNCOMMITTED đ REPEATABLE READ đ SERIALIZABLE)

    Osnovni nivo je "READ COMMITTED".

  • READ UNCOMMITTED - omogucuje citanje podataka koji su modifikovani u memoriji, ali jos nisu snimljeni u bazu podataka.
  • READ COMMITTED - omogucava citanje samo podataka koji su snimljeni u bazu podataka.
  • REPEATABLE READ - ova opcija ne dozvoljava ni citanje podataka iz baze, koji su modifikovani, ali jos nisu snimljeni u bazu.
  • SERIALIZABLE - ova vrsta transakcije najduze drzi zakljucane podatke, ali najbolje stiti podatke od tkz. "prljavog citanja", "visestrukog citanja sa razlicitim vrijednostima" i fantomskih slogova.
  • sql_server_2000- 491 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 44 - Zakljucavanje tabela


    Zakljucavanje tabela se vrsi na sledeci nacin:

    BEGIN TRAN
    UPDATE Movie (SERIALIZABLE)
    SET Rented = 'Y'
    WHERE MovieID = 110
    COMMIT TRAN


    Ostale opcije koje mozemo koristiti u ovom slucaju su:

  • HOLDLOCK: zakljuca tabelu dok se transakcija ne zavrsi. Isto sto i SERIALIZABLE.
  • NOLOCK: uopste ne zakljucava resurse. Koristi se uglavnom kod SELECT.
  • ROWLOCK: zakljucava vrstu
  • PAGELOCK: zakljucava stranu od 8 KB
  • TABLELOCK: zakljucava tabelu
  • TABLELOCKX: ekskluzivno zakljucava tabelu
  • READPAST: preskace zakljucane slogove
  • UPDLOCK: koristi UPDATE LOCKS


    LOCK TIMEOUT odredjuje koliko dugo neka transakcija treba da ceka da zakljuca neki objekat, prije nego sto ce biti ponistena ("abort").
    ERROR 1205 je kod za gresku koja se desi kada je vasa transakcija bila zrtva, tkz. mrtvog zakljucavanja.
  • sql_server_2000- 492 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 45 - Azuriranje podataka


    Za azuriranje podataka koristimo komandu UPDATE. Ova komanda ima sledecu sintaksu:


    UPDATE ime_tabele
    SET ime_kolone = vrijednost đ promjenjiva đ ime_kolone
    WHERE neki_uslov


  • Primjer 1: Azuriranje kada eksplicitno definisemo neku vrijednost

    SET QUOTED_IDENTIFIER OFF
    GO

    UPDATE Klubovi
    SET Predsjednik = "Goran Cvijetic"
    WHERE Ime_Kluba = "Glasinac"
    GO

  • Primjer 2: Azuriranje koristenjem neke varijable (promjenljive)

    SET QUOTED_IDENTIFIER OFF
    GO

    DECLARE ŽCijenaProizvoda int
    SET ŽCijenaProizvoda = "10. 76"

    UPDATE Proizvodi
    SET Cijena = ŽCijenaProizvoda
    WHERE ImeProizvoda = "Romanijski krompir"
    GO

  • Primjer 3: Azuriranje koristenjem druge kolone iz iste tabele

    Tabela: Proizvodi(id, ImeProizvoda, Cijena, StaraCijena)

    SET QUOTED_IDENTIFIER OFF
    GO


    UPDATE Proizvodi
    SET Cijena = StaraCijena
    WHERE ImeProizvoda = "Romanijski krompir"
    GO

    U nekim slucajevima, SQL Server izvrsi konverziju podataka iz jedne vrste podataka u drugu. Npr. VARCHAR u INT. Medjutim, implicitna konverzija nije moguca u slucajevima kao sto je DECIMAL u INT. Moj savjet je, nikada ne ostavljajte SQL Serveru da on sam izvrsi konverziju podataka.
  • sql_server_2000- 493 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 46 - Brisanje podataka


    Za brisanje podataka koristimo komandu DELETE. Treba imati u vidu da, nakon sto su podaci izbrisani, jedini nacin da se vrate nazad je da se koristi prethodno napravljena kopija ili da se podaci ponovo ukucaju.

    Sintaksa komande DELETE

    DELETE
    FROM Ime_Tabele
    WHERE neki_uslov

    Kako je FROM iskaz opcionalan, komanda moze da se pise i ovako:

    DELETE Ime_Tabele
    WHERE neki_uslov

    Ukoliko WHERE iskaz nije naveden, komanda brise sve podatke u tabeli.

    Kako u SQL Serveru, nakon svake komande ide implicitni COMMIT, onda se preporucuje koristenje TRANSAKCIJA.

    BEGIN TRAN
    DELETE FROM Users where UserID = 10
    COMMIT TRAN

    Ukoliko smo kucali:


    BEGIN TRAN
    DELETE FROM Users where UserID = 10
    ROLLBACK TRAN

    U gornjem primjeru, brisanje je izvrseno unutar jedne transakcije, pa je moguce sa ROLLBACK TRAN vratiti pobrisani slog iz tabele korisnici.

    Jos neki primjeri:

    DELETE
    FROM Korisnici
    WHERE Ime LIKE 'Zelj%'

    Ova komanda brise sve korisnike iz tabele "Korisnici", cije ime pocinje za "Zelj", npr. "Zeljko", "Zeljka", "Zeljana"...


    DELETE FROM Korisnici
    FROM (SELECT TOP 3 * FROM KORISNICI) AS Korisnici1
    WHERE Korisnici. KorisnikID = Korisnici1. KorisnikID

    Ova komanda ce da kreira privremenu tabelu Korisnici1 koja sadrzi 3 sloga, a zatim ce da iz tabele Korisnici izbrise ta tri sloga.

    Komanda TRUNCATE TABLE

    Recimo da imamo tabelu sa milion slogova, i da je hocemo da izbrisemo sve podatke u njoj. Za brisanje podataka iz ove tabele bi trebalo dosta vremena ukoliko mi koristimo komandu "DELETE". To je zbog toga sto ova komanda svaki slog koji brise snima u arhivu (datoteku na disku). Problem je i to sto ta arhiva zauzima dosta prostora, a mi to u nasem slucaju ne zelimo jer smo odlucili da su podaci nepotrebni, i da ih vise ne zelimo. U tom slucaju koristimo "TRUNCATE TABLE" komandu.

    TRUNCATE TABLE ime_tabele

    Ukoliko je tabla izbrisana sa TRUNCATE komandom, IDENTITY nad primarnim kljucem ce ponovo biti postavljen na vrijednost 1, sto nije slucaj sa DELETE komandom.

    Komanda "TRUNCATE" ne moze da se izvrsi nad tabelom ukoliko strani kljuc ("Foreign Key") neke druge tabele pokazuje na tabelu koju zelimo da brisemo.
    sql_server_2000- 494 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 47 - Transaction Log Activity


    Snimanje aktivnosti transakcije - Transaction Log Activity

    Moguce je, prilikom transakcije, da se koriscenjem "MARK" iskaza, postavi tkz. "bookmark" koji ce u arhivu baze podataka da snimi pocetak neke velike transakcije.

    BEGIN TRAN VelikoBrisanje MARK 'Brisanje mnogo slogova'
    GO

    DELETE Korisnici
    COMMIT TRANSACTION VelikoBrisanje

    Postoje programi, kao sto je LogExplorer, koji mogu da iz arhive transakcija (to je samo jedna datoteka na disku) povrate podatke koji su izbrisani prilikom neke transakcije.
    sql_server_2000- 495 - 13.11.2004 : Zeljko Tomic Sokolac - best (0)

    Lekcija 48 - Brisanje tabela


    Brisanje tabele podrazumjeva brisanje svih podataka, ali i njene definicije u bazi podataka. Ukoliko kucamo komandu za brisanje tabele, ona ce takodje izbrisati i sva ogranicenja definisana nad tabelom, kao i indekse, a i trigere.

    Sintaksa komande za brisanje tabele:

    DROP TABLE ime_Tabele

    Napomena: Tabela ne moze biti izbrisana ukoliko neki strani kljuc (foreign key) pokazuje na tu tabelu. Drugim rijecima, ukoliko tabela ima neku drugu tabelu koja je zavisna od nje, ona ne moze biti izbrisana, a da se prethodno ne izbrise zavisna tabela.
    sql_server_2000- 69764 - 24.05.2012 : Nikola Milanovic Kragujevac - best (0)

    Unos podataka


    Koristim SQL Server 2005, pa pretpostavljam da bi problem bio sličan i u SQL Serveru 2000. Kada unosim podatke u tabelu, odredjeni podaci se lepo unesu, a umesto nekih mi pišu NULL vrednosti. Nadam se da možete da mi pomognete, hvala unapred.

    Poštovani,

    ne dajem savjete iz SQL Servera. Pošto nemam dovoljno informacija na kakav način unosiš podatke (iz Jave, iz neke forme, pozivom procedure...) ne mogu da ti kažem šta radiš pogrešno.
    sql_server_2000- 71704 - 16.07.2012 : Ivan T Beograd - best (0)

    Klijent preko interneta


    Kako da napravim klijenta za SQL server a da ga koristim preko interneta? Odnosno koristim program Blue Soft i imam u jednom gradu Bazu, a hteo bih da u kombiju u drugom gradu koristim tu istu bazu, pa me interesuje da se konektujem na tu bazu i da je koristim. Trenutno rešavam to na dva načina: jedan je preko Team Viewer, a drugi je da sam napravio mrežu preko HAMACHI-ja, od kojih se ne zna koji mi je sporiji. Teamviewer radi solidno, ali svaki rezultat rada moram da šaljem mailom, što me usporava. Hamachi je užasno spor. Mora da postoji način koji to može da se ubrza. Koji je to način?

    Instaliraj IIS i napravi jednu prostu WEB aplikaciju koja ti vraća rezultat upita. Upravo tako radi i ovaj portal.

    Idi na stranu - |1|2|