primer projekta za sajt za subp - vps.ns.ac.rs · pdf file2 uvod projekat baza podataka is rtv...
TRANSCRIPT
1
NOVOSADSKA POSLOVNA ŠKOLA
Student: Profesor:
Asurdžić Danica Luković dr Ivan
Smer: informatika Indeks: 1322/06
Novi Sad, 15.06.2007.
SEMINARSKI RAD
iz predmeta
SISTEMI ZA UPRAVLJANJE BAZAMA PODATAKA
Tema:
BAZA PODATAKA IS RTV -ARHIVA AUDIO MATERIJALA-
2
UVOD
Projekat Baza podataka IS RTV – sektor arhiva audio materijala – sadrži
informacione zahteve i pravila poslovanja predstavljenih i kroz odgovarajuću ER šemu baze podataka studije slučaja, prevod ER šeme u relacioni model, na osnovu kojeg su kreirane tabele sa atributima i ograničenjima.
Trigeri, funkcije i procedure dodavani su postupno, a rañeni su u skladu
sa pravilima poslovanja i u cilju obezbeñenja 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 priloženom 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 više različitih načina.
U obliku SQL skripta nalaze se i primeri koji testiraju rad trigera,
procedura i funkcija, za svaki posebno. Punjenje pojedinih tabela rañeno je uz korišćenje sekvencera. Ubačen je i skript za brisanje objekata, sekvencera i tabela.
Idejno rešenje daljeg proširenja baze opisano je na kraju ovog projekta.
3
Specifikacija studije slučaja, 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 nosača zvuka na kojem se nalazi 5. Izdavačka kuća 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 izvoñača se vodi: 1. Šifra izvoñača # 2. Naziv izvoñača
Za izdavačku kuću: 1. Šifra izdavačke kuće # 2. Naziv izdavačke kuće 3. Oznaka države – pošto je moguće da se pod istim nazivom izdavač pojavi i
u nekoj drugoj zemlji Država: 1. Oznaka države # 2. Naziv države
Zavode se i pesme radi lakše pretrage materijala: 1. SongID # 2. Naziv pesme 3. Izvoñač (šifra)
4
4. Verzija – original će biti default, a unosi se ako je koncertna verzija, remix, itd.
5. Trajanje hh:mm:ss (pesma može trajati više časova ako je miks u pitanju, npr. Novogodišnji program se snima unapred i pušta kao 1 track u trajanju od 12 časova – ovo je već deo baze prilagoñen Sopstvenoj Produkciji koja bi se takoñe nalazila u Arhivi, ali nije obuhvaćena ovim projektom).
Vodi se i evidencija o izdavanju arhivskog materijala ovlašćenim radnicima,
nazvaćemo ih Tonci (tonski tehničar). Izdavanje vrši magacioner. Tonci su evidentirani po: 1. MBT # - matični broj tonskog tehničara 2. Prezime 3. Ime 4. Sektor (Radio, Marketing, Montaža, Produkcija, Komercijala, Uprava...) 5. Terećenje (izraženo u broju komada audio materijala koji su izneli -
default 0) Za magacionera, vodi se: 1. MBM # - matični broj magacionera 2. Prezime 3. Ime 4. Sektor (Arhiva) 5. SQL sertifikat – moraju posedovati da bi radili u arhivi.
Radi smanjenja papirologije, ne vrši se štampanje dokumenta o izdavanju.
Svaki izdati audio materijal vodi se posebno u evidenciji Reversa: 1. RBR # - Redni broj reversa 2. Primio – Matični broj tonca 3. Izdao – Matični broj magacionera 4. Šifra audio materijala koji je izdat 5. Datum izdavanja 6. Datum povratka – ovde se upisuje vrednost tek kad se materijal vrati.
5
PRAVILA POSLOVANJA
Prilikom izdavanja dostupnost u tabeli audio materijala se umanjuje za 1, a uvećava se terećenje radnika koji je materijal izneo.
Radnik može izneti najviše 5 materijala. Radnik ne mora u istom danu da vrati sve što je izneo. Zabranjeno je izdavanje materijala radniku koji nije za to ovlašćen (ne radi u
sektoru RADIO) i izdavanje od strane radnika koji ne radi u sektoru ARHIVA. U trenutku vraćanja, zavodi se datum povratka, dostupnost vraćenog
materijala se uvećava za 1, a terećenje radnika umanjuje za svaki vraćeni materijal –1.
Kod evidencije audio materijala, album mora imati bar 1 pesmu (Track
number>0). Naziv izvoñača (šifra) se popunjava za svaku pesmu posebno. Jedna pesma
može se naći na više različitih nosača 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 sadrži – ako nijedan drugi audio materijal ne obuhvata iste.
Izvoñač može biti obrisan ako nema nijednu pesmu u arhivi. Izdavačka kuća može biti obrisana ako nema nijednog albuma u arhivi. Većina ovih ograničenja realizuje se automatski definicijom primarnih i stranih
ključeva.
6
Država 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
Omogućiti pretragu po nazivu pesme gde je rezultat pretrage: 1. pun naziv pesme 2. verzija 3. trajanje 4. naziv izvoñača 5. naziv albuma 6. godina izdanja 7. šifra audio materijala 8. tip (naziv) 9. dostupnost
Za traženog izvoñača - na osnovu njegove šifre - omogućiti ispis: 1. šifre audio materijala 2. naziv tipa audio materijala 3. naziv svih albuma i 4. godinu.
Omogućiti ispis svih trenutno izdatih audio materijala (VIEW), sa kolonama:
1. Šifra audio materijala 2. Tip (naziv) 3. Naziv albuma 4. Prezime i ime radnika koji se tereti 5. Datum izdavanja
7
ER šema – u prilogu
8
ER šema baze podataka studije slučaja 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) = ⊥
9
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)= ⊥
10
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');
11
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
12
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})
13
Null (Magacioner, MBM)= ⊥ Magacioner [MBM] ⊆ Radnik [MBR]
*NAPOMENA: Kreiramo 1 tabelu Radnik u koju prelaze obeležja 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');
14
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 vršila 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,
15
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 vršila 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 unos_audiocd(kljuc_am.NEXTVAL, 22, 'Bezdan', 1986, 3); EXECUTE unos_audiocd(kljuc_am.NEXTVAL, 23, 'Oprem dobro', 2005, 4); EXECUTE unos_audiocd(kljuc_am.NEXTVAL, 21, 'Hitovi', 2006, 2); EXECUTE 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);
16
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');
17
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,
18
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);
19
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)= ⊥
20
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;
REŠENJE KORISNIČKIH ZAHTEVA Za traženog izvoñača - na osnovu njegove šifre - omogućiti ispis:
1. šifre audio materijala 2. naziv tipa audio materijala 3. ime izvoñača 4. naziv albuma i 5. pesmu.
SELECT am.sifam SIFRA, VRSTA, iz.artist IZVODJAC, ALBUM, title PESMA
21
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;
Omogućiti pretragu po nazivu pesme gde je rezultat pretrage: 1. pun naziv pesme 2. verzija 3. trajanje 4. naziv izvoñača 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 način – funkcija koja vraća šifru tražene 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;
22
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; OBEZBEðENJE PRIMENE PRAVILA POSLOVANJA
Prilikom izdavanja dostupnost u tabeli audio materijala se umanjuje za 1, a uvećava se terećenje radnika koji je materijal izneo.
Radnik može izneti najviše 5 materijala. Radnik ne mora u istom danu da vrati sve što je izneo.
U trenutku vraćanja, zavodi se datum povratka, dostupnost vraćenog materijala se uvećava za 1, a terećenje radnika umanjuje za svaki vraćeni materijal –1.
Funkcija koja dodaje 1 na uneti broj i vraća uvećanu vrednost:
23
CREATE OR REPLACE FUNCTION dodaj1(ulaz NUMBER) RETURN NUMBER IS BEGIN RETURN ulaz+1; END dodaj1; /
Funkcija koja umanjuje uneti broj za 1 i vraća 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 više 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 grešku 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; /
24
Okidač koji javlja grešku ako se unosi radnik koji nije zadužen: 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 slučajnih prepravki u evidenciji. Okidač koji uz poziv funkcije zadužuje 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; /
25
Okidač koji uz poziv funkcije razdužuje 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 vraća 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);
26
INSERT INTO Revers (RBR, sifam, primio, izdao)
VALUES(rev.NEXTVAL,2004,1000,1004);
Testiranje okidača za zaduženje radnika i umanjivanje dostupnog materijala
SELECT * FROM RADNIK; SELECT * FROM AUDIO_M; SELECT * FROM REVERS;
Testiranje okidača koji ne dozvoljava da 1 radnik iznese više od 5 materijala: INSERT INTO Revers (RBR, sifam, primio, izdao) VALUES(rev.NEXTVAL,2005,1000,1005); Testiranje okidača koji javlja da je materijal već izdat: INSERT INTO Revers (RBR, sifam, primio, izdao) VALUES(rev.NEXTVAL,2000,1001,1004); Testiranje okidača koji razdužuje radnika pri povraćaju materijala: UPDATE REVERS SET datpov=SYSDATE WHERE RBR=1;
Okidači zabrane brisanja/izmene podataka u tabelama.
Država 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 države:
CREATE OR REPLACE TRIGGER nema_brisanja_drzave BEFORE DELETE ON Drzava
27
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; /
28
Testiranje: DELETE FROM Revers WHERE RBR=3 /
Ono što bi mogli ograničiti okidačima jeste izdavanje materijala radniku koji nije za to ovlašćen (ne radi u sektoru RADIO) i izdavanje od strane radnika koji ne radi u sektoru ARHIVA.
Funkcija koja na osnovu unetog MBR vraća 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 neovlašćenim 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);
29
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;
30
UPDATE Revers SET datpov=SYSDATE WHERE RBR=3;
KREIRANJE POGLEDA
Omogućiti ispis svih trenutno izdatih audio materijala (VIEW), sa kolonama:
1. Šifra audio materijala 2. Tip (naziv) 3. Naziv albuma 4. Prezime i ime radnika koji se tereti 5. 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
31
WHERE object_type = 'TRIGGER' /
BRISANJE OBJEKATA, TABELA I SEKVENCERA
DROP TRIGGER nema_brisanja_drzave; DROP TRIGGER nema_brisanja_ik; DROP TRIGGER nema_brisanja_evidencije; DROP TRIGGER nema_brisanja_radnika; DROP TRIGGER ovlascen_radnik; DROP TRIGGER ovlascen_arhivar; DROP TRIGGER dosta5; DROP TRIGGER nema_am; DROP TRIGGER razduzen; DROP TRIGGER razduzi_radnika; DROP TRIGGER zaduzi_radnika; DROP TRIGGER umanji_materijal; DROP TRIGGER vrati_materijal; DROP TRIGGER zastita_evidencije; DROP PROCEDURE unos_audiocd; DROP PROCEDURE unos_audiolp; DROP FUNCTION dodaj1; DROP FUNCTION umanji1; DROP FUNCTION vrati_sektor; DROP FUNCTION nadji_pesmu; DROP VIEW izdati_am; DROP TABLE REVERS; DROP TABLE SADRZI; DROP TABLE PESMA; DROP TABLE IZVODJAC; DROP TABLE AUDIO_M; DROP TABLE TIP; DROP TABLE IZD_KUCA; DROP TABLE DRZAVA; DROP TABLE RADNIK; DROP SEQUENCE kljuc_izv; DROP SEQUENCE kljuc_radnika;
32
DROP SEQUENCE kljuc_am; DROP SEQUENCE song; DROP SEQUENCE rev;
Šta je sve urañeno 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, muzičke 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 (dečije, dokumentarne, naučne, zabavne, muzičke, kvizovi...) koje bi imale epizode, voditelje, dok bi filmovi imali različite žanrove (komedija, akcija, drama, sci-fi..), glumce, režisera, 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 značilo da bi izrada ovog zanimljivog projekta obuhvatala preko
30 tabela, pa sam ga iz tog razloga svela samo na voñenje audio materijala. Ono što bi moglo dalje da se uradi na ovom projektu jeste kreiranje
funkcija i procedura kojima bi se vršila provera da li je u Sadrži povezano tačno toliko pesama koliko je navedeno u trackno (Track number) u tabeli Audio_m, potom, dodavanje kolone u šemu relacije Audio_m koje bi označavalo da li se radi o jednom izvoñaču ili kompilaciji, s tim bi sledila provera – da li su u Sadrzi za taj audio materijal greškom vezane pesme različitih izvoñača (ako nije kompilacija).
Namerno nisam pri kreiranju Audio_m limitirala dostupnost na 1 komad,
jer na ovaj način se dozvoljava unošenje broja kopija istog audio materijala (bar kada su CD i kasete u pitanju) – dakle, moguće je uneti više primeraka pod istom šifrom (šifrom originala) – samo se dostupnost povećava za broj kopija. Ovako su nekada poslovale videoteke, kako se ne bi oštetio originalni film, rentirale bi samo kopije.
Ova evidencija takoñe bi imala smisla kada bi se sprovodilo plaćanje
autorskih prava izvoñačima, s tim što bi povezali Arhivu sa Režijom, koja bi koristila songID za kreiranje play lista (radijski program).
Na kraju meseca bi se vadio listing za svakog izvoñača posebno, i vršila
uplata na osnovu broja pesama zastupljenih u programu.
33
ZAKLJUČAK Voñenje svake pesme posebno u Arhivi pomoglo bi i muzičkim urednicima
(tonskim tehničarima) u ispunjavanju muzičkih želja slušalaca, kao i u traženju audio materijala sa odreñenom pesmom.
Na ovaj način bi se unapredilo poslovanje, poboljšao odnos sa
auditorijumom, i funkcionalnost prilagodila nekim budućim zahtevima (evidencija radi isplate autorskih prava, na primer).
Takoñe bi se redukovala mogućnost krañe i iznošenja audio materijala od
strane neovlašćenih lica, što je bio primarni motiv izgradnje ovakve baze podataka.
Evidencija bi pružala uvid i u to koji je radnik oštetio materijal, ako doñe
do toga, jer je onemogućena 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 načinom evidentiranja bi se uticalo na odgovornost radnika i
njihovo poštovanje prema kapitalu RTV, očuvanje istog, kao i uspešnije korišćenje dostupnog materijala.
ER MODEL BAZE PODATAKA ARHIVE RTV
34
(0,N) (0,N) (0,N) (1,1) (1,1) (1,1) (0,N) (1,1) (1,N) (0,N) (0,N) (1,1) (0,N) (1,1) (1,1) (0,N) (1,1) (1,1) (0,N)
IZVODJAC
AUDIO_M PESMA IZD_KUCA
MAGACIONER TONAC
SADRZI OBJAVILA
REVERS
IZDAT
PEVA
TIP
IMA
RADNIK
ISA
PRIMIO IZDAO
IZ
DRZAVA