Ir para conteúdo
Fórum Script Brasil
  • 0

Duas tabelas com os mesmos dados


Rafael Santiago

Pergunta

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

  • 0

Oi, 'Rafael Santiago' !

Já tentou fazer assim:

Tabela 1

create table tabela_1(
id integer unsigned not null auto_increment,
descricao varchar(10),
primary key (id));
Tabela 2
create table tabela_2(
id integer unsigned not null auto_increment,
descricao varchar(10),
primary key (id));
Trigger da tabela 1
DELIMITER $$;

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 2
DELIMITER $$;

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 2
insert into tabela_1 (id, descricao)
values (1, 'teste');
Teste 2: Tabela 2 acionando trigger e alimentando tabela 1
insert into tabela_2 (id, descricao)
values (2, 'teste');
O update Criando o trigger para tabela 1
DELIMITER $$;

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 por Denis Courcy
Acrescentar notas importantes.
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...