Professional Documents
Culture Documents
RBP Predavanja
RBP Predavanja
Sekcija 6 L 2
Normalizacija i Prva Normalna Forma
Sekcija 6 L 2
• Naizgled dobro formirana NARUDŽBENICA
Sifra Šifra
Ime Lokacija Telefon Naziv Cena Količina
kupca artikla
Sekcija 5 L 2
Redundancija Anomalije podataka
1. Anomalija ažuriranja.
2. Anomalija dodavanja.
3. Anomalija brisanja najvise
Normalizacija i Prva Normalna Forma
Sekcija 6 L 2
Normalizacija i Prva Normalna Forma
NARUŠAVANJE 1NF
PRIMERI
Sekcija 6 L 2
Normalizacija i Prva Normalna Forma
NARUŠAVANJE 1NF
PRIMER 1
Na slici je prikazan entitet KLIJENT sa atributima
broj, ime, prezime i događaj koji je vezan za
klijenta
NARUŠAVANJE 1NF
REŠENJE PRIMERA 1
... atribut događaj postaje entitet DOGAĐAJ koji
je povezan sa KLIJENTOM preko veze tipa M:1.
Sekcija 3 L 1
Normalizacija i Prva Normalna Forma
NARUŠAVANJE 1NF
PRIMER 2
Na slici je prikazan
entitet TRŽNI
CENTAR sa
atributima id, ime,
adresa, ime
prodavnice i sprat
na kome se
prodavnica nalazi.
Sekcija 3 L 1
Normalizacija i Prva Normalna Forma
NARUŠAVANJE 1NF
REŠENJE PRIMERA 2
Atributi ime prodavnice i sprat prodavnice
narušavaju 1NF jer u jednom TRŽNOM CENTRU
može biti više prodavnica i spratova pa vrednosti
ovih atributa ne bi bile atomske (jednoznačne).
NARUŠAVANJE 1NF
PRIMER 3
Na slici je prikazan ER dijagram koji se sastoji iz
dva entiteta, TIM i LIGA.
Sekcija 3 L 1
Normalizacija i Prva Normalna Forma
NARUŠAVANJE 1NF
REŠENJE RIMERA 3
Sekcija 6 L 3
Druga Normalna Forma
Šta ću naučiti?
Naučićete da:
• Definišete pravilo druge normalne forme u
procesu normalizacije
• Ispitate nenormalizovane entitete i utvrdite
koje pravilo (ili pravila) normalizacije su
narušena
• Primenite pravilo druge normalne forme i
tako otklonite narušavanje normalizacije u
modelu Sekcija 6 L 3
Druga Normalna Forma
Sekcija 6 L 3
Druga Normalna Forma
Sekcija 6 L 3
Druga Normalna Forma
stanje
Sekcija 6 L 3
Druga Normalna Forma
stanje
Sekcija 6 L 3
Druga Normalna Forma
Pogledajmo ovaj
ER-dijagram DJ-posla.
Šta nije u redu sa
njim? komentar
* datum događaja
Atributi vreme trajanja trajanje
i datum događaja su
na pogrešnom mestu.
Vrema trajanja zavisi
jedino od pesme, a
datum događaja zavisi
samo od događaja.
Ovo je narušavanje
druge normalne forme
(II NF). Sekcija 6 L 3
Druga Normalna Forma
Model ćemo
normalizovati
izmeštanjem atributa
koji narušavaju II NF.
Izmeštanjem atributa
datum u entitet
DOGAĐAJ i atributa
trajanje u entitet
PESMA preveli smo
trajanje
model u drugu * datum
normalnu formu. Sekcija 6 L 3
Druga Normalna Forma
NARUŠAVANJE 2NF
PRIMER
Identifikator knjige u biblioteci uključuje i lokaciju
police. Da li ovaj ER dijagram zadovoljava pravilo
Druge Normalne Forme? Ako uočite
narušavanje, ispravite ga.
Sekcija 5 L 2
Druga Normalna Forma
NARUŠAVANJE 2NF
REŠENJE RIMERA
Nacrtani ER dijagram ne zadovoljava pravilo Druge
Normalne Forme jer atribut veličina police na zavisi od
celog UID već samo od barirane veze. Zbog toga je
potrebno atribut veličina police premestiti u entitet
POLICA. Rešenje je prikazano sa ovoj slici:
Sekcija 5 L 2
Druga Normalna Forma
Primer:
Model podataka o studentima celog univerziteta
STUDENT
# šifra fakulteta
Narušena
# godina upisa
# broj upisa
* ime
* prezime
! druga
normalna
forma
* datum rođenja
* naziv fakulteta
* sedište fakulteta
Sekcija 5 L 2
Druga Normalna Forma
Normalizacija:
Model podataka o studentima celog univerziteta
STUDENT
# šifra fakulteta
# godina upisa FAKULTET
# broj upisa
* ime
* prezime
* datum rođenja
* naziv fakulteta
* sedište fakulteta
Sekcija 5 L 2
Druga Normalna Forma
Rešenje:
Model podataka o studentima celog univerziteta
STUDENT studira
# godina upisa
# broj upisa
* ime
* prezime ima
* datum rođenja
FAKULTET
# šifra
* naziv
* sedište
Sekcija 5 L 2
Druga Normalna Forma
Implementacija:
Relaciona baza podataka o studentima
STUDENTI
godina upisa broj upisa ime prezime datum rođenja fakultet
2005 382 Ana Todorić 24.08.1986. TFČ
2006 382 Toše Manev 13.03.1087. UFU
2005 382 Ana Todorić 24.08.1986. UFU
2005 124 Milko Perić 29.12.1986. TFČ
2007 83 Milko Perić 30.12.1988. TFČ
FAKULTETI
šifra naziv sedište
TFČ Tehnički fakultet Čačak
UFJ Učiteljski fakultet Jagodina
UFU Učiteljski fakultet Užice
Sekcija 5 L 2
Druga Normalna Forma
Zamislite neku
informaciju koju želite
da sačuvate o vašoj
CD kolekciji. Da li
informacija o radnji u
kojoj ste kupili CD
pripada istom entitetu?
Ako se promeni adresa
radnje, morate da
promenite taj podatak Narušavanje III
na svim CD koje ste normalne forme
kupili u toj radnji.
Treća Normalna Forma
Adresa radnje je
zavisna od broja CD-a,
koji je UID entiteta CD.
Dakle ovaj entitet je u
1NF i u 2NF.
Ali adresa radnje je
takođe zavisna i od
imena radnje, koja je
ne-UID atribut.
Ovo je primer tranzitivne Narušavanje III
zavisnosti i narušavanja normalne forme
Treće Normalne Forme.
Treća Normalna Forma
Normalizacija:
napravljen je novi entitet RADNJA, koji je
u vezi sa entitetom CD.
Iako je država
atribut grada,
državni grb je,
u stvarnosti,
atribut države.
Treća Normalna Forma
REŠENJE PRIMERA 1
PRIMER 2
FAKTURA STAVKA
pripada FAKTURE
# broj fakture
* datum sadrži # broj stavke
* šifra kupca * šifra artikla
* naziv * naziv
* cena
* količina
* iznos
PRIMER 2
izvedeni atribut
* količina}
* iznos
REŠENJE PRIMERA 2
FAKTURA pripada STAVKA FAKTURE
# broj fakture # broj stavke
sadrži
* datum * količina
zadužuje sadrži
sadržan
plaća
ARTIKAL
KUPAC # šifra artikla
# šifra kupca * naziv
* naziv * cena
Primer
NORMALIZACIJA RELACIJE
STUDENTI:
1NF
1NF
2NF
успорава се ажурирање.
Зашто онда вршити
денормализацију?
Понекад нормализована база података не пружа
максималну ефикасност
Pre-joining
Денормализација 3нф
Pre-joining
Недостаци:
Додатне ДМЛ операције и дефинисање тригера
Insert НЕ
Delete НЕ
Insert ДА
naziv_rec ДА
Stavke
Update
Recepta
recept_id ДА
Delete НЕ
Тип
Табела Колона Потребан Шта треба да се уради?
тригера
Insert НЕ
Delete НЕ
Delete НЕ
Пример 1
У односу на денормализовани модел, акције које могу
нарушити интегритет података су:
Измена вредности атрибута naziv_rec у релацији Recepti.
Неопходно је да се иста измена изврши и у релацији
StavkeRecepta.
Insert НЕ
Jedinice
Update naziv_jm ДА
Mere
Delete НЕ
Insert ДА
naziv_jm ДА
Proizvodi Update
sif_jm ДА
Delete НЕ
Тип
Табела Колона Потребан Шта треба да се уради?
тригера
Insert НЕ
Delete НЕ
Delete НЕ
Пример 2
У односу на денормализовани модел, акције које
могу нарушити интегритет података су:
Измена вредности атрибута naziv_jm у релацији
JediniceMere. Неопходно је да се иста измена изврши
и у релацији Proizvodi.
Insert НЕ
Delete НЕ
Insert ДА
id_jm ДА
Stavke
porudzbe Update
nice
id_pr ДА
Delete НЕ
Тип
Табела Колона Потребан Шта треба да се уради?
тригера
Insert НЕ
Delete НЕ
Delete НЕ
Пример 3
У односу на денормализовани модел, акције које могу
нарушити интегритет података су:
Измена вредности атрибута id_jm у релацији Proizvodi.
Неопходно је да се иста измена изврши и у релацији
StavkaPorudzbenice .
INSERT
INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
SELECT column_name,column_name
FROM table_name;
SELECT *
FROM employees;
UPDATE Customers
SET ContactName='Alfred Schmidt', City='Hamburg';
SELECT column_name(s)
FROM table_name alias_name;
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
Симбол Значење
Allows you to match any string of any
%
length (including zero length)
Allows you to match on a single
_
character
UPDATE Products
SET sale_code = ‘2’
WHERE city IN ('Paris','London');
DELETE
FROM products
WHERE price-price*disc_perc/100 >3000
Симбол Значење
AND Ред мора да испуни све услове
OR Ред мора да испуни бар један услов
NOT Може да стоји испред било ког услова
Date formats:
YYYY, YY, MM, DD
YEAR, MONTH, DAY
MON, DY
https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_
elements004.htm
23 March 2021 mr Miloš Pejanović, dipl.inž. 28
CHAR функције
TO_CHAR(col_name [, format])
INSTR( string, substring [, start_position [,
appearance_num ] ] )
CONCAT(char1, char2)
LOWER(col_name)
UPPER(col_name)
REPLACE(col_name, search_str, replace_str)
SUBSTR(col_name, position, substr_length)
SQL:
SELECT ..FROM, WHERE, ORDER BY, GROUP BY, HAVING
OPERATORI
OPERACIJE, UGRAĐENE FUNKCIJE
UPITI NAD JEDNOM TABELOM
NAREDBE ZA RUKOVANJE PODACIMA omogućavaju izveštavanje iz baze
podataka (izdvajanje postojećih i izračunavanje novih informacija) i ažuriranje baze
podataka u širem smislu.
SELECT *
FROM RADNICI
Sada su prikazana dva reda manje. Svi prikazani redovi imaju različite vrednosti.
Neki operatori porede datu kolonu ili izraz sa jednom vrednošću (jednoredni
operatori), a drugi porede sa skupom ili intervalom vrednosti (višeredni
operatori).
SELECT ime
FROM radnici
WHERE ime
LIKE 'L%' OR
ime LIKE '%r'
1. ()
2. *, /
3. +, -
Null nije isto što i nula ili blanko znak. U SQL-u nula je broj, blanko je
znak, a null znači ne postojanje bilo kakve vrednosti. Dakle, NULL znači
da nema vrednosti.
Mogući atribut entiteta RADNIK je telefon, ali je moguće da radnici nisu u obavezi
da podatak o telefonskom broju učine dostupnim.
Služi da u upitu sistematski dodeli datu vrednost poljima koja u datoj koloni
imaju vrednost NULL. Ta dodela vrednosti je samo privremena i odnosi se na
izvršavanje tog upita.
S obzirom da je cilj dodele da se nad poljima sa NULL vrednostima obavi
neka operacija, vrednost koja se dodeljuje je obično neutralna u odnosu na
tu operaciju.
Ako treba da sabiramo ili oduzimamo, vrednost treba da bude 0; ako treba
da množimo ili delimo vrednost treba da bude 1; ako treba da konkateniramo
znakovne podatke vrednost treba da bude prazna znakovna konstanta.
MySQL podržava veliki broj ugrađenih funkcija, kao i mogućnost uvođenja korisničkih
funkcija. Funkcije mogu biti: determinističke i nedeterminističke. Determinističke
funkcije vraćaju isti rezultat pri svakom pozivu nad istim skupom ulaznih vrednosti, a
nedeterminističke ne.
Agregatne funkcije
Funkcija Opis
AVG([ALL | DISTINCT] numeričke nalazi prosek svih ili svih različitih vrednosti; NULL
vrednosti) vrednosti se zanemaruju
SUM ([ALL | DISTINCT numeričke sabira vrednosti, NULL vrednost se zanemaruje
vrednosti)
SELECT posao,
ROUND(AVG(plata),2) AS 'prosečna
plata’, COUNT (*) AS 'broj izvršilaca'
FROM radnici
WHERE (plata IS NOT NULL) AND
(posao IS NOT NULL)
GROUP BY posao
23-Mar-21 mr Miloš Pejanović, dipl.inž. 62
Prikazati po odeljenjima kvalifikacije, ukupnu platu radnika sa tom kvalifikacijom i broj
radnika. Rezultati su uređeni po kvalifikaciji u rastućem redosledu.
Dok se klauzula WHERE primenjuje na sve n-torke pre nego što oni postanu delovi
grupe, klauzula HAVING se primenjuje na već agregiranu vrednost za tu grupu.
Ukoliko se u upitu koriste sve tri klauzule onda se mora poštovati redosled:
1. WHERE,
2. GROUP BY,
3. HAVING.
GROUP BY može bez HAVING klauzule. HAVING klauzula NE MOŽE bez GROUP BY.
Join je ključna reč u SQL-u, koja označava spoj između dve tabele.
Kada se u rezultatu spoljnjeg upita kombinuju podaci iz više tabela mora
se izvršiti spajanje (JOIN) dveju ili više tabela.
Spajanje tabela vrši se korišćenjem zajedničkih atributa, tj. atributa koji su
definisani nad istim domenima.
13-Jun-21 2
UNUTRAŠNJE SPAJANJE
Spaja zapise na osnovu jednog ili više zajedničkih polja.
ON uslov_spajanja;
UNUTRAŠNJE SPAJANJE
Da bi se dobila tražena informacija potrebno je spojiti tabele D_CLIENTS i
D_EVENTS. Uslov spajanja je jednakost stranog ključa client_number u tabeli
D_EVENTS sa primarnim ključem client_number u tabeli D_CLIENTS.
13-Jun-21 5
UNUTRAŠNJE SPAJANJE
Rešenje:
SELECT first_name, last_name, name, event_date
FROM d_clients, d_events
WHERE d_clients.client_number=d_events.client_number;
ILI
SELECT first_name, last_name, name, event_date
FROM d_clients JOIN d_events
ON d_clients.client_number=d_events.client_number;
13-Jun-21 6
UNUTRAŠNJE SPAJANJE
Prikazati spisak imena i prezimena zaposlenih koji rade na Banovom brdu.
8
13-Jun-21
UNUTRAŠNJE SPAJANJE
Kako se realizuje INNER JOIN sa tri tabele?
10
13-Jun-21
SELF JOIN – SPAJANJE TABELE SA SAMOM
SOBOM
11
13-Jun-21
SELF JOIN
SPAJANJE TABELE SA SAMOM SOBOM
Tabela se može spajati i sa samom sobom (SELF JOIN), kada unutar tabele postoji relacija
između pojedinih n-torki.
Ova vrsta spajanja odnosi se na podatke u jednoj tabeli kada unutar objekata jedne tabele
postoji relacija 1:1 ili 1:N.
Spoj tabele sa samom sobom pravi tako što se upitu dodaje duplikat tabele i spajaju se
polja iz originala i kopije tabele..
12
13-Jun-21
SELF JOIN
SPAJANJE TABELE SA SAMOM SOBOM
Ako se koristi Self Join, onda će se isti naziv tabele pojaviti dva puta u istoj klauzuli FROM.
Zato je kod Self Join-a neophodno koristiti dva različita alijasa za istu tabelu.
Na primer, ako je potrebno prikazati spisak svih zaposlenih iz tabele EMPLOYEES sa
imenima njihovih rukovodilaca, onda ta tabela ima dvostuku ulogu:
S jedne strane, ona sadrži podatke o svakom zaposlenom. Za tu ulogu koristiće se alijas,
npr. emp;
14
13-Jun-21
LEFT JOIN
leva_tabela LEFT JOIN desna_tabela
• LEFT JOIN vraća sve zapise iz tabele koju u spoju
proglasimo kao “LEVU”, odnosno koja je prva navedena u
izrazu za spajanje.
16
13-Jun-21
LEFT JOIN
Prikazati nazive odeljenja, ime i posao svakog radnika
koji u njima rade, uključujući i odeljenja u kojima
nema raspoređenih radnika.
17
13-Jun-21
RIGHT JOIN
leva_tabela RIGHT JOIN desna_tabela
• RIGHT JOIN vraća sve zapise iz tabele koju u spoju
proglasimo ka“DESNU”, bez obzira na to da li se
odgovarajući zapisi nalaze u “levoj” tabeli.
20
13-Jun-21
FULL JOIN
leva_tabela FULL JOIN desna_tabela
• Vraća sve redove leve tabele spojene sa odgovarajućim
redovima desne tabele za koje je uslov spajanja zadovoljen,
redove iz leve tabele koji nemaju par u desnoj, kao i redove iz
desne tabele koji nemaju par u levoj (redovi koji nemaju svoj
par spajaju se sa null vrednostima).
21
13-Jun-21
PITANJA ?
22
13-Jun-21
BAZE PODATAKA
SQL2
POGLEDI
FUNKCIJE
Koncept baze podataka daje mogućnost da više različitih aplikacija, pa samim tim i više
korisnika, pristupa bazi podatka. Pojedinačni korisnik ne mora da zna sve detalje baze
podataka u celini: njega mogu zanimati samo neke tabele i samo neki atributi tih tabela.
Tvorac relacionih baza podataka Codd definisao je više tipova relacija, a među njima i
tzv. pogled (view).
Osnovna razlika između bazne tabele i pogleda je u tome što bazna tabela postoji na
memorijskom medijumu računara (disku) dok je pogled, fiktivna virtuelna tabela koja ne
postoji u memoriji, ali se može formirati uvek kada nam zatreba, tj. kada je
referenciramo. Sa korisničke tačke, nema razlike u pretraživanju ovakve virtuelne
tabele i bazne tabele.
13-Jun-21 mr Miloš Pejanović, dipl.inž. 2
Pogled je virtuelna imenovana tabela koja se kreira naredbom CREATE (SELECT), ali se u bazi
podataka memoriše na specifičan način. Definicija pogleda (naziv pogleda, nazive kolona i upit)
čuva se u bazi podataka u prevedenom obliku, što obezbeđuje veliku brzinu rada sa pogledima.
Kada korisniku zatreba „pogled“ na bazu podataka, on ga poziva i kreira virtuelnu tabelu. Pri
izvršavanju upita nad pogledom, DBMS kombinuje taj upit sa upitom koji definiše pogled i pravi
se novi upit koji se izvršava nad baznim tabelama koje čuvaju podatke (fizičke tabele na disku).
Pogled se najčešće kreira nad više tabela. Rad sa pogledima pruža podršku očuvanju integriteta
podataka u bazi. Neki DBMS (npr. MS Access) nemaju mogućnost rada sa pogledima.
Uprošćavanje upita
Mehanizam za kontrolu pristupa podacima
o korisnik vidi samo neke podatke
Bolje performanse
o pogled se čuva u prevedenom obliku što povećava brzinu rada
Nezavisnost podataka
o menjaju se definicije pogleda, a ne aplikativni programi koji koriste podatke iz
baze podataka preko pogleda.
Nakon nekog vremena, tabele koje se često ažuriraju u toj meri promene stanje da
pogled više nema dovoljnu brzinu.
Zbog toga se pogled mora izbaciti iz šeme baze podataka (DROP) i odmah iznova
napraviti (CREATE). Prilikom ponovnog kreiranja novodobijeni binarni kod će biti
optimalan za novo stanje podataka u bazi.
Poglede treba koristiti oprezno, jer mogu izazvati loše performanse upita.
Ako lista atributa nije specificirana, nazivi i tipovi atributa preuzimaju se iz baznih
tabela navedenih u SELECT naredbi.
Naredba ALTER VIEW kreira novu virtuelnu tabelu sa specificiranom listom atributa. Podrazumeva
se da je specificirani pogled već kreiran naredbom CREATE VIEW .
Sve uspostavljenje dozvole ostaju na snazi. Sukcesivno izvršavanje naredbi DROP VIEW i CREATE
VIEW ima isto dejstvo kao naredba ALTER VIEW, ali zahteva ponovno uspostavljanje prava pristupa.
Prilikom kreiranja pogleda, kreator pogleda mora imati prava nad tabelama nad
kojima se pogled kreira.
Sa druge strane, korisnik ne mora imati SELECT prava nad tabelama, sve dok ima
prava nad pogledom.
RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija, plata,Id_odeljenja$>
U ovome primeru nisu uvedeni novi atributi, iako ih pogled može imati.
Imena atributa u pogledu i osnovnim tabelama iz kojih je izveden su ostala ista.
RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija, plata,Id_odeljenja$>
UCESCE<#id_radnika, #id_projekta, br_sati, funkcija>
PROJEKAT #id_projekta, ime_proj, sredstva, rok>
U opštem slučaju možemo kreirati funkciju koja na izlazu daje rezultat samo na
osnovu ulaznih parametara.
Ugrađene
Korisnički definisane
DELIMITER //
CREATE FUNCTION fn_moja_funkcija_1()
RETURNS varchar(20)
BEGIN
DECLARE x int;
SET x=10;
RETURN 'POZDRAV';
END //
DELIMITER ;
13-Jun-21 mr Miloš Pejanović, dipl.inž. 23
Funkcija se poziva pomoću SELECT klauzule što omogućava da bude umetnuta u sam
upit.
Na raspolaganju je veliki broj mogućnosti za intervenciju na podacima u trenutku kreiranja
izlaza.
Poziv funkcije:
select fn_moja_funkcija_1()
select fn_max_plata();
PODUPITI
PODUPITI
Podupiti u WHERE klauzuli
Podupiti u FROM klauzuli
Prikazati id, ime, platu i kvalifikaciju zaposlenih koji imaju istu platu kao bilo koji
zaposleni čija je kvalifikacija VSS.
RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija,
plata, Id_odeljenja$>
Podsećanje: ALL operator se koristi kada želimo da WHERE izraz spoljnog upita bira redove koji
odgovaraju kriterijumu (<, >, =...) za sve vrednosti koje vrati podupit.
ALL operator upoređuje vrednosti sa svakom vrednosti vraćenom od strane unutrašnjeg podupita.
mr Miloš Pejanović, dipl.inž. 6
Prikazati prezimena, imena, kvalifikacije, datume zaposlenja i šifre odeljenja radnika
koji ne rade u odeljenju 10, ali su se zaposlili istog datuma kad i neki radnik iz
odeljenja 10.
Treba pisati jedan podupit po koloni koje treba uporediti pri izvođenju non-pair-wise
multiple-column podupita.
Microsoft SQL Server 2014 ima 2 osnovne vrste okidača: DML i DDL okidači.
DDL i DML trigeri se moogu pisati korišćenjem Transact-SQL ili CLR okidača.
1
[29] Error! Reference source not found.].
1
USE [master];
GO
EXEC sp_configure 'show advanced options', 1;
GO
-- Da bi se izmenila konfigurisana vrednost za dodatne opcije.
RECONFIGURE;
GO
-- Da bi se omogućilo korišćenje ugnježdenih trigera
EXEC sp_configure 'nested triggers', 1;
GO
-- To update the currently configured value for this feature.
RECONFIGURE;
GO
Ugnježdeni trigeri zahtevaju pažljivo planiranje zato što mogu da rezultuju višestrukim
promenama u istoj koloni ili nad više tabela. Ugnježdeni okidači mogu da proizvedu
neočekivane rezultate. Umesto ugnježdenih trigera preporučljivo je koristiti jedan triger
koji izvršava sve navedene akcije.
DML trigeri
DML trigeri se okidaju kao odgovor na bilo koju kombinaciju INSERT, UPDATE, ili
DELETE događaja u specifičnoj tabeli. Ne može se kreirati DML triger nad sistemskom
tabelom. Ne mogu se koristiti sledeće naredbe u DML trigerima: CREATE DATABASE,
ALTER DATABASE, DROP DATABASES, RESTORE DATABASE, RESTORE LOG,
RECONFIGURE, DISK INIT, DISK RESIZE, i SHUTDOWN.
Postoje 2 vrste DML trigera, zasnovani na kôdu koji triger izvršava:
• AFTER: Ovaj triger se okida nakon procesiranja podataka u naredbi za manipulaciju
podacima. SQL Server ne dozvoljava kreiranje AFTER trigera nad pogledima.
• INSTEAD OF: Ovaj triger se okida pre izvršenja naredbe za manipulaciju podacima i
kod trigera se izvršava umesto te naredbe.
DDL trigeri se okidaju kao odgovor na događaje na nivou definicije podataka, kao što je
kreiranje ili brisanje objekata. DDL trigeri mogu biti na nivou baze podataka ili servera.
Funkcija EVENTDATA
Funkcija EVENTDATA pruža detaljne informacije o DDL događaju koji je prouzrokovao
da se okine triger. Ona vraća vrednost tipa XML.
Možemo koristiti i desni klik na triger i izabrati Disable (za isključivanje) ili Enable
(uključivanje).
Pregled trigera
DML trigeri za jednu tabelu se vide u folderu Triggers te tabele. DDL trigeri se mogu
videti po opsegu. Za triger baze treba proširiti Databases folder, zatim Programmability i
onda Database Trigger.
Za DDL server triger, proširiti instancu servera, zatim Server Objects folder, i onda
Triggers.
Može se koristiti i sp_helptext sistemska uskladištena procedura i upit nad sledećim
sistemskim pogledima, da bi se vodeli DDL i DML trigeri:
• sys.triggers: vraća informacije o svim trigerima
• sys.servertriggers: vraća informacije o trigerima na nivou servera
• sys.sql_modules: vraća informacije o kreiranim svim trigerima
4
BEGIN TRY
{ sql_statement |statement_block}
END TRY
BEGIN CATCH
[{ sql_statement |statement_block}]
END CATCH
Samo greške sa kôdom između 11 i 19 dovode do izvršenja CATCH bloka. SQL Server
tretira greške sa manjom ozbiljnošću kao informativne poruke. Greške sa kôdom od 20 i
preko izazivaju trenutno prekidanje konekcije, SQL Server ne izvršava Transact-SQL
kôd u okviru CATCH bloka. Ako ne prekinu konekciju, onda se izvrši samo CATCH blok.
Može se koristiti sledeća skalarna funkcija u okviru CATCH bloka da se preuzme
informacija o grešci koja je prouzrokovala da se izvrši CATCH blok:
• ERROR_NUMBER(): vraća broj greške
@@ERROR funkcija takođe vraća kôd greške ako je prethodna Transact-SQL
statement is executed without any error.
• ERROR_MESSAGE(): Vraća tekstualni opis greške
• ERROR_SEVERITY(): Vraća ozbiljnost greške
• ERROR_STATE(): Vraća broj stanja greške
• ERROR_LINE(): Vraća liniju kôda u kojoj se dogodila greška
• ERROR_PROCEDURE(): Vraća ime storne procedure ili trigrea gde se dogodila
greška
Može se koristiti TRY blok da se pronađe izutetak koji pomera izvršavanje na CATCH
blok. THROW naredba se mora završavati sa ;. Sintaksa THROW naredbe:
THROW [{ error_number | @local_variable },
{ message | @local_variable },
{ state | @local_variable }] [ ; ]
Koristimo RAISERROR naredbu da navedemot SQL Server da pošalje grešku
klijentskoj aplikaciji. Uobičajeno je da se koristi za korisnički definisane greške.
Sintaksa:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
5
Sintakse za kreiranje okidača
ON naziv_tabele
AFTER | INSTEAD OF
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [
DELETE ] }
AS {
sql_naredbe [ ...n ]
gde je:
6
AFTER | INSTEAD OF Ključna reč AFTER (eng. nakon, posle)
označava da se okidač aktivira nakon što
se završilo ažuriranje podataka u tablici
nad kojom je okidač postavljen usled
delovanja jedne ili više SQL naredbi iz
skupa {INSERT, UPDATE i DELETE}
Ključna reč INSTEAD OF (eng. umesto)
označava da se u ovom slučaju samo
okidač izvršava umesto da se izvrši
ažuriranje podataka naredbom koja je
aktivirala okidač. Ova vrsta okidača se
može primenjivati i nad tablicama i nad
pogledima (view). U telu okidača se
obično vrši validacija (provera) mogućih
promena izazvanih naredbama iz skupa
{INSERT, UPDATE i DELETE} pre nego
što se explicitno navede u telu okidača ta
ista naredba koja je aktivirala okidač.
Ako korisnik želi da izmeni jednu ili više naredbi u telu okidača (sql_naredbe [ ...n
]) ne mora da prvo briše postojeći okidač (naredbom DROP trigger
[ime_šeme.]ime_okidača) i nanovo kreira novi, već to može uraditi naredbom:
7
ON naziv_tabele
AFTER | INSTEAD OF
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [
DELETE ] }
AS {
sql_naredbe [ ...n ]
ON naziv_tabele
ON naziv_tabele
CREATE
[DEFINER = { db_korisnik |
CURRENT_USER }]
TRIGGER ime_okidača
vreme_okidanja
događaj_okidanja
8
ON naziv_tabele
U SUBP MySQL ažuriranje SQL naredbi koje pripadaju telu okidača nije moguće,
tako da se okidač mora prvo izbrisati naredbom DROP TRIGGER ime_okidača i ponovo
kreirati naredbom CREATE TRIGGER.
Isto tako jedan okidač se ne može aktivirati sa više događaja okidanja u istom
telu okidača, kao što je to slučaj kod MS SQL Servera gde se isti okidač može aktivirati
kada se sadržaj tabele ažurira bilo kojom od naredbi: INSERT, UPDATE ili DELETE.
Tada, za svaku naredbu koja ažurira tabelu moramo kreirati zaseban okidač sa potpuno
istim naredbama u telu okidača. Za ovaj SUBP ne postoje komande za eksplicitno de-
aktiviranje i nanovo aktiviranje okidača, mada uvek postoji „zaobilazni način“ (work-
around) da se to uradi.
9
Primena okidača
MS SQL:
kraj SMALLDATETIME,
) ;
10
MS SQL
FROM radnik;
11
Primer 3. Kreirati okidač trgInsRadnik koji će se aktivirati nakon ubacivanja
(INSERT) novog sloga u tabelu RADNIK tako što će ubaciti u tabelu
ISTORIJA_RMESTA odgovarajuće novo-unete vrednosti za polja idbr,
pocetak i posao
MS SQL:
AFTER INSERT
AS
BEGIN
FROM INSERTED
END
12
MS SQL
INSERTED
idbr Ime prezime posao Kvalif rukovodilac datzap premija Plata brod
3887 Milanka Crnogorac analitičar VSS NULL 25.06.2012 NULL 2000 NULL
13
5652 31.05.1980 NULL električar
… … … …
3) dodati novi slog čija je vrednost polja pocetak današnji datum, vrednost polja kraj
prazna (NULL) i vrednost polja posao jednaka novom poslu zaposlenog iz tabele
RADNIK.
Kako okidač treba da se aktivira nakon promene vrednosti u polju posao u tabeli
RADNIK, to ćemo kreirati AFTER UPDATE okidač nad tabelom RADNIK.
14
MS SQL:
AFTER UPDATE
AS
BEGIN
IF UPDATE(posao)
BEGIN
UPDATE istorija_rmesta
END
END
15
U navedenim primerima kreiranja okidača koji se izvršavaju nakon ažuriranja
(operacija UPDATE) slogova u tabeli RADNIK možemo primetiti da se naredbe
UPDATE i INSERT unutar tela okidača izvršavaju nakon provere da li se u tabeli
RADNIK menja vrednost u polju posao. U MS SQL serveru u telu okidača je postavljena
naredba IF UPDATE(posao) kojom se proverava da li je došlo do promene vrednosti u
polju posao. Ako jeste izvršavaju se UPDATE i INSERT naredbe koje se nalaze u telu
okidača;
Iz navedenih programskih kôdova može se isto tako videti da se promenljive
unutar tela okidača deklarišu nakon ključne reči BEGIN, kojom se započinje skup
naredbi u telu okidača, za MS SQL DECLARE. Za svaku promenljivu mora da se
navede tačno određeni tip podatakaTekući datum (datum koji se odnosi na tekući dan)
u različitim SUBP se različito dobija. U MS SQL se to radi preko funkcije GET_DATE(),
a u MySQL-u i Oracle-u preko sinonima CURRENT_DATE. MS SQL funkcija
GET_DATE() vraća ne samo tekući datum, već i tekuće vreme, pa je iz te vrednosti
potrebno odstraniti vremenski deo (tj. zadržati datumski deo) funkcijom
Convert(varchar(10), getdate(), 102) kojom se dobija datum u obliku YYYY.MM.DD
(2012.08.23). Naredbom REPLACE, u primeru, zamenjujemo tačku (.) crticom(-), pri
čemu dobijamo standardni datumski string: YYYY-MM-DD (2012-08-23).
Rezultat rada okidača kojeg smo kreirali možemo pratiti ako izvršimo SQL
komandu UPDATE nad tabelom RADNIK.
Primer 6. Zameniti posao u tabeli RADNIK vrednošću "šef smene" za zaposlenog
sa idbr=3887
MS SQL
DELETED
idbr ime prezime posao Kvalif rukovodilac datzap premija plata brod
16
3887 Milanka Crnogorac analitičar VSS NULL 25.06.2012 NULL 2000 NULL
INSERTED
idbr ime prezime posao Kvalif rukovodilac datzap premija plata brod
šef
3887 Milanka Crnogorac smene VSS NULL 25.06.2012 NULL 2000 NULL
Rezultat delovanja okidača koji se pokreće nakon izmene podatka (Update) nad
tabelom RADNIK vidi se u tabeli ISTORIJA_RMESTA. Masnim slovima su naglašene
promene – ažurirana vrednost u koloni kraj za posao „analitičar“ i ubačen novi red za
posao „šef smene“. Voditi računa da je autor knjige ovaj upit izvršio 23.08.2012, pa se
zato pojavljuje ovaj datum kao tekući.
SELECT * FROM istorija_rmesta
šef
3887 23.08.2012 NULL smene
MS SQL
17
Komandom iz prethodnog primera će se u tabeli RADNIK ažurirati 4 reda jer se
menja posao kod 4 zaposlena radnika.
U SUBP MS SQL server se formiraju samo dve tabele i okidač se izvršava
jednom. Tabele INSERTED i DELETED koje se formiraju tada date su na sledećoj slici.
DELETED
idbr ime prezime Posao Kvalif rukovodilac datzap premija plata brod
INSERTED
idbr ime prezime posao Kvalif rukovodilac datzap premija plata brod
18
i.idbr rukovo-
d.idbr ime prezime d.posao i.posao kvalif dilac datzap premija plata brod irm.idbr pocetak kraj irm.posao
5662 Janko Mančić upravnik načelnik VSS 6789 12.08.1993 NULL 2400 10 5662 12.08.1993 NULL upravnik
5780 Božidar Ristić upravnik načelnik VSS 6789 11.08.1984 NULL 2200 20 5780 11.08.1984 NULL upravnik
5786 Pavle Šotra upravnik načelnik VSS 6789 22.05.1983 NULL 2800 30 5786 22.05.1983 NULL upravnik
6789 Janko Simić upravnik načelnik VSS 5842 23.12.2003 10 3900 40 6789 23.12.2003 NULL upravnik
19
6789 23.08.2012 NULL načelnik
MS SQL:
Taj okidač će pri ubacivanju ili ažuriranju slogova u tabelu PLATE_STAVKE javiti
grešku u slučaju narušavanja ovog ograničenja.
20
MS SQL:
AS
BEGIN
IF EXISTS(
> 0)
END;
21
zaposlenom u toku jednog meseca u godini veća od zbira plate i premije iz tabele
RADNIK. Ako postoji bar jedan takav slog javlja se greška (naredbom RaisError).
MS SQL
(SELECT autoid FROM plate WHERE rbpl=2 and mesec=1 and godina=2012)
(r.plata +
isnull(r.premija,
0.00))
No column
idbr mesec godina name
22
Iz pokazane tabele se vidi da postoje redovi koji zadovoljavaju HAVING uslov, pa
okidač javlja poruku „Ukupni iznos plate i premije po radniku je veći od dozvoljenog
mesečnog limita“.
U okidaču trgPlataProveraStmt koji je okidač tipa „statement“ se nalaze sledeći
sadržaj tabele TEMP_PLATE_STAVKE nakon INSERT into temp_plate_stavke naredbe
kao što je to pokazano na sledećoj slici.
2 … 800 1 2012 …
2 … 800 1 2012 …
Kao što se iz tabele može videti (zamašćeni slogovi) postoje tri reda čiji je autoid
= -1 (lBrSlogova > 0) pa zbog toga okidač javlja grešku „Ukupni iznos plate i premije po
radniku je veći od dozvoljenog mesečnog limita“.
23
Transakcije
(Relacione baze podataka)
SQL iskazi
Сигурност и интегритет
Сигурност: заштита података од неауторизованих
корисника (заштита против неауторизованог
приступа, промене или уништења)
GRANT privilege_name
ON [ANY] object_type [object_name]
TO user_name
[WITH GRANT OPTION];
DCL
privilege_name
{ALL [PRIVILEGES] | privilege-list}
REVOKE