You are on page 1of 34

NOVOSADSKA POSLOVNA KOLA

SEMINARSKI RAD
iz predmeta

SISTEMI ZA UPRAVLJANJE BAZAMA


PODATAKA
Tema:

BAZA PODATAKA IS RTV


-ARHIVA AUDIO MATERIJALA-

Student:

Profesor:

Asurdi Danica

Lukovi dr Ivan

Smer: informatika
Indeks: 1322/06

Novi Sad, 15.06.2007.


1

UVOD
Projekat Baza podataka IS RTV sektor arhiva audio materijala sadri
informacione zahteve i pravila poslovanja predstavljenih i kroz odgovarajuu ER
emu baze podataka studije sluaja, prevod ER eme u relacioni model, na
osnovu kojeg su kreirane tabele sa atributima i ogranienjima.
Trigeri, funkcije i procedure dodavani su postupno, a raeni su u skladu
sa pravilima poslovanja i u cilju obezbeenja konzistentnosti baze.
Baza podataka je testirana na Oracle 10g XE prikaz SQL script-ova za
kreiranje SQL opisa eme baze podataka nalazi se u nastavku ove tampane
forme, kao i na priloenom CD-u u elektronskom obliku.
Odgovor na zahteve korisnika prikazan je kroz nekoliko SQL upita i
pogleda. U napomenama su navedeni neki delovi koje sam odradila na vie
razliitih naina.
U obliku SQL skripta nalaze se i primeri koji testiraju rad trigera,
procedura i funkcija, za svaki posebno. Punjenje pojedinih tabela raeno je uz
korienje sekvencera. Ubaen je i skript za brisanje objekata, sekvencera i
tabela.
Idejno reenje daljeg proirenja baze opisano je na kraju ovog projekta.

Specifikacija studije sluaja, analiza


informacionih zahteva korisnika
Potrebno je projektovati bazu podataka za Radio Televiziju, sektor Arhiva
audio materijala.
Za audio materijal se vodi:
1. ifra audio materijala #
2. Naziv albuma
3. Godina albuma
4. Tip nosaa zvuka na kojem se nalazi
5. Izdavaka kua
6. Broj pesama (Track number)
7. i dostupan (ako je izdat, 0, ako je u arhivi, 1)
Za tip materijala imamo:
1. ifru materijala #
2. Naziv (CD, LP, 12'', 7'', kaseta...)
Za izvoaa se vodi:
1. ifra izvoaa #
2. Naziv izvoaa
Za izdavaku kuu:
1. ifra izdavake kue #
2. Naziv izdavake kue
3. Oznaka drave poto je mogue da se pod istim nazivom izdava pojavi i
u nekoj drugoj zemlji
Drava:
1. Oznaka drave #
2. Naziv drave
Zavode se i pesme radi lake pretrage materijala:
1. SongID #
2. Naziv pesme
3. Izvoa (ifra)

4. Verzija original e biti default, a unosi se ako je koncertna verzija, remix,


itd.
5. Trajanje hh:mm:ss (pesma moe trajati vie asova ako je miks u pitanju,
npr. Novogodinji program se snima unapred i puta kao 1 track u
trajanju od 12 asova ovo je ve deo baze prilagoen Sopstvenoj
Produkciji koja bi se takoe nalazila u Arhivi, ali nije obuhvaena ovim
projektom).

Vodi se i evidencija o izdavanju arhivskog materijala ovlaenim radnicima,


nazvaemo ih Tonci (tonski tehniar). Izdavanje vri magacioner.
Tonci su evidentirani po:
1. MBT # - matini broj tonskog tehniara
2. Prezime
3. Ime
4. Sektor (Radio, Marketing, Montaa, Produkcija, Komercijala, Uprava...)
5. Tereenje (izraeno u broju komada audio materijala koji su izneli default 0)
Za magacionera, vodi se:
1. MBM # - matini broj magacionera
2. Prezime
3. Ime
4. Sektor (Arhiva)
5. SQL sertifikat moraju posedovati da bi radili u arhivi.
Radi smanjenja papirologije, ne vri se tampanje dokumenta o izdavanju.
Svaki izdati audio materijal vodi se posebno u evidenciji Reversa:
1. RBR # - Redni broj reversa
2. Primio Matini broj tonca
3. Izdao Matini broj magacionera
4. ifra audio materijala koji je izdat
5. Datum izdavanja
6. Datum povratka ovde se upisuje vrednost tek kad se materijal vrati.

PRAVILA POSLOVANJA
Prilikom izdavanja dostupnost u tabeli audio materijala se umanjuje za 1, a
uveava se tereenje radnika koji je materijal izneo.
Radnik moe izneti najvie 5 materijala.
Radnik ne mora u istom danu da vrati sve to je izneo.
Zabranjeno je izdavanje materijala radniku koji nije za to ovlaen (ne radi u
sektoru RADIO) i izdavanje od strane radnika koji ne radi u sektoru ARHIVA.
U trenutku vraanja, zavodi se datum povratka, dostupnost vraenog
materijala se uveava za 1, a tereenje radnika umanjuje za svaki vraeni
materijal 1.
Kod evidencije audio materijala, album mora imati bar 1 pesmu (Track
number>0).
Naziv izvoaa (ifra) se popunjava za svaku pesmu posebno. Jedna pesma
moe se nai na vie razliitih nosaa zvuka (npr. isti album na CD-u, LP-u i
kaseti).
Kod brisanja audio materijala dozvoliti brisanje jedino ako ne postoji u
evidenciji reversa, i obrisati pesme koje sadri ako nijedan drugi audio materijal
ne obuhvata iste.
Izvoa moe biti obrisan ako nema nijednu pesmu u arhivi.
Izdavaka kua moe biti obrisana ako nema nijednog albuma u arhivi.
Veina ovih ogranienja realizuje se automatski definicijom primarnih i stranih
kljueva.

Drava i Radnik pretpostavljamo da su ovo tabele kojima bi se koristili i


ostali sektori u RTV, pa je Arhivi zabranjeno brisanje.
Isto tako nije dozvoljeno brisati evidenciju o izdavanju materijala (Revers),
kao i da se prilikom updatea Reversa izmeni bilo koji podatak osim datuma
povratka.

INFORMACIONI ZAHTEVI KORISNIKA

Omoguiti pretragu po nazivu pesme gde je rezultat pretrage:


1.
2.
3.
4.
5.
6.
7.
8.
9.

pun naziv pesme


verzija
trajanje
naziv izvoaa
naziv albuma
godina izdanja
ifra audio materijala
tip (naziv)
dostupnost

Za traenog izvoaa - na osnovu njegove ifre - omoguiti ispis:


1.
2.
3.
4.

ifre audio materijala


naziv tipa audio materijala
naziv svih albuma i
godinu.

Omoguiti ispis svih trenutno izdatih audio materijala (VIEW), sa


kolonama:
1.
2.
3.
4.
5.

ifra audio materijala


Tip (naziv)
Naziv albuma
Prezime i ime radnika koji se tereti
Datum izdavanja

ER ema u prilogu

ER ema baze podataka studije sluaja


Drzava (sifdrz, drz)
Iz (sifdrz, sifik)
Izd_kuca (sifik, nazivik)
Objavila (sifik, sifam)
Tip (siftipa, tipime)
Ima (siftipa, sifam)
Audio_m (sifam, album, godina, trackno, dostupan)
Izvodjac (sifizv, artist)
Pesma (songID, title, vers, time)
Peva (songID, sifizv)
Sadrzi (sifam, songID)
Revers (RBR, datizd, datpov)
Izdat (sifam, RBR)
Tonac (MBT, zaduzen)
Magacioner (MBM, SQLsert)
Primio (MBT, RBR)
Izdao (MBM, RBR)
Radnik (MBR, prez, ime, sektor)

ema relacione baze podataka


Drzava ({sifdrz, drz}{ sifdrz})
Null (Drzava, siftipa) =
Izd_kuca({sifik, nazivk, sifdrz}{sifik})
Izd_kuca [sifdrz] Drzava [sifdrz]
Null (Izdav_kuca, sifik) =
Null (Izdav_kuca, sifdrz) =
Tip ({siftipa, vrsta}{siftipa})
Null (Tip, siftipa) =
Audio_m ({sifam, siftipa, sifik, album, godina, trackno, dostupan}{sifam})
Audio_m [siftipa] Tip [siftipa]
Audio_m [sifik] Izd_kuca [sifik]
Audio_m [trackno] > 0
Null (Audio_m, sifam) =
Null (Audio_m, siftipa) =
Null (Audio_m, sifik) =

Izvodjac({sifizv, artist}{sifizv})
Null (Izvodjac, sifizv) =
Pesma ({songID, sifizv, title, vers, time}{songID})
Pesma [sifizv] Izvodjac [sifizv]
Null (Pesma, songID) =
Null (Pesma, sifizv) =
Sadrzi ({sifam, songID}{ sifam+songID })
Sadrzi [sifam] Audio_m [sifam]
Sadrzi [songID] Pesma [songID]
Audio_m [sifam] Sadrzi [sifam]
Null (Sadrzi, songID) =
Null (Sadrzi, sifam) =
Radnik ({MBR, prez, ime, sektor}{MBR})
Null (Radnik, MBR)=
Tonac ({MBT, prez, ime, sektor, zaduzen}{MBT})
Null (Tonac, MBT)=
Tonac [MBT] Radnik [MBR]
Magacioner ({MBM, prez, ime, sektor, SQLsert}{MBM})
Null (Magacioner, MBM)=
Magacioner [MBM] Radnik [MBR]
Revers ({RBR, primio, izdao, sifam, datizd, datpov}{RBR})
Null (Revers, RBR)=
Revers [primio] Tonac [MBT]
Null (Revers, primio)=
Revers [izdao] Magacioner [MBM]
Null (Revers, izdao)=
Revers [sifam] Audio_m [sifam]
Null (Revers, sifam)=

SQL opis eme baze podataka


Tip ({siftipa, vrsta}{siftipa})
Null (Tip, siftipa) =
CREATE TABLE TIP
(siftipa NUMBER(1) NOT NULL
CONSTRAINT pk1
PRIMARY KEY,
vrsta VARCHAR2(20) NOT NULL,
CONSTRAINT sif_tipa
CHECK ((siftipa > 0 AND siftipa < 5))
);
INSERT INTO TIP
VALUES (1, 'CD');
INSERT INTO TIP
VALUES (2, 'LP');

Drzava ({sifdrz, drz}{sifdrz})


Null (Drzava, sifdrz) =
CREATE TABLE Drzava
(sifdrz NUMBER (2) NOT NULL
CONSTRAINT pk2
PRIMARY KEY,
drz VARCHAR2 (40) NOT NULL,
CONSTRAINT sif_drz
CHECK ((sifdrz>9 AND sifdrz<21))
);
INSERT INTO Drzava
VALUES (10, 'SRBIJA');
INSERT INTO Drzava
VALUES (11, 'ENGLESKA');
INSERT INTO Drzava
VALUES (12, 'USA');

10

Izd_kuca({sifik, nazivk, sifdrz}{sifik})


Null (Izdav_kuca, sifik) =
Null (Izdav_kuca, sifdrz) =
Izd_kuca [sifdrz] Drzava [sifdrz]

CREATE TABLE Izd_kuca


(sifik NUMBER(2) NOT NULL
CONSTRAINT pk3
PRIMARY KEY,
nazivik VARCHAR2(40) NOT NULL,
sifdrz NUMBER(2) DEFAULT 10 NOT NULL,
CONSTRAINT fk1
FOREIGN KEY(sifdrz)
REFERENCES Drzava (sifdrz),
CONSTRAINT sif_ik
CHECK ((sifik>20 AND sifik<30))
);
INSERT INTO Izd_kuca (sifik, nazivik)
VALUES (21, 'CITY RECORDS');
INSERT INTO Izd_kuca (sifik, nazivik)
VALUES (22, 'PGP RTB');
INSERT INTO Izd_kuca (sifik, nazivik)
VALUES (23, 'B92');
INSERT INTO Izd_kuca
VALUES (24, 'CBS', 11);

Izvodjac({sifizv, artist}{sifizv})
Null (Izvodjac, sifizv) =
CREATE TABLE Izvodjac
(sifizv NUMBER(2) NOT NULL
CONSTRAINT pk4
PRIMARY KEY,
artist VARCHAR2(40) NOT NULL);

CREATE SEQUENCE kljuc_izv

11

START WITH 1
MAXVALUE 99
NOCYCLE;
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Djordje Balasevic');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Rambo Amadeus');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Lepa Brena');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Elvis Presley');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Tina Turner');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Beatles');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Tom Jones');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Ultravox');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Billy Idol');
INSERT INTO Izvodjac
VALUES (kljuc_izv.NEXTVAL, 'Dire Straits');

Radnik ({MBR, prez, ime, sektor}{MBR})


Null (Radnik, MBR)=
Tonac ({MBT, prez, ime, sektor, zaduzen}{MBT})
Null (Tonac, MBT)=
Tonac [MBT] Radnik [MBR]
Magacioner ({MBM, prez, ime, sektor, SQLsert}{MBM})

12

Null (Magacioner, MBM)=


Magacioner [MBM] Radnik [MBR]
*NAPOMENA: Kreiramo 1 tabelu Radnik u koju prelaze obeleja Magacionera i
Tonca:
CREATE TABLE Radnik
(MBR NUMBER(4) NOT NULL
CONSTRAINT pk5
PRIMARY KEY,
prez VARCHAR2(30) NOT NULL,
ime VARCHAR(20) NOT NULL,
sektor VARCHAR2(20) DEFAULT 'Radio',
zaduzen NUMBER(1) DEFAULT 0,
SQLsert CHAR(1) DEFAULT 'F'
);
CREATE SEQUENCE kljuc_radnika
START WITH 1000
MAXVALUE 1050
NOCYCLE;
INSERT INTO Radnik (MBR, prez, ime)
VALUES (kljuc_radnika.NEXTVAL, 'Milic', 'Koja');
INSERT INTO Radnik (MBR, prez, ime)
VALUES (kljuc_radnika.NEXTVAL, 'Peric', 'Boza');
INSERT INTO Radnik (MBR, prez, ime)
VALUES (kljuc_radnika.NEXTVAL, 'Vasic', 'Dara');
INSERT INTO Radnik (MBR, prez, ime, sektor)
VALUES (kljuc_radnika.NEXTVAL, 'Jovin', 'Ana', 'Montaza');

INSERT INTO Radnik


VALUES (kljuc_radnika.NEXTVAL, 'Savic', 'Nena', 'Arhiva', 0, 'T');
INSERT INTO Radnik
VALUES (kljuc_radnika.NEXTVAL, 'Arsic', 'Steva', 'Arhiva', 0, 'T');
INSERT INTO Radnik (MBR, prez, ime, sektor)
VALUES (kljuc_radnika.NEXTVAL, 'Bozic', 'Pera', 'Uprava');

13

Audio_m ({sifam, siftipa, sifik, album, godina, trackno, dostupan}{sifam})


Audio_m [siftipa] Tip [siftipa]
Audio_m [sifik] Izd_kuca [sifik]
Audio_m [trackno]>0
Null (Audio_m, sifam) =
Null (Audio_m, siftipa) =
Null (Audio_m, sifik) =
CREATE TABLE AUDIO_M
(sifam NUMBER(4) NOT NULL
CONSTRAINT pk6
PRIMARY KEY,
siftipa NUMBER(1) DEFAULT 1 NOT NULL,
sifik NUMBER(2) NOT NULL,
album VARCHAR2(40) NOT NULL,
godina NUMBER(4),
trackno NUMBER(2),
dostupan NUMBER(1) DEFAULT 1 NOT NULL,
CONSTRAINT fk2
FOREIGN KEY(siftipa)
REFERENCES Tip (siftipa),
CONSTRAINT fk3
FOREIGN KEY(sifik)
REFERENCES Izd_kuca (sifik),
CONSTRAINT bar_1
CHECK (trackno>0)
);
CREATE SEQUENCE kljuc_am
START WITH 2000
MAXVALUE 3000
NOCYCLE;

*NAPOMENA: Procedura koja bi vrila unos audio materijala tipa CD:


CREATE OR REPLACE PROCEDURE unos_audiocd
(sam IN Audio_m.sifam%TYPE,
sik IN Audio_m.sifik%TYPE,
alb IN Audio_m.album%TYPE,
god IN Audio_m.godina%TYPE,

14

tr IN Audio_m.trackno%TYPE)
IS
BEGIN
INSERT INTO Audio_m (sifam, sifik, album, godina, trackno)
VALUES (sam, sik, alb, god, tr);
END unos_audiocd;
/
*NAPOMENA: Procedura koja bi vrila unos audio materijala tipa LP:
CREATE OR REPLACE PROCEDURE unos_audiolp
(sam IN Audio_m.sifam%TYPE,
st IN Audio_m. siftipa %TYPE,
sik IN Audio_m.sifik%TYPE,
alb IN Audio_m.album%TYPE,
god IN Audio_m.godina%TYPE,
tr IN Audio_m.trackno%TYPE)
IS
BEGIN
INSERT INTO Audio_m (sifam, siftipa, sifik, album, godina, trackno)
VALUES (sam, st, sik, alb, god, tr);
END unos_audiolp;
/

EXECUTE
EXECUTE
EXECUTE
EXECUTE

unos_audiocd(kljuc_am.NEXTVAL, 22, 'Bezdan', 1986, 3);


unos_audiocd(kljuc_am.NEXTVAL, 23, 'Oprem dobro', 2005, 4);
unos_audiocd(kljuc_am.NEXTVAL, 21, 'Hitovi', 2006, 2);
unos_audiocd(kljuc_am.NEXTVAL, 24, 'Rock Evergreen', 1990,

6);
EXECUTE unos_audiolp(kljuc_am.NEXTVAL, 2, 24, 'Rock Evergreen', 1990,
6);
EXECUTE unos_audiolp(kljuc_am.NEXTVAL, 2, 22, 'Bezdan', 1986, 3);

*Unos Audio_m sam uradila ovako:


INSERT INTO AUDIO_M (sifam, sifik, album, godina, trackno)
VALUES (kljuc_am.NEXTVAL, 22, 'Bezdan', 1986, 3);
INSERT INTO AUDIO_M (sifam, sifik, album, godina, trackno)
VALUES (kljuc_am.NEXTVAL, 23, 'Oprem dobro', 2005, 4);

15

INSERT INTO AUDIO_M (sifam, sifik, album, godina, trackno)


VALUES (kljuc_am.NEXTVAL, 21, 'Hitovi', 2006, 2);
INSERT INTO AUDIO_M (sifam, sifik, album, godina, trackno)
VALUES (kljuc_am.NEXTVAL, 24, 'Rock Evergreen', 1990, 6);
INSERT INTO AUDIO_M (sifam, siftipa, sifik, album, godina, trackno)
VALUES (kljuc_am.NEXTVAL, 2, 24, 'Rock Evergreen', 1990, 6);
INSERT INTO AUDIO_M (sifam, siftipa, sifik, album, godina, trackno)
VALUES (kljuc_am.NEXTVAL, 2, 22, 'Bezdan', 1986, 3);

Pesma ({songID, sifizv, title, vers, time}{songID})


Pesma [sifizv] Izvodjac [sifizv]
Null (Pesma, songID) =
Null (Pesma, sifizv) =
CREATE TABLE Pesma
(songID NUMBER(3) NOT NULL
CONSTRAINT pk7
PRIMARY KEY,
sifizv NUMBER(2) NOT NULL,
title VARCHAR2(40) NOT NULL,
vers VARCHAR2(40) DEFAULT 'ORIGINAL',
time VARCHAR2 (8) DEFAULT 'mm:ss',
CONSTRAINT fk4
FOREIGN KEY(sifizv)
REFERENCES Izvodjac (sifizv)
);
CREATE SEQUENCE song
START WITH 100
MAXVALUE 999
NOCYCLE;
INSERT INTO Pesma
VALUES (song.NEXTVAL, 4, 'Fever', 'Remix', '3:33');
INSERT INTO PESMA
VALUES (song.NEXTVAL, 6, 'Michelle', 'Instrumental', '2:50');
INSERT INTO PESMA
VALUES (song.NEXTVAL, 8, 'Dancing With Tears in my Eyes', 'Remix', '5:20');

16

INSERT INTO PESMA


VALUES (song.NEXTVAL, 9, 'Eyes Without a Face', 'Extended', '6:45');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 10, 'So far Away', '5:20');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 5, 'River Deep Mountain High', '3:28');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 1, 'Slow Motion', '3:41');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 1, 'Stari laloski vals', '3:41');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 1, 'Ne lomite mi bagrenje', '3:41');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 2, 'Demode', '3:41');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 2, 'Letnji hit', '3:41');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 2, 'Plastik Fantastik', '3:41');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 2, 'Zene', '3:41');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 3, 'Golube', '3:41');
INSERT INTO PESMA (songID, sifizv, title, time)
VALUES (song.NEXTVAL, 3, 'Sanjam', '3:41');

Sadrzi ({sifam, songID}{ sifam+songID })


Sadrzi [sifam] Audio_m [sifam]
Sadrzi [songID] Pesma [songID]
Audio_m [sifam] Sadrzi [sifam]
Null (Sadrzi, songID) =
Null (Sadrzi, sifam) =
CREATE TABLE Sadrzi
(sifam NUMBER(4) NOT NULL,
songID NUMBER(6) NOT NULL,
17

CONSTRAINT pk8
PRIMARY KEY (sifam,songID),
CONSTRAINT fk5
FOREIGN KEY(sifam)
REFERENCES Audio_m(sifam)
ON DELETE CASCADE,
CONSTRAINT fk6
FOREIGN KEY(songID)
REFERENCES Pesma(songID)
);

INSERT INTO Sadrzi


VALUES (2000, 106);
INSERT INTO Sadrzi
VALUES (2000, 107);
INSERT INTO Sadrzi
VALUES (2000, 108);

INSERT INTO Sadrzi


VALUES (2001, 109);
INSERT INTO Sadrzi
VALUES (2001, 110);
INSERT INTO Sadrzi
VALUES (2001, 111);
INSERT INTO Sadrzi
VALUES (2001, 112);
INSERT INTO Sadrzi
VALUES (2002, 113);
INSERT INTO Sadrzi
VALUES (2002, 114);

INSERT INTO Sadrzi


VALUES (2003, 100);
INSERT INTO Sadrzi
VALUES (2003, 101);
18

INSERT INTO Sadrzi


VALUES (2003, 102);
INSERT INTO Sadrzi
VALUES (2003, 103);
INSERT INTO Sadrzi
VALUES (2003, 104);
INSERT INTO Sadrzi
VALUES (2003, 105);

INSERT INTO Sadrzi


VALUES (2004, 100);
INSERT INTO Sadrzi
VALUES (2004, 101);
INSERT INTO Sadrzi
VALUES (2004, 102);
INSERT INTO Sadrzi
VALUES (2004, 103);
INSERT INTO Sadrzi
VALUES (2004, 104);
INSERT INTO Sadrzi
VALUES (2004, 105);

INSERT INTO Sadrzi


VALUES (2005, 106);
INSERT INTO Sadrzi
VALUES (2005, 107);
INSERT INTO Sadrzi
VALUES (2005, 108);

Revers ({RBR, primio, izdao, sifam, datizd, datpov}{RBR})


Null (Revers, RBR)=
Revers [primio] Tonac [MBT]
Null (Revers, primio)=

19

Revers [izdao] Magacioner [MBM]


Null (Revers, izdao)=
Revers [sifam] Audio_m [sifam]
Null (Revers, sifam)=
CREATE TABLE Revers (
RBR NUMBER(3) NOT NULL
CONSTRAINT pk9
PRIMARY KEY,
Sifam NUMBER(4) NOT NULL,
primio NUMBER(4) NOT NULL,
izdao NUMBER(4) NOT NULL,
datizd DATE DEFAULT SYSDATE NOT NULL,
datpov DATE DEFAULT NULL,
CONSTRAINT fk7
FOREIGN KEY(primio)
REFERENCES radnik(MBR),
CONSTRAINT fk8
FOREIGN KEY(izdao)
REFERENCES radnik(MBR),
CONSTRAINT fk9
FOREIGN KEY(sifam)
REFERENCES Audio_m(sifam),
CONSTRAINT provera_izdavanja
CHECK(primio<>izdao)
);
CREATE SEQUENCE rev
START WITH 1
MAXVALUE 999
NOCYCLE;

REENJE KORISNIKIH ZAHTEVA


Za traenog izvoaa - na osnovu njegove ifre - omoguiti ispis:
1. ifre audio materijala
2. naziv tipa audio materijala
3. ime izvoaa
4. naziv albuma i
5. pesmu.
SELECT am.sifam SIFRA, VRSTA, iz.artist IZVODJAC, ALBUM, title PESMA
20

FROM Audio_m am, Tip, Izvodjac iz, Pesma p, Sadrzi s


WHERE p.sifizv=2
AND p.sifizv=iz.sifizv
AND p.songID=s.songID
AND s.sifam=am.sifam
AND am.siftipa=tip.siftipa;

Omoguiti pretragu po nazivu pesme gde je rezultat pretrage:


1. pun naziv pesme
2. verzija
3. trajanje
4. naziv izvoaa
5. naziv albuma
6. godina izdanja
7. ifra audio materijala
8. tip (naziv)
9. dostupnost

SELECT title PESMA, vers VERZIJA, TIME, artist IZVODJAC, ALBUM, GODINA,
am.sifam SIFRA, VRSTA, DOSTUPAN
FROM Pesma p, Izvodjac iz, Audio_m am, Tip, Sadrzi s
WHERE UPPER(p.title)= 'STARI LALOSKI VALS'
AND p.songID=s.songID
AND s.sifam=am.sifam
AND am.siftipa=tip.siftipa
AND p.sifizv=iz.sifizv;

*NAPOMENA: Ovo je drugi nain funkcija koja vraa ifru traene pesme:
CREATE OR REPLACE FUNCTION nadji_pesmu (ulaz VARCHAR2)
RETURN NUMBER
IS
izlaz NUMBER(3);
BEGIN
SELECT songID
INTO izlaz
FROM Pesma
WHERE Title=ulaz;

21

RETURN izlaz;
END nadji_pesmu;
/
BEGIN
dbms_output.put_line('Trazena pesma ima sifru '||(nadji_pesmu('Zene')));
END;
/

Upotreba funkcije u okviru SELECT upita:

SELECT title PESMA, vers VERZIJA, TIME, artist IZVODJAC, ALBUM, GODINA,
am.sifam SIFRA, VRSTA, DOSTUPAN
FROM Pesma p, Izvodjac iz, Audio_m am, Tip, Sadrzi s
WHERE p.songID=(nadji_pesmu('Zene'))
AND p.songID=s.songID
AND s.sifam=am.sifam
AND am.siftipa=tip.siftipa
AND p.sifizv=iz.sifizv;

OBEZBEENJE PRIMENE PRAVILA POSLOVANJA


Prilikom izdavanja dostupnost u tabeli audio materijala se umanjuje za 1,
a uveava se tereenje radnika koji je materijal izneo.
Radnik moe izneti najvie 5 materijala.
Radnik ne mora u istom danu da vrati sve to je izneo.
U trenutku vraanja, zavodi se datum povratka, dostupnost vraenog
materijala se uveava za 1, a tereenje radnika umanjuje za svaki vraeni
materijal 1.

Funkcija koja dodaje 1 na uneti broj i vraa uveanu vrednost:

22

CREATE OR REPLACE FUNCTION dodaj1(ulaz NUMBER)


RETURN NUMBER
IS
BEGIN
RETURN ulaz+1;
END dodaj1;
/
Funkcija koja umanjuje uneti broj za 1 i vraa umanjenu vrednost:
CREATE OR REPLACE FUNCTION umanji1 (ulaz NUMBER)
RETURN NUMBER
IS
BEGIN
RETURN ulaz-1;
END umanji1;
/
Okida koji ne dozvoljava da se radniku izda vie od 5 materijala:
CREATE OR REPLACE TRIGGER dosta5
BEFORE UPDATE OF zaduzen ON Radnik
FOR EACH ROW
BEGIN
IF :NEW.zaduzen>5 THEN
RAISE_APPLICATION_ERROR (-20500, 'Nije dozvoljeno uzeti vise od 5
materijala!');
END IF;
END dosta5;
/
Okida koji javlja greku ako se unosi materijal koji je ve izdat:
CREATE OR REPLACE TRIGGER nema_am
BEFORE UPDATE OF dostupan ON Audio_m
FOR EACH ROW
BEGIN
IF :NEW.dostupan<0 THEN
RAISE_APPLICATION_ERROR (-20501, 'Materijal je vec izdat!');
END IF;
END nema_am;
/

23

Okida koji javlja greku ako se unosi radnik koji nije zaduen:
CREATE OR REPLACE TRIGGER razduzen
BEFORE UPDATE OF zaduzen ON Radnik
FOR EACH ROW
BEGIN
IF :NEW.zaduzen<0 THEN
RAISE_APPLICATION_ERROR (-20502, 'Ovaj radnik ne duguje materijal!');
END IF;
END razduzen;
*NAPOMENA: kasnije se uvodi okida koji ne dozvoljava izmenu ifre radnika
koji je izneo materijal, kako ne bi dolazilo do (zlo)namernih ili sluajnih prepravki
u evidenciji.

Okida koji uz poziv funkcije zaduuje radnika:


CREATE OR REPLACE TRIGGER zaduzi_radnika
BEFORE INSERT ON Revers
FOR EACH ROW
BEGIN
UPDATE Radnik
SET zaduzen=(dodaj1(zaduzen))
WHERE MBR=:NEW.primio;
END zaduzi_radnika;
/

Okida koji uz poziv funkcije umanjuje materijal:


CREATE OR REPLACE TRIGGER umanji_materijal
BEFORE INSERT ON Revers
FOR EACH ROW
BEGIN
UPDATE Audio_m
SET dostupan= (umanji1(dostupan))
WHERE sifam=:NEW.sifam;
END umanji_materijal;
/

24

Okida koji uz poziv funkcije razduuje radnika:


CREATE OR REPLACE TRIGGER razduzi_radnika
AFTER UPDATE OF datpov ON Revers
FOR EACH ROW
BEGIN
UPDATE Radnik
SET zaduzen=(umanji1(zaduzen))
WHERE MBR=:NEW.primio;
END razduzi_radnika;
/

Okida koji uz poziv funkcije vraa dostupnost materijala:


CREATE OR REPLACE TRIGGER vrati_materijal
AFTER UPDATE OF datpov ON Revers
FOR EACH ROW
BEGIN
UPDATE Audio_m
SET dostupan=(dodaj1(dostupan))
WHERE sifam=:NEW.sifam;
END vrati_materijal;
/

Punimo tabelu Revers:


INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2000,1000,1005);
INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2001,1000,1005);
INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2002,1000,1005);
INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2003,1000,1004);

25

INSERT INTO Revers (RBR, sifam, primio, izdao)


VALUES(rev.NEXTVAL,2004,1000,1004);

Testiranje okidaa za zaduenje radnika i


umanjivanje dostupnog materijala
SELECT * FROM RADNIK;
SELECT * FROM AUDIO_M;
SELECT * FROM REVERS;

Testiranje okidaa koji ne dozvoljava da 1 radnik iznese vie od 5


materijala:
INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2005,1000,1005);

Testiranje okidaa koji javlja da je materijal ve izdat:


INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2000,1001,1004);

Testiranje okidaa koji razduuje radnika pri povraaju materijala:


UPDATE REVERS SET datpov=SYSDATE WHERE RBR=1;

Okidai zabrane brisanja/izmene podataka u tabelama.


Drava i Radnik pretpostavljamo da su ovo tabele kojima bi se koristili i
ostali sektori u RTV, pa je Arhivi zabranjeno brisanje. Isto tako nije dozvoljeno
brisati evidenciju o izdavanju materijala (Revers).

Okida koji zabranjuje brisanje drave:


CREATE OR REPLACE TRIGGER nema_brisanja_drzave
BEFORE DELETE ON Drzava

26

FOR EACH ROW


BEGIN
IF DELETING THEN
RAISE_APPLICATION_ERROR (-20504, 'Ne sme se brisati drzava!');
END IF;
END nema_brisanja_drzave;
/
Testiranje:
DELETE FROM Drzava WHERE sifdrz=10
/

Okida koji zabranjuje brisanje radnika:


CREATE OR REPLACE TRIGGER nema_brisanja_radnika
BEFORE DELETE ON Radnik
FOR EACH ROW
BEGIN
IF DELETING THEN
RAISE_APPLICATION_ERROR (-20505, 'Ne sme se brisati radnik!');
END IF;
END nema_brisanja_radnika;
/
Testiranje:
DELETE FROM Radnik WHERE MBR=1000
/

Okida koji zabranjuje brisanje evidencije reversa:


CREATE OR REPLACE TRIGGER nema_brisanja_evidencije
BEFORE DELETE ON Revers
FOR EACH ROW
BEGIN
IF DELETING THEN
RAISE_APPLICATION_ERROR (-20506, 'Ne sme se brisati evidencija!');
END IF;
END nema_brisanja_evidencije;
/

27

Testiranje:
DELETE FROM Revers WHERE RBR=3
/

Ono to bi mogli ograniiti okidaima jeste izdavanje materijala radniku koji


nije za to ovlaen (ne radi u sektoru RADIO) i izdavanje od strane radnika koji
ne radi u sektoru ARHIVA.
Funkcija koja na osnovu unetog MBR vraa sektor u kojem je radnik:
CREATE OR REPLACE FUNCTION vrati_sektor (ulaz NUMBER)
RETURN VARCHAR2
IS
izlaz VARCHAR2(20);
BEGIN
SELECT sektor
INTO izlaz
FROM Radnik
WHERE MBR=ulaz;
RETURN izlaz;
END vrati_sektor;

Okida koji poziva funkciju provere sektora i ne dozvoljava izdavanje


materijala neovlaenim radnicima:
CREATE OR REPLACE TRIGGER ovlascen_radnik
BEFORE INSERT ON Revers
FOR EACH ROW
BEGIN
IF ((vrati_sektor(:NEW.primio))<>'Radio') THEN
RAISE_APPLICATION_ERROR (-20507, 'Ovaj radnik nije ovlascen da
uzima materijal!');
END IF;
END ovlascen_radnik;
/
Provera trigera:
INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2005,1003,1004);

28

Okida koji poziva funkciju provere sektora i sprecava da se umesto


radnika arhive unese ifra nekog drugog radnika:
CREATE OR REPLACE TRIGGER ovlascen_arhivar
BEFORE INSERT ON Revers
FOR EACH ROW
BEGIN
IF ((vrati_sektor(:NEW.izdao))<>'Arhiva') THEN
RAISE_APPLICATION_ERROR (-20508, 'Ovaj radnik nije ovlascen da izdaje
materijal!');
END IF;
END ovlascen_arhivar;
/
Provera trigera:
INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2005,1000,1001);

I na kraju, okida koji e zabraniti da se prilikom updatea Reversa


izmeni bilo koji podatak osim datuma povratka:
CREATE OR REPLACE TRIGGER zastita_evidencije
BEFORE UPDATE OF sifam, primio, izdao, datizd ON Revers
FOR EACH ROW
BEGIN
IF UPDATING THEN
RAISE_APPLICATION_ERROR (-20509, 'Ova izmena nije dozvoljena!');
END IF;
END zastita_evidencije;
/

Provera trigera:
UPDATE Revers
SET sifam=2000
WHERE RBR=3;

29

UPDATE Revers
SET datpov=SYSDATE
WHERE RBR=3;

KREIRANJE POGLEDA
Omoguiti ispis svih trenutno izdatih audio materijala (VIEW), sa kolonama:
1.
2.
3.
4.
5.

ifra audio materijala


Tip (naziv)
Naziv albuma
Prezime i ime radnika koji se tereti
Datum izdavanja

CREATE VIEW izdati_am (sifra, vrsta, album, izneo, dana)


AS SELECT r.sifam, vrsta, album, t.prez ||' '||t.ime, datizd
FROM Audio_m am, Tip, Revers r, Radnik t
WHERE r.datpov IS NULL AND
r.sifam=am.sifam AND
am.siftipa=Tip.siftipa AND
r.primio=t.MBR;

LISTANJE KODA

SELECT object_name
FROM user_objects
WHERE object_type = 'FUNCTION'
/
SELECT object_name
FROM user_objects
WHERE object_type = 'PROCEDURE'
/
SELECT object_name
FROM user_objects

30

WHERE object_type = 'TRIGGER'


/

BRISANJE OBJEKATA, TABELA I SEKVENCERA

DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP

TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER

nema_brisanja_drzave;
nema_brisanja_ik;
nema_brisanja_evidencije;
nema_brisanja_radnika;
ovlascen_radnik;
ovlascen_arhivar;
dosta5;
nema_am;
razduzen;
razduzi_radnika;
zaduzi_radnika;
umanji_materijal;
vrati_materijal;
zastita_evidencije;

DROP PROCEDURE unos_audiocd;


DROP PROCEDURE unos_audiolp;
DROP
DROP
DROP
DROP

FUNCTION
FUNCTION
FUNCTION
FUNCTION

dodaj1;
umanji1;
vrati_sektor;
nadji_pesmu;

DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP

VIEW izdati_am;
TABLE REVERS;
TABLE SADRZI;
TABLE PESMA;
TABLE IZVODJAC;
TABLE AUDIO_M;
TABLE TIP;
TABLE IZD_KUCA;
TABLE DRZAVA;
TABLE RADNIK;

DROP SEQUENCE kljuc_izv;


DROP SEQUENCE kljuc_radnika;

31

DROP SEQUENCE kljuc_am;


DROP SEQUENCE song;
DROP SEQUENCE rev;

ta je sve uraeno i ta bi dalje trebalo uraditi


Prvobitna ideja bila je da se kreira baza podataka arhive Radio Televizije
koja bi obuhvatala audio, video materijal, kao i materijal iz sopstvene produkcije
reklame, emisije, muzike spotove koji mogu biti u audio ili video formi.
Video materijal bi se donekle razlikovao od audio materijala, jer bi to
mogao biti serijal emisija (deije, dokumentarne, naune, zabavne, muzike,
kvizovi...) koje bi imale epizode, voditelje, dok bi filmovi imali razliite anrove
(komedija, akcija, drama, sci-fi..), glumce, reisera, producenta, scenaristu itd.
Reklame bi se vezivale za proizvod/firmu na koju se odnose (ili kratak
opis), vodile bi se i u audio i video formatu kao maske, spotovi ili sponzori.
Sve ovo je znailo da bi izrada ovog zanimljivog projekta obuhvatala preko
30 tabela, pa sam ga iz tog razloga svela samo na voenje audio materijala.
Ono to bi moglo dalje da se uradi na ovom projektu jeste kreiranje
funkcija i procedura kojima bi se vrila provera da li je u Sadri povezano tano
toliko pesama koliko je navedeno u trackno (Track number) u tabeli Audio_m,
potom, dodavanje kolone u emu relacije Audio_m koje bi oznaavalo da li se
radi o jednom izvoau ili kompilaciji, s tim bi sledila provera da li su u Sadrzi
za taj audio materijal grekom vezane pesme razliitih izvoaa (ako nije
kompilacija).
Namerno nisam pri kreiranju Audio_m limitirala dostupnost na 1 komad,
jer na ovaj nain se dozvoljava unoenje broja kopija istog audio materijala (bar
kada su CD i kasete u pitanju) dakle, mogue je uneti vie primeraka pod istom
ifrom (ifrom originala) samo se dostupnost poveava za broj kopija. Ovako
su nekada poslovale videoteke, kako se ne bi otetio originalni film, rentirale bi
samo kopije.
Ova evidencija takoe bi imala smisla kada bi se sprovodilo plaanje
autorskih prava izvoaima, s tim to bi povezali Arhivu sa Reijom, koja bi
koristila songID za kreiranje play lista (radijski program).
Na kraju meseca bi se vadio listing za svakog izvoaa posebno, i vrila
uplata na osnovu broja pesama zastupljenih u programu.

32

ZAKLJUAK

Voenje svake pesme posebno u Arhivi pomoglo bi i muzikim urednicima


(tonskim tehniarima) u ispunjavanju muzikih elja slualaca, kao i u traenju
audio materijala sa odreenom pesmom.
Na ovaj nain bi se unapredilo poslovanje, poboljao odnos sa
auditorijumom, i funkcionalnost prilagodila nekim buduim zahtevima (evidencija
radi isplate autorskih prava, na primer).
Takoe bi se redukovala mogunost krae i iznoenja audio materijala od
strane neovlaenih lica, to je bio primarni motiv izgradnje ovakve baze
podataka.
Evidencija bi pruala uvid i u to koji je radnik otetio materijal, ako doe
do toga, jer je onemoguena korekcija i brisanje podataka u tabeli Revers nakon
unosa.
Poznato je da su neka retka LP izdanja danas vrlo cenjena od strane
pravih kolekcionara, tako da bi arhiva originalnih izdanja radio ili televizijske
stanice bila posmatrana kao riznica bogatstva za pojedine radnike, ako se ne bi
zavodio materijal, i kada bi mogli bespravno da ga iznose.
Ovakvim nainom evidentiranja bi se uticalo na odgovornost radnika i
njihovo potovanje prema kapitalu RTV, ouvanje istog, kao i uspenije
korienje
dostupnog
materijala.

33

ER MODEL BAZE PODATAKA ARHIVE RTV

DRZAVA

TIP

(0,N)

IZVODJAC

(0,N)

IZ

(0,N)

IMA

(1,1)

PEVA

(1,1)

IZD_KUCA

(0,N)

(1,1)
OBJAVILA

(1,1)

AUDIO_M

(1,N)

(0,N)
SADRZI

PESMA

(0,N)

IZDAT
(1,1)

TONAC

(0,N)

PRIMIO

(1,1)

REVERS

(1,1)

(1,1)

IZDAO

(0,N)

MAGACIONER
(1,1)

(0,N)
ISA

RADNIK

34

You might also like