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

Trigger Cycle


Rômulo Augusto

Pergunta

Olá pessoal!

Preciso saber uma forma de evitar ciclos entre as minhas triggers, meu problema é o seguinte:

Existem 2 tabelas, T1 e T2, que serão unidas através da refatoração Merge Tables. Para isso é preciso copiar os campos de T2 para T1 e criar triggers nas duas tabelas para sincronizar os dados atualizados: quando T1 for atualizada, T2 também será e vice-versa.

Como vai haver triggers para atualização nas duas tabelas, isso gera um ciclo: quando a trigger de T1 atualiza T2, a trigger de T2 é disparada e atualizará T1, e assim fica um loop infinito.

Valeu

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
Olá pessoal!

Preciso saber uma forma de evitar ciclos entre as minhas triggers, meu problema é o seguinte:

Existem 2 tabelas, T1 e T2, que serão unidas através da refatoração Merge Tables. Para isso é preciso copiar os campos de T2 para T1 e criar triggers nas duas tabelas para sincronizar os dados atualizados: quando T1 for atualizada, T2 também será e vice-versa.

Como vai haver triggers para atualização nas duas tabelas, isso gera um ciclo: quando a trigger de T1 atualiza T2, a trigger de T2 é disparada e atualizará T1, e assim fica um loop infinito.

Valeu

Oi, Rômulo

Uma solução para isto é colocar ambas as triggers como AFTER UPDATE. Assim, a trigger só será disparada se houver atualização na tabela. O motor do MySQL não faz atualização quando o novo dado é igual ao dado que já está gravado. Logo, a trigger não será disparada.

Uma outra solução, que pode complementar a anterior é perguntar ao trigger de T1 que está disparando a atualização em T2 é se NEW.campo1 é diferente de OLD.campo no ato de invocar a atualização de T2. Se for diferente então houve atualização e o trigger será disparado. se não houve então o campo1 da tabela T1 não dfoi modificado e o trigger não será disparado para atualizar T2. Isto vale para T2 disparando atualização em T1, também)

Espero ter sido claro. Se não fui exponha dúvidas e veremos o que fazer.

Att

Denis Courcy

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

  • 0

Não sei se entendi direito, então vou colocar o código aqui, porque não funcionou:

create trigger t_update_teste2 after update on teste1
for each row
begin
    if new.numero <> old.numero then
      update teste2 set numero = new.numero where teste2.idteste2 = new.idteste1;
    end if;
end;

create trigger t_update_teste1 after update on teste2
for each row
begin
    if new.numero <> old.numero then
      update teste1 set numero = new.numero where teste1.idteste1 = new.idteste2;
    end if;
end;
Aqui o código das tabelas:
DROP TABLE IF EXISTS `pessoa`.`teste1`;
CREATE TABLE  `pessoa`.`teste1` (
  `idteste1` int(10) unsigned NOT NULL auto_increment,
  `nome` varchar(45) NOT NULL,
  `descricao` varchar(45) NOT NULL,
  `numero` varchar(45) default NULL,
  PRIMARY KEY  (`idteste1`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `pessoa`.`teste2`;
CREATE TABLE  `pessoa`.`teste2` (
  `idteste2` int(10) unsigned NOT NULL auto_increment,
  `numero` varchar(45) NOT NULL,
  PRIMARY KEY  (`idteste2`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

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,1k
    • Posts
      651,9k
×
×
  • Criar Novo...