Tabela Tip trigera Atribut Potreban Akcija Kupac Insert Ne Update NazivKupac Da Prilikom izmene vrednosti NazivKupac u tabeli Kupac, azurira se vrednost i u tabeli NalogZaPrenos. Delete Ne NalogZaPrenos Insert Da Triger azurira vrednost NazivKupac na osnovu vrednosti PIB. Update PIB Da Triger azurira vrednost NazivKupac na osnovu izmenjene vrednosti kolone PIB. NazivKupac Da Zabranjuje direktno auriranje ovog atributa. Delete Ne
11
Denormalizacija 2NF: Pre - joining
- Dodavanje atributa Datum iz tabele Otpremnica u tabelu Stavke otpremnice.
StavkeOtpremnice 2 (#RedniBroj, #BrojOtpremnice, Kolicina, SifraArtikla, Datum (Otpremnica))
Tabela Tip trigera Atribut Potreban Akcija Otpremnica Insert Ne Update Datum Da Prilikom izmene vrednosti Datum u tabeli Otpremnica, aurira se vrednost i u tabeli Stavke otpremnice. Delete Stavke otpremnice Insert Da Triger azurira vrednost Datum na osnovu unete vrednosti Broj otpremnice. Update Broj otpremnice Da Zabranjuje direktno auriranje ovog atributa. Datum Da Zabranjuje direktno auriranje ovog atributa. Delete Ne
12
4. Korisnicki definisani tipovi
- Struktuirani tip (Telefon)
create or replace type Telefon as object (prefiks VARCHAR2 (3), broj VARCHAR2 (7), member function GET_PREFIKS return VARCHAR2, member function GET_BROJ return VARCHAR2) instantiable final;
create or replace type body Telefon as member function GET_PREFIKS return VARCHAR2 is begin return self.prefiks; end; member function GET_BROJ return VARCHAR2 is begin return self.broj; end; end;
- Distinkt tip (Email)
create or replace type Email as object (mail varchar2 (50), MEMBER FUNCTION get_mail RETURN varchar2) instantiable not final;
create or replace type body Email as member function get_mail RETURN varchar2 IS BEGIN return self.mail; end; end;
create or replace TRIGGER KUPAC_UPD_NAZIV AFTER UPDATE OF NAZIVKUPAC ON KUPAC FOR EACH ROW declare PRAGMA AUTONOMOUS_TRANSACTION; BEGIN execute IMMEDIATE 'alter trigger NALOGZAPRENOS_UPD_NAZIV disable'; update NALOGZAPRENOS set nazivkupac = :new.Nazivkupac where pib = :new.pib; begin execute IMMEDIATE 'alter trigger NALOGZAPRENOS_UPD_NAZIV enable'; END; END;
14
NalogZaPrenos - Insert - Naziv
CREATE OR REPLACE TRIGGER NALOGZAPRENOS_INS_NAZIV BEFORE INSERT ON NALOGZAPRENOS FOR EACH ROW declare i_naziv_kupac varchar2 (100); BEGIN select nazivkupac into i_naziv_kupac from KUPAC where pib = :new.pib; :new.nazivkupac := i_naziv_kupac; END;
NalogZaPrenos - Update - PIB
CREATE OR REPLACE TRIGGER NALOGZAPRENOS_UPD_PIB BEFORE UPDATE OF PIB ON NALOGZAPRENOS FOR EACH ROW declare i_naziv_kupac varchar2 (100); BEGIN select nazivkupac into i_naziv_kupac from KUPAC where pib = :new.pib; :new.nazivkupac := i_naziv_kupac; END;
NalogZaPrenos - Update - Naziv
CREATE OR REPLACE TRIGGER NALOGZAPRENOS_UPD_NAZIV BEFORE UPDATE OF NAZIVKUPAC ON NALOGZAPRENOS FOR EACH ROW BEGIN RAISE_APPLICATION_ERROR (-20000, 'Zabranjeno direktno auriranje!'); END;
15
- Denormalizacija 2NF: Pre - joining
Otpremnica - Update - Datum
create or replace trigger otpremnica_upd_datum after update of datum on otpremnica for each row declare PRAGMA AUTONOMOUS_TRANSACTION; BEGIN execute IMMEDIATE 'alter trigger stavke_otp_upd_datum disable'; update STAVKEOTPREMNICE set datum = :new.datum where brojotpremnice = :new.brojotpremnice; begin execute IMMEDIATE 'alter trigger stavke_otp_upd_datum enable'; end; end;
Stavke otpremnice - Insert - Datum
create or replace trigger stavke_otp_ins_datum before insert on STAVKEOTPREMNICE for each row declare i_datum date; BEGIN select datum into i_datum from OTPREMNICA where brojotpremnice = :new.brojotpremnice; :new.datum := i_datum; end;
16
Stavke otpremnice - Update - Broj otpremnice
create or replace trigger stavke_otp_upd_broj_opt before update of brojotpremnice on STAVKEOTPREMNICE for each row begin RAISE_APPLICATION_ERROR (-20000, 'Zabranjeno direktno auriranje!'); end;
Stavke otpremnice - Update - Datum
create or replace trigger stavke_otp_upd_datum before update of datum on STAVKEOTPREMNICE for each row begin RAISE_APPLICATION_ERROR (-20000, 'Zabranjeno direktno auriranje!'); end;
17
6. Optimizacija
- Tehnika optimizacije: Repeating Single Detail with Master
Tabela Tip trigera Atribut Potreban Akcija Artikal Insert Ne Update AktuelnaCena Da Zabrana direktnog azuriranja atributa AktuelnaCena u tabeli Artikal Delete Ne CenaArtikla Insert Da Prilikom unosa nove cene artikla, okida se triger koji poziva proceduru za auriranje atributa AktuelnaCena na Artiklu Update Cena Da Prilikom azuriranja cene artikla, okida se triger koji poziva proceduru za auriranje atributa AktuelnaCena na Artiklu Delete Da Prilikom brisanja Cene artikla, okida se triger koji poziva proceduru za auriranje atributa AktuelnaCena na Artiklu
- Paket i globalna promenljiva: create or replace package paket as prom number(30):=0; end;
18
- Triger odreuje sifru artikla i postavlja u globalnu promenljivu: CREATE OR REPLACE TRIGGER aktuelna_cena1 BEFORE INSERT OR UPDATE OR DELETE ON CENAARTIKLA FOR EACH ROW BEGIN IF (INSERTING OR UPDATING) THEN BEGIN paket.prom:= :NEW.SIFRAARTIKLA; END; ELSE BEGIN paket.prom:= :OLD.SIFRAARTIKLA; END; END IF; END;
- Triger za pozivanje procedure: CREATE OR REPLACE TRIGGER aktuelna_cena2 AFTER INSERT OR UPDATE OR DELETE ON CENAARTIKLA DECLARE s NUMBER := paket.prom; BEGIN aktuelnacena (s); END;
- Procedura za odreivanje aktuelne cene: CREATE OR REPLACE PROCEDURE aktuelnacena (SifraPro IN NUMBER) AS aktCena artikal.aktuelnacena%type; BEGIN aktCena:=0; SELECT cena INTO aktCena FROM cenaartikla WHERE sifraartikla=SifraPro and datum= (select max(datum) from cenaartikla where sifraartikla = SifraPro and datum<=sysdate); UPDATE artikal SET aktuelnacena = aktCena WHERE sifraartikla = SifraPro; END;
Tabela Tip trigera Atribut Potreban Akcija Faktura Insert Ne Update UkupnoZaUplatu Da Zabrana direktnog azuriranja atributa UkupnoZaUplatu Delete Ne StavkeFakture Insert Da Prilikom unosa nove Stavke fakture, okida se triger koji poziva proceduru za azuriranje atributa UkupnoZaUplatu na Fakturi Update Kolicina Da Prilikom azuriranja nove Stavke fakture, okida se triger koji poziva proceduru za auriranje atributa UkupnoZaUplatu na Fakturi Delete Da Prilikom brisanja Stavke fakture, okida se triger koji poziva proceduru za azuriranje atributa UkupnoZaUplatu na Fakturi
20
- Triger koji odreuje ifru fakture i postavlja je u promenljivu: CREATE OR REPLACE TRIGGER ukupno_1 BEFORE INSERT OR UPDATE OR DELETE ON stavkefakture FOR EACH ROW BEGIN IF (INSERTING OR UPDATING) THEN BEGIN paket.prom:=:NEW.brojfakture;END; ELSE BEGIN paket.prom:=:OLD.brojfakture;END; END IF; END;
- Triger za pozivanje procedure: CREATE OR REPLACE TRIGGER ukupno_2 AFTER INSERT OR UPDATE OR DELETE ON stavkefakture DECLARE s NUMBER:=paket.prom; BEGIN ukupna_suma_za_uplatu(s); END;
- Procedura za odreivanje ukupne sume za uplatu: CREATE OR REPLACE PROCEDURE ukupna_suma_za_uplatu (sifDok IN NUMBER) AS suma NUMBER:=0; BEGIN SELECT SUM(p.aktuelnacena*sp.kolicina) INTO suma FROM artikal p join stavkefakture sp on (p.sifraartikla=sp.sifraartikla) WHERE brojfakture=SifDok; UPDATE faktura SET ukupnozauplatu=suma WHERE brojfakture=SifDok; END;
21
7. Vertikalno particionisanje i index
Pre particionisanja Radnik (#JMBG, Ime, Prezime, Telefon, Email, Sluzba)
create or replace view radnikpogled as select r.jmbg, r.ime, r.prezime, rd.telefon, rd.email, rd.sluzba from radnik r, radnikdetalji rd where r.jmbg = rd.jmbg
create or replace trigger pogled_radnik_trg instead of insert on radnikpogled for each row begin insert into radnik (jmbg, ime, prezime) values (:new.jmbg, :new.ime, :new.prezime); insert into radnikdetalji (jmbg, telefon, email, sluzba) values (:new.jmbg, :new.telefon, :new.email, :new.sluzba); end;