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

Dvije tablice na jedan triger

[es] :: MySQL :: Dvije tablice na jedan triger

[ Pregleda: 2106 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

MarkoBalkan

Član broj: 141124
Poruke: 1624
...140.71-dsl.net.metronet.hr.



+19 Profil

icon Dvije tablice na jedan triger15.02.2009. u 14:23 - pre 184 meseci
Code:

DELIMITER $$

DROP TRIGGER /*!50032 IF EXISTS */ `proba`.`marko`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `marko` AFTER INSERT ON `druga` 
    FOR EACH ROW BEGIN
insert into treca(id,id1,a) values(NEW.ID,NEW.ID1,NEW.a);
    END;
$$

DELIMITER ;



kako ubaciti i tablicu sa imenom "prva" i dodati polja za insert?

znači dvije tablice koje su vezane da se dodaju u triger.




[Ovu poruku je menjao MarkoBalkan dana 15.02.2009. u 15:34 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.xdsl.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Dvije tablice na jedan triger16.02.2009. u 05:40 - pre 184 meseci
40 pogleda i nijedan odgovor :( ...

Marko, nemam pojma sta pitas :( ... generalno je odgovor - NE.

E sad .. ako hoces kada se neki djavo desava sa jednom tabelom da taj triger silji neke druge dve, tri, pet .. nije problem:
Code:

DELIMITER $$
DROP TRIGGER IF EXISTS `tr1`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr1` 
AFTER INSERT ON `t1` 

FOR EACH ROW BEGIN
  insert into t2(id,a,b) values(NEW.id,NEW.x,NEW.y);
  insert into t3(id,a,b) values(NEW.id,NEW.x,NEW.y);
END;
$$
DELIMITER ;


DELIMITER $$
DROP TRIGGER IF EXISTS `tr2`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr2` 
AFTER UPDATE ON `t1` 

FOR EACH ROW BEGIN
  update t2 set b = NEW.y, a = NEW.x, id = NEW.id WHERE id = OLD.id;
  update t3 set b = b+NEW.y, id = NEW.id WHERE id = OLD.id; 
END;
$$
DELIMITER ;


ali mi je malo sumljivo da je to pitanje ..

opet .. ako si hteo nesto tipa:
Code:

DELIMITER $$
DROP TRIGGER IF EXISTS `tr1`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr1` 
[b]AFTER INSERT ON `t1`, `t2'[/b]
FOR ...



to ne moze, bar ne u MySQL-u .. iskreno, ne znam ni kako bi to radilo ... trigger se aktivira ako uradis "update t1,t2 set t1.x=10, t2.a=10 where t1.id=t2.id and t2.id > 10;" ???? a sta ako uradis to u dva statementa, dakle isti upit "update t1 set x=10 where id >10; update t2 set a = 10 where id > 10;" .. sada neces da se cimne trigger???? ... ja licno ne znam da ijedan sql to podrzava... nisam neki veliki oracle expert ali gledam ovde: http://download.oracle.com/doc...101/b10759/statements_7004.htm i rekao bih da ni oracle ne podrzava da tu stavis nekoliko tabela
 
Odgovor na temu

MarkoBalkan

Član broj: 141124
Poruke: 1624
...135.93-dsl.net.metronet.hr.



+19 Profil

icon Re: Dvije tablice na jedan triger16.02.2009. u 09:55 - pre 184 meseci
ajmo ovako.
napravio sam proceduru koja selectira iz dvije vezane tablice i taj select stavio u kursor.

Code:

select t1.id, t1.kolona ,t2.id, t2.id1, t2.kolona_m from t1,t2 where t1.id=t2.id1



prolazim kroz cursor i ubacujem u tablicu t3.

i to sve radi.

problem je slijedeći.

ja ne želim svaki puta sve selectirati i ubacivati sve već samo ono što ne postoji u tablici t3.

pa sam mislio u select ubaciti uvjet tamo gdje id iz tablice t2 ne postoji u tablici t3.


i ovu proceduru pozvati na triger tablice t2, jer t2 je detail.

možda danas stignem isprobati.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.xdsl.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Dvije tablice na jedan triger16.02.2009. u 17:39 - pre 184 meseci
ne kontam kakve sad veze ova procedura ima sa trigerom i dve tabele :)

copy paste te procedure ovde + dodaj "izmisljenom" sintaksom to sto hoces pa da vidimo dal mozes ...

ne znam zasto bi radio select u kursor da bi to doda u u t3 kad mozes direkt ..

Code:

insert into t3 (a, b, c, d) (select t1.a, t1.b, t2.x, t2.y from t1,t2 where t1.id = t2.id);


e sad, sta znaci "sto ne postoji u t3" ... oces sve iz t1*t2 gde t1.id=t2.id not in (select id from t3)?

Code:

insert into t3 (a, b, c, d) (select t1.a, t1.b, t2.x, t2.y from t1,t2 where t1.id = t2.id and t1.id not in (select id from t3) );


pretpostavljam da pokusavas da izvedes ono sto smo pricali oko materialized view-a odnosto "cache" tabele uz pomoc trigera ... sta je fora .. ne mozes da ides na varijantu da imas "sadasnje stanje" i onda iz "sadasnjeg stanja" gde je ta tabela prazna a tabele t1 i t2 od kojih treba da nastane imaju slogove ... moras da ides na varijantu da trigeri postoje "od pocetka" te da je sve vreme ta tabela up2date ... eventualno mozes da napravis skript/proceduru koji ce da rekreiraju tu tabelu (za prvi put ili za kasnije ako je potrebno)... tako da ako su ti trigeri tu od pocetka i ako su napisani kako treba nikada neces imati situaciju da dodajes one koje "(ne)postoje" ....

na primer ..
Code:

create table t1 (id int auto_increment primary key, a int, b int) engine=innodb;
create table t2 (a int, x int) engine=innodb;
create table tmp1 (id int primary key, a int, b int, sx int) engine=innodb;

-- select t1.id, t2.a, t1.b, sum(t2.x) from t1,t2 where t1.id=t2.id group by t2.a;


DELIMITER $$
DROP TRIGGER IF EXISTS `tr1`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr1` 
AFTER INSERT ON `t1` 
FOR EACH ROW BEGIN
  insert into tmp1 (id,a,b,sx) values(NEW.id,NEW.a,NEW.b, (select sum(x) from t2 where a=NEW.a) );
END;
$$

DROP TRIGGER IF EXISTS `tr2`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr2` 
AFTER UPDATE ON `t1` 
FOR EACH ROW BEGIN
  -- ovde bi trebao jedan if new.id <> old.id al nema veze
  update tmp1 set id = NEW.id WHERE id = OLD.id; 

  -- ovde bi trebao jedan if new.a <> old.a al nema veze
  update tmp1 set sx = (select sum(x) from t2 where a=NEW.a) where id=NEW.id;

END;
$$

DROP TRIGGER IF EXISTS `tr3`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr3` 
AFTER INSERT ON `t2` 
FOR EACH ROW BEGIN
  update tmp1 set sx = (select sum(t2.x) from t2 where t2.a=tmp1.a) WHERE tmp1.a = NEW.a;
END;
$$

DROP TRIGGER IF EXISTS `tr4`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr4` 
AFTER UPDATE ON `t2` 
FOR EACH ROW BEGIN
  update tmp1 set sx = (select sum(t2.x) from t2 where t2.a=tmp1.a) where tmp1.a in ( NEW.a, ILD.a);
END;
$$

DELIMITER ;


(malopre sam se probudio tako da, mozda sam tu i tamo nesto omasio ali generalno je to princip ... moze to da se optimizuje, posebno za neki realan slucaj)
 
Odgovor na temu

[es] :: MySQL :: Dvije tablice na jedan triger

[ Pregleda: 2106 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

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