Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoć oko trigera

[es] :: Oracle :: Pomoć oko trigera

[ Pregleda: 4567 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ic2000

Član broj: 22817
Poruke: 106
*.crnagora.net.

Sajt: www.com-shop.co.uk


Profil

icon Pomoć oko trigera06.12.2014. u 14:24 - pre 69 meseci
Pozdrav svima,

Imam bazu u kojoj se jedna od tabela zove REKLAMA i u njoj se smijestaju podaci o reklami koja izlazu u nekom stampanom mediju.
struktura tabele je sljedeća

REKLAMA (idReklame, nazivReklame, klijentID, prostorID, stranaBr, kolorID, izlaziKad, kreiraoKo, kreiraoKad, azuriraoKo, azuriraoKad, odobrioKo, odobrioKad).

ako imam unos kao npr ovaj

insert into reklama values(1,'Telenor - pametna mreza',1,1,'17',1,'09-dec-98',1,sysdate,1,sysdate,1,sysdate);

čim ga ponovim on će opet u tabeli napraviti unos i pored ograničenja koja su postavljena zbog trigera sa kojim sam definisao da svaki naredni unos u bazu bude sljedeci naredni broj a ne onaj koji je zadat

ovo je triger

create or replace trigger trg_reklama_INS
before insert on reklama
for each row
declare
maxID number;
begin
select max(idReklame)+1 into maxID from reklama;
:new.idReklame := maxID;
end;

Da li neko ima ideju kako ovo da rijesim? Možda sa nekim if u ovom trigeru ili kako....

Hvala svima!
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 213
..158:5b00:5c52:faa8:7357:da17

ICQ: 244452581


+3 Profil

icon Re: Pomoć oko trigera06.12.2014. u 19:53 - pre 69 meseci
Iskreno da kažem, ne razumem šta ti je problem. Ovde se ne zna šta hoćeš da uradiš:

Citat:
čim ga ponovim on će opet u tabeli napraviti unos i pored ograničenja koja su postavljena zbog trigera sa kojim sam definisao da svaki naredni unos u bazu bude sljedeci naredni broj a ne onaj koji je zadat


Ono što bi trebalo da pogledaš su sekvence u Oracle-u. Recimo ovako bi nešto moglo da se uradi a da li je to ono što hoćeš, ne znam:

Code:
create sequence reklama_seq start with 1 increment 1;


Sa sekvencom bi ti unos bio ovakav:

Code:

insert into reklama (idReklame, nazivReklame, klijentID, prostorID, stranaBr, kolorID, izlaziKad, kreiraoKo, kreiraoKad, azuriraoKo, azuriraoKad, odobrioKo, odobrioKad)
values (reklama_seq. nextval,'Telenor - pametna mreza',1,1,'17',1,'09-dec-98',1,sysdate,1,sysdate,1,sysdate);


i nemaš trigera. A ako nećeš da prosleđuješ nikakav ID iz koda (kakav god da je) onda možeš da kreiraš triger koji će sa sekvencom sam da radi ostatak posla:

Code:

create trigger reklama_id_trig before insert on reklama
for each row
when (new.idReklame is null)
begin
 select reklama_seq.nextval into :new.idReklame from dual;
end;
/


Onda u insert komandi nemaš ID, to se automatski radi u trigeru i taj deo te ne interesuje.

Još jedan savet. Uvek za insert komandu piši i redosled kolona u tabeli kako radiš insert. Desiće se nekad da se definicija tabele promeni i onda ti pola aplikacije ne radi.

Pozdrav.


 
Odgovor na temu

ic2000

Član broj: 22817
Poruke: 106
*.crnagora.net.

Sajt: www.com-shop.co.uk


Profil

icon Re: Pomoć oko trigera06.12.2014. u 20:39 - pre 69 meseci
Prvo hvala na odgovoru. Ja sam mozda loše objasnio problem pa cu sada postaviti čitav kod.

Problem je da koliko god puta ponovim insert kao ovaj insert into reklama values(1,'Telenor - pametna mreza',1,1,'17',1,'09-dec-98',1,sysdate,1,sysdate,1,sysdate); on će u tabeli reklama odraditi unos. To ne želim jer su taj datum i ta stranica već zauzeti. Želim da sa nekim ograničenjem da li kroz triger ili kroz nešto drugo ograničim.

Hvala još jednom!

CREATE TABLE Korisnik
(
idKorisnika NUMBER PRIMARY KEY,
ime VARCHAR2(20) NOT NULL,
prezime VARCHAR2(30) NOT NULL,
jmbg VARCHAR2(13),
email VARCHAR2(50),
telefon VARCHAR2(20),
username VARCHAR2(20) NOT NULL,
password VARCHAR2 (30) NOT NULL,
idVrste NUMBER NOT NULL,
nalogOd DATE NOT NULL,
nalogDo DATE NOT NULL
);

CREATE TABLE vrstaKorisnika
(
idVrste NUMBER PRIMARY KEY,
naziv VARCHAR2(30) NOT NULL,
opis VARCHAR2(200)
);

insert into vrstaKorisnika values(1,'Administrator','Osoba zaduzena za administraciju sistema');
insert into vrstaKorisnika values(2,'Korisnik','Obi?ni korisnik');

insert into korisnik values(2,'Janko','Jankovic','1209978123002','[email protected]','067123457','janko','korisnik',1,'02-jan-99','31-dec-99');
insert into korisnik values(3,'Marko','Markovic','1209888123002','[email protected]','067765432','marko','korisnik',2,'03-jan-99','31-dec-01');
insert into korisnik values(4,'PEtaR','PeTrOvIc','1509898123002','[email protected]','067765432','petar','korisnik',2,'03-jan-99','31-dec-01');

CREATE TABLE Reklama
(
idReklame NUMBER PRIMARY KEY,
nazivReklame VARCHAR2(50) NOT NULL,
klijentID NUMBER NOT NULL,
prostorID NUMBER NOT NULL,
stranaBr NUMBER,
kolorId NUMBER,
izlaziKad DATE,
kreiraoKo NUMBER NOT NULL,
kreiraoKad TIMESTAMP NOT NULL,
azuriraoKo NUMBER NOT NULL,
azuriraoKad TIMESTAMP NOT NULL,
odobrioKo NUMBER NOT NULL,
odobrioKad TIMESTAMP NOT NULL
);

CREATE TABLE Klijent
(
idKlijenta NUMBER PRIMARY KEY,
nazivKlijenta VARCHAR2(50) NOT NULL,
adresa VARCHAR2(50),
postBr CHAR(5),
gradId NUMBER,
email VARCHAR2(50),
telefon VARCHAR2(20)
);

CREATE TABLE Prostor
(
id NUMBER PRIMARY KEY,
naziv CHAR(4) NOT NULL,
cijena DECIMAL(6,2) NOT NULL
);

CREATE TABLE Grad
(
id NUMBER PRIMARY KEY,
naziv VARCHAR(20) NOT NULL
);

insert into grad values(1,'Podgorica');
insert into grad values(2,'Nikši?');
insert into grad values(3,'Cetinje');

insert into klijent values(1,'Mapa','Ul. Slobode br 1.','81000',1,'[email protected]','020123456');
insert into klijent values(2,'Mouse','Ul. Slobode br 2.','81000',1,'[email protected]','020123456');

insert into prostor values(1,'1/2',400.20);
insert into prostor values(2,'1/1',700.50);

insert into reklama values(1,'Telekom - moj svijet',1,1,'12',1,'08-dec-99',1,sysdate,1,sysdate,1,sysdate);
insert into reklama values(1,'Telenor - pametna mreza',1,1,'17',1,'09-dec-98',1,sysdate,1,sysdate,1,sysdate);
insert into reklama values(1,'M-Tel',1,1,'16',1,'09-dec-99',1,sysdate,1,sysdate,1,sysdate);
insert into reklama values(7,'EPCG',1,1,'7',1,'09-dec-99',1,sysdate,1,sysdate,1,sysdate);
insert into reklama values(9,'ABC',1,1,'7',1,'09-dec-55',1,sysdate,1,sysdate,1,sysdate);
insert into reklama values(1,'Telenor - pametna mreza',1,1,'17',1,'09-dec-98',1,sysdate,1,sysdate,1,sysdate);


CREATE TABLE kolor
(
id NUMBER PRIMARY KEY,
naziv VARCHAR(20) NOT NULL
);

insert into kolor values (1,'crno-bijela');
insert into kolor values (2,'crna');
insert into kolor values (3,'kolor');

CREATE TABLE reklameLog
(
id NUMBER PRIMARY KEY,
akcija CHAR(10) NOT NULL,
nazivReklame VARCHAR2(50) NOT NULL,
kreiraoKo VARCHAR2 (30) NOT NULL,
kreiraoKad TIMESTAMP NOT NULL
);

insert into reklameLog values(1,'insert','I nije neka reklama','kreator',sysdate);

ALTER TABLE klijent ADD CONSTRAINT klijent_grad_FK FOREIGN KEY (gradId) REFERENCES Grad (id);

ALTER TABLE reklama ADD CONSTRAINT reklama_korisnik_FK FOREIGN KEY (kreiraoKo) REFERENCES korisnik (idKorisnika);

ALTER TABLE reklama ADD CONSTRAINT reklama_korisnik_FKv1 FOREIGN KEY (azuriraoKo) REFERENCES korisnik (idKorisnika);

ALTER TABLE reklama ADD CONSTRAINT reklama_korisnik_FKv2 FOREIGN KEY (odobrioKo) REFERENCES korisnik (idKorisnika);

ALTER TABLE reklama ADD CONSTRAINT reklama_prostor_FK FOREIGN KEY (prostorID) REFERENCES prostor (id);

ALTER TABLE reklama ADD CONSTRAINT reklama_klijent_FK FOREIGN KEY (klijentID) REFERENCES klijent (idKlijenta);

ALTER TABLE reklama ADD CONSTRAINT reklama_kolor_FK FOREIGN KEY (kolorId) REFERENCES kolor(id);

ALTER TABLE reklama ADD CONSTRAINT reklama_klijent_FK FOREIGN KEY (stranabr) REFERENCES reklama(id);

ALTER TABLE korisnik ADD CONSTRAINT korisnik_vrstaKorisnika_FK FOREIGN KEY (idVrste) REFERENCES vrstaKorisnika(idVrste);

-- triger kojim se obezbje?uje da idReklame uvijek bude najve?i slede?i..

create or replace trigger trg_reklama_INS
before insert on reklama
for each row
declare
maxID number;
begin
select max(idReklame)+1 into maxID from reklama;
:new.idReklame := maxID;
end;

-- triger koji postavlja vrijednosti atributa ime i prezime uppercase nezavisno u kom obliku se unose

create or replace trigger trg_korisnik
before insert or update of ime,prezime
on korisnik
for each row
begin
select UPPER(:new.ime) into :new.ime from dual;
select UPPER(:new.prezime) into :new.prezime from dual;
end;

-- triger koji upisuje logove u tabelu reklameLog nakon što se dogodi neka od komandi insert, update ili delete

create or replace trigger trg_INS_UPD_DEL_log
before insert or update of prostorID,stranaBr or delete
on reklama
for each row
declare
v_kreiraoKo varchar2(30);
maxId number;
begin
select user into v_kreiraoKo from dual;
select max(id)+1 into maxId from reklameLog;
if inserting then
insert into reklameLog values(maxId,'insert',:new.nazivReklame,v_kreiraoKo,sysdate);
elsif updating ('prostorID')then
insert into reklameLog (id,akcija,kreiraoKo,kreiraoKad) values(maxId,'update',v_kreiraoKo,sysdate);
elsif updating ('stranaBr')then
insert into reklameLog (id,akcija,kreiraoKo,kreiraoKad) values(maxId,'update',v_kreiraoKo,sysdate);
else
insert into reklameLog (id,akcija,kreiraoKo,kreiraoKad) values(maxId,'delete',v_kreiraoKo,sysdate);
end if;
end;
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 213
..110.68.dynamic.cablesurf.de.

ICQ: 244452581


+3 Profil

icon Re: Pomoć oko trigera06.12.2014. u 21:08 - pre 69 meseci
Koja kombinacija polja tebi određuje da li je neka reklama unique ili ne?

Ja sam mislio da je primarni ključ dovoljan, ali pošto kažeš da nije zašto ne staviš unique constraint nad tim poljima i onda insert neće moći da se uradi ako se ta reklama poklapa sa nekom prethodnom.

Još jedan savet, izbegavaj trigere koliko možeš, jer dok nisi sve namestio kako treba, mnogo je teško da nahvataš greške koje tamo mogu da se dese. Ako tačno znaš šta radiš onda nema problema.

Recimo, meni nije jasno zašto se konverzija podataka u upper case ne obrade ranije i da imaš običan insert kad bude trebalo nego to radiš kroz trigger, ili zašto ne staviš UPPER funkciju direktno u insert/update upit, opet tvoja stvar je kako ćeš takve stvari da izvodiš.

Pozdrav.


[Ovu poruku je menjao Raspucin dana 06.12.2014. u 22:24 GMT+1]
 
Odgovor na temu

ic2000

Član broj: 22817
Poruke: 106
*.crnagora.net.

Sajt: www.com-shop.co.uk


Profil

icon Re: Pomoć oko trigera06.12.2014. u 21:34 - pre 69 meseci
Citat:
Koja kombinacija polja tebi određuje da li je neka reklama unique ili ne?


sada vidim da je nemam. Npr. reklama moze biti istog datuma ali ne na istoj strani.

Ako je istog datuma i na istoj strani to bi trebalo da je zabranjena mogućnost.

Kako da to izvedem?

Hvala još jednom!

P.S.

Početnik sam a i malo sam se pogubio :)
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 213
..110.68.dynamic.cablesurf.de.

ICQ: 244452581


+3 Profil

icon Re: Pomoć oko trigera06.12.2014. u 22:01 - pre 69 meseci
Pogledaj malo dokumentaciju:

https://docs.oracle.com/cd/B19...rver.102/b14200/clauses002.htm

a pogledaj malo i po internetu, imaš gomilu primera:

http://stackoverflow.com/quest...constraint-on-multiple-columns

Ako su samo ta dva polja onda ćeš da kreiraš unique constraint nad njima slično kao i za primary key:

Code:

ALTER TABLE Reklama ADD CONSTRAINT reklama_unq UNIQUE (stranaBr, izlaziKad);


Ako već imaš duplikate ovih vrednosti u tabeli moraćeš da ih obrišeš da bi mogao da kriraš unique constraint.

Pozdrav.

 
Odgovor na temu

ic2000

Član broj: 22817
Poruke: 106
*.crnagora.net.

Sajt: www.com-shop.co.uk


Profil

icon Re: Pomoć oko trigera06.12.2014. u 22:30 - pre 69 meseci
Obrisao duplikate vrijednosti kreirao unique constraint i opet dodaje vrijednosti kada su u pitanju ista strana i dataum....

jedino kada je naruseno ogranicenje primary key-a nece da odradi unos. u ovoj tabeli reklama to je id reklame
 
Odgovor na temu

ic2000

Član broj: 22817
Poruke: 106
*.crnagora.net.

Sajt: www.com-shop.co.uk


Profil

icon Re: Pomoć oko trigera06.12.2014. u 22:35 - pre 69 meseci
radi :)....

ponovo sam obrisao pa pokusao unos, vjerovatno sam napravio neku gresku u koracima :)
 
Odgovor na temu

ic2000

Član broj: 22817
Poruke: 106
*.crnagora.net.

Sajt: www.com-shop.co.uk


Profil

icon Re: Pomoć oko trigera06.12.2014. u 22:38 - pre 69 meseci
još jedna pomoć nadam se da nijesam neskroman :)

dok nije postojao ovaj alter table pomoću trigera

create or replace trigger trg_reklama_INS
before insert on reklama
for each row
declare
maxID number;
begin
select max(idReklame)+1 into maxID from reklama;
:new.idReklame := maxID;
end;

sam postavljao da idReklame uvijek bude najveći sledeći..

sada to ne radi?

da li nekako mogu da ga zadržim?
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 213
..110.68.dynamic.cablesurf.de.

ICQ: 244452581


+3 Profil

icon Re: Pomoć oko trigera06.12.2014. u 22:44 - pre 69 meseci
Citat:
da li nekako mogu da ga zadržim?


Pogledaj moj prvi odgovor i sekvence kako rade. Inače ti ne treba taj triger takav.

Pozdrav.
 
Odgovor na temu

ic2000

Član broj: 22817
Poruke: 106
*.crnagora.net.

Sajt: www.com-shop.co.uk


Profil

icon Re: Pomoć oko trigera06.12.2014. u 22:48 - pre 69 meseci
Ipak sam ja početnik :)

opet greška u koracima ali ipak se na njima uči...

radi jer nijesam ponovo pokrenuo triger

hvala ti puno na odgovorima i izdvojenom vremenu!
 
Odgovor na temu

ic2000

Član broj: 22817
Poruke: 106
*.crnagora.net.

Sajt: www.com-shop.co.uk


Profil

icon Re: Pomoć oko trigera10.12.2014. u 22:55 - pre 68 meseci
evo mene ponovo :)

zapelo oko trigera :)

kako bih rijesio da kroz neki triger zabranim unos u neku tabelu ili bazu u odredjenom vremenskom periodu?
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 213
*.61.77.202.host.de.colt.net.

ICQ: 244452581


+3 Profil

icon Re: Pomoć oko trigera11.12.2014. u 08:19 - pre 68 meseci
Zašto to rešavaš na nivou baze?

Nebitno u čemu god je pisana ta aplikacija što koristi bazu, to može da se uradi tamo mnogo lakše i elegantnije. Ne verujem da neko piše SQL da unosi podatatke u bazu i da ne postoji ništa između.

Svrha trigera nije security.

 
Odgovor na temu

[es] :: Oracle :: Pomoć oko trigera

[ Pregleda: 4567 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.