Rafael Santiago Postado Julho 13, 2009 Denunciar Share Postado Julho 13, 2009 Pessoal,Tenho duas tabelas de sistemas diferentes e preciso que ao inserir um dado em uma tabela a outra seja atualizada também.ex: TABELA_1 e TABELA_2Quando inserir ou alterar algo em TABELA_1 deve ser feito o mesmo em TABELA_2Quando inserir ou alterar algo em TABELA_2 deve ser feito o mesmo em TABELA_1Tentei usar trigger, mais deu erro pois gera um loop eterno.alguém já precisou disso e tem alguma solução ?Obrigado Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Julho 14, 2009 Denunciar Share Postado Julho 14, 2009 (editado) Oi, 'Rafael Santiago' !Já tentou fazer assim:Tabela 1create table tabela_1( id integer unsigned not null auto_increment, descricao varchar(10), primary key (id)); Tabela 2create table tabela_2( id integer unsigned not null auto_increment, descricao varchar(10), primary key (id)); Trigger da tabela 1DELIMITER $$; DROP TRIGGER `felipe`.`Tabela_1_Insert_after`$$ create trigger `Tabela_1_Insert_after` AFTER INSERT on `tabela_1` for each row BEGIN DECLARE vEOF INT DEFAULT 0; DECLARE result int default 1; DECLARE vID int; DECLARE curTAB_2 CURSOR FOR SELECT ID FROM TABELA_2 WHERE ID = NEW.ID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vEOF = 1; OPEN curTAB_2; FETCH curTAB_2 INTO vID; IF vID IS NULL then SET result = 0; END IF; CLOSE curTAB_2; IF result = 0 then INSERT INTO TABELA_2 (ID, DESCRICAO) VALUES (NEW.ID, NEW.DESCRICAO); END IF; END; $$ DELIMITER;$$ Trigger da tabela 2DELIMITER $$; DROP TRIGGER `felipe`.`Tabela_2_Insert_after`$$ CREATE TRIGGER `felipe`.`Tabela_2_Insert_after` AFTER INSERT on `felipe`.`tabela_2` FOR EACH ROW BEGIN DECLARE vEOF INT DEFAULT 0; DECLARE result int default 1; DECLARE vID int; DECLARE curTAB_1 CURSOR FOR SELECT ID FROM TABELA_1 WHERE ID = NEW.ID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vEOF = 1; OPEN curTAB_1; FETCH curTAB_1 INTO vID; IF vID IS NULL then SET result = 0; END IF; CLOSE curTAB_1; IF result = 0 then INSERT INTO TABELA_1 (ID, DESCRICAO) VALUES (NEW.ID, NEW.DESCRICAO); END IF; END$$ DELIMITER;$$ Teste 1: Tabela 1 acionando trigger e alimentando tabela 2insert into tabela_1 (id, descricao) values (1, 'teste'); Teste 2: Tabela 2 acionando trigger e alimentando tabela 1insert into tabela_2 (id, descricao) values (2, 'teste'); O update Criando o trigger para tabela 1DELIMITER $$; DROP TRIGGER `felipe`.`Tabela_1_Update_after`$$ CREATE TRIGGER `felipe`.`Tabela_1_Update_after` AFTER UPDATE on `felipe`.`tabela_1` FOR EACH ROW BEGIN DECLARE vEOF INT DEFAULT 0; DECLARE result int default 1; DECLARE vID int; DECLARE vDESCRICAO char(10); DECLARE curTAB_2 CURSOR FOR SELECT ID, DESCRICAO FROM TABELA_2 WHERE ID = NEW.ID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vEOF = 1; OPEN curTAB_2; FETCH curTAB_2 INTO vID, vDESCRICAO; IF NOT vID IS NULL THEN IF vDESCRICAO <> NEW.DESCRICAO THEN SET result = 0; END IF; END IF; CLOSE curTAB_2; IF result = 0 then UPDATE TABELA_2 SET DESCRICAO = NEW.DESCRICAO WHERE ID = NEW.ID; END IF; END; $$ DELIMITER;$$ Testanto update tabela_1 set descricao = 'TESTE 1' where id = 1; Para tabela 2 o trigger é:DELIMITER $$; DROP TRIGGER `felipe`.`Tabela_2_Update_after`$$ CREATE TRIGGER `felipe`.`Tabela_2_Update_after` AFTER UPDATE on `felipe`.`tabela_2` FOR EACH ROW BEGIN DECLARE vEOF INT DEFAULT 0; DECLARE result int default 1; DECLARE vID int; DECLARE vDESCRICAO char(10); DECLARE curTAB_1 CURSOR FOR SELECT ID, DESCRICAO FROM TABELA_1 WHERE ID = NEW.ID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vEOF = 1; OPEN curTAB_1; FETCH curTAB_1 INTO vID, vDESCRICAO; IF NOT vID IS NULL THEN IF vDESCRICAO <> NEW.DESCRICAO THEN SET result = 0; END IF; END IF; CLOSE curTAB_1; IF result = 0 then UPDATE TABELA_1 SET DESCRICAO = NEW.DESCRICAO WHERE ID = NEW.ID; END IF; END; $$ DELIMITER;$$No exemplo acima usei um banco de teste chamado felipe.É importante, no update, testar cada um dos campos para saber se um deles foi alterado. Editado Julho 14, 2009 por Denis Courcy Acrescentar notas importantes. Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Rafael Santiago
Pessoal,
Tenho duas tabelas de sistemas diferentes e preciso que ao inserir um dado em uma tabela a outra seja atualizada também.
ex: TABELA_1 e TABELA_2
Quando inserir ou alterar algo em TABELA_1 deve ser feito o mesmo em TABELA_2
Quando inserir ou alterar algo em TABELA_2 deve ser feito o mesmo em TABELA_1
Tentei usar trigger, mais deu erro pois gera um loop eterno.
alguém já precisou disso e tem alguma solução ?
Obrigado
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados