Jump to content
Douglas .A

Solução alternativa erro #1442 em trigger after update

Recommended Posts

Senhores(as),
Há tempos, e depois de muitas pesquisas, ainda estou com o problema em aberto:

1. Ao atualizar uma coluna de uma determinada linha de uma tabela,

2. Mover ou copiar essa linha para outra tabela (Ex.: tableBackup), e APAGAR essa linha na tabela atual.

 

Estou usando trigger AFTER UPDATE na tabela que é atualizada para copiar a linha para outra tabela e funciona.

Contudo, na "tabelaBackup" que recebe a linha, eu usei trigger AFTER INSERT para apagar a linha na tabela de origem e não funciona:

-- O erro: #1442 - Can't update table 'produtos' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

 

Eu li que não é possível executar dois comandos de alteração na mesma tabela 'aberta', é o que o erro acima diz.

Alguém tem uma solução ou ajuda?

Agradeço.

 

TRIGGER AFTER UPDATE na tabela origem:

CREATE TRIGGER `Copiar` AFTER UPDATE ON `tabela1`
FOR EACH ROW BEGIN
IF NEW.a IS NOT NULL THEN
		SET @ID = NEW.`id`;
		INSERT INTO tabelaBackup SELECT * FROM tabela1 WHERE `id`= @ID AND `a` IS NOT NULL;
END IF;
END

TRIGGER AFTER INSER na tabela destino:

CREATE TRIGGER `Apagar` AFTER INSERT ON `tabelabackup`
FOR EACH ROW BEGIN
	DELETE FROM tabela1 WHERE `id` = @ID AND `a` IS NOT NULL;
END

 

Share this post


Link to post
Share on other sites

Se se vai deletar o registro não seria mais simples uma operação de DELETE ?

A Trigger seria de DELETE e faria um simples Insert na tabela de log.

 

 

Share this post


Link to post
Share on other sites

 

10 minutos atrás, Motta disse:

Se se vai deletar o registro não seria mais simples uma operação de DELETE ?

Sim, mas preciso manter uma cópia da linha inteira na tabela backup e apagar na tabela1.

 

10 minutos atrás, Motta disse:

A Trigger seria de DELETE e faria um simples Insert na tabela de log.

A questão é que o banco não aceita durante o UPDATE da tabela1, fazer um delete nessa mesma tabela.

 

A ordem em que os fatos ocorrem é:

1. Update tabela 1; (sempre após esse evento)

2. Insert tabelabackup; (copiar a linha atualizada no item 1 para tabelabackup)

3. Delete tabela 1; (apagar a linha atualizada no item 1)

Share this post


Link to post
Share on other sites

Troque por um DELETE na tabela1

E

Uma trigger insere na bkp

 

 

Share this post


Link to post
Share on other sites

Confesso não ter entendido o problema original apagar uma linha que foi alterada.

 Talvez se você detalhar melhor o problema.

Share this post


Link to post
Share on other sites
2 minutos atrás, Motta disse:

Confesso não ter entendido o problema original apagar uma linha que foi alterada.

 Talvez se você detalhar melhor o problema.

Vou tentar melhorar a explicação, @Motta:

  • O DISPARADOR para iniciar tudo é quando a tabela1 recebe um UPDATE vindo de uma aplicação. Isso eu não posso mudar. É o único evento no qual tenho como referência para desencadear os demais. Vou exemplificar: O usuário finalizou a sessão, logo, o campo 'SessaoFinalizada' da tabela1 é preenhcido.
  • Sendo assim, a tabela1 recebe uma sql UPDATE; (É necessário atualizar a linha antes)
  • Após essa UPDATE, eu não preciso mais dessa linha na tabela1;
  • Preciso inserir essa linha na tabelabackup; (Preciso manter o histórico de sessões do usuário)
  • Em seguida apagar essa linha da tabela1; (Para esvaziar sessões fechadas e liberar espaço nessa tabela)

Share this post


Link to post
Share on other sites

Entendi.

Uma solução que me ocorre e trocar a trigger por uma procedure chamada por um EVENT.

 

 

Share this post


Link to post
Share on other sites
Em 02/03/2018 at 18:25, Motta disse:

Uma solução que me ocorre e trocar a trigger por uma procedure chamada por um EVENT.

Me resta isso mesmo.

A solução proposta então será:

1. Mantenho a TRIGGER pra inserir na tabelabackup (cópia) da linha toda vez que ela receber a atualização específica.

2. Adiciono um evento pra apagar na tabela1 todas as linhas que já estão na tabelabackup. 

Share this post


Link to post
Share on other sites

Eu faria tudo no event (insert na backup delete) pois a transação do update fica mais rápida , o event tem de ser pensado para reduzir chances de travamento.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By AndersonWS
      Meu site está caindo muito nos últimos dias. Basicamente acessa e não aparece nada, uma tela em branco. O pessoal da hospedagem falou que tenho que otimizar o banco de dados e que o problema é esse. Acho estranho pois o mesmo site não caia e agora "do nada" tem esse problema. Fiz um teste de tracert no cmd para ver as rotas e deu a mensagem: Esgotado o tempo limite do pedido. Isso me parece o problema e não o banco de dados.
      Otimização do banco tem alguma coisa a ver com essa mensagem?
      Poderia o site por não estar muito otimizado simplesmente não mostrar nada na tela? Não deveria carregar ao menos o html?
      Se não for o local certo da pergunta me perdoem mas como falaram que o problema era o banco de dados postei aqui.
      Grato.
    • By mm_edilson
      Olá. Tenho uma página de login, que salvei como index.php. Quando o usuário entra com login e senha corretos, a página redireciona para outra página, a index2.php. É uma página independente, não sendo viável no meu projeto colocá-la como um include na página principal.
      Tudo funciona. Exceto que, se o usuário, sem logar, digitar o endereço completo da página, ou seja, www.meusite.com.br/index2.php, ela abre normalmente. Como fazer para que ela não abra, se não passar antes pela página de login?
      Esta é minha página index.php:
      </style> <?php include('app/connection.php'); ?> </head> <body> <div id="corpo"> <center><img src="app/img/logo.png" width="500" height="210"></center></div><BR> <div id="paginas"> <?php @session_start(); include('valida_user.php'); ?> </div> Esta é a página valida_user.php
      <?php @session_start(); if(isset($_POST['enviar'])){ $usuario = $_POST['usuario']; $senha = $_POST['senha']; if($usuario ==''){echo "<h4>Por favor, insira um nome de usuário válido</h4>"; }else if($senha ==''){echo "<h4>Por favor, insira sua senha</h4>"; }else{ $sql = "SELECT * FROM usuarios WHERE usuario = '$usuario' AND senha = '$senha' "; $result = mysqli_query($conexao, $sql); if(mysqli_num_rows($result) > 0){ while($res = mysqli_fetch_array($result)){ $ativo = $res['ativo']; $nivel = $res['nivel']; $usuario = $res['usuario']; $senha = $res['senha']; $email = $res['email']; $nome = $res['nome']; $cadastro = $res['cadastro']; header("Location: index2.php"); exit; } }else{ echo "<center><h3>Usuário ou senha inválidos</h3></center>"; } } } ?>  
    • By Xicara
      Olá boa tarde!
       Eu tenho um jogo e um site para cadastro de contas. E agora estou querendo implementar um sistema VIP de preferencia com dias para acabar! No meu  banco de dados do jogo, tenho a tabela: contas com os campos: id / senha / ip / e agora adicionei o campo vip, o valor é de 1 a 5 e já esta funcional no jogo porém esse beneficio está permanente para os jogadores, minha duvida é: o valor do campo vip tem como eu programar para cada 30 dias zerar novamente automático? Não zerar de todos, mais sim daquele que atingiu os 30 dias, eu estava pensando em adicionar mais um campo: data de inicio, será que tem possibilidade por exemplo o site identificar a data e excluir o valor do campo quando atingir os 30 dias?
      Obrigado pela atenção!
    • By BrunoMga07
      Pessoal alguém pode me ajudar em meu projeto, não sei muito de php e mysql mais estou com uma ideia e queria colocar em pratica, se alguém conseguir fazer e quiser combinar um valor me só mandar mensagem.
       
      Quero criar um sistema em que terá as seguintes informações:
      1° Criar conta / logar
       - Tela usuário: Perfil, Trocar Senha, Saldo da conta, recarregar saldo, sacar saldo.
       - Historico de transações.
      2° Menu Horizontal: Inicio , PPP , APOSTA , CONTATO
       - Inicio: Informações que posso adicionar.
       - PPP: pix para pix: aparece um menu vertical mostrando as opção ex:
      1 para 4 - APARECE UMA TABELA EM QUE MOSTRA O PRIMEIRO USUARIO, COM 4 ENVIOS QUE SERÁ EFETUADO POR OUTRAS PESSOAS.
      2 para 8
      3 para 12
      4 para 16
      EXEMPLO
          USUARIO 1
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
          USUARIO 2
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
          USUARIO 3
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
          ENVIAR  1 PONTO
      Quando o usuario enviar 1 ponto para o usuario 1 ele será adicionado em usuario 2 esperando a vez dele para receber pontos.
      se já tiver um usuario 2 ele será incluido no usuario 3, quando o usuario 1 estiver completo ele será removido da lista
      e podera participar novamento. Só será possivel 1 envio de ponto por usuario.
      algumas regras: se o usuario 1 não estiver completo com 4 envios de 4 usuarios diferente não passa para o usuario 2. e quando algum usuario envia um ponto será removido 1 ponto dele e enviado para o usuario que ele enviou.
    • By biakelly
      Oi pessoal.
       
      Hoje trago uma dúvida que ainda preciso saber como começar.
       
      Tenho um cliente que tem um colégio de idioma pequeno onde ele possui atualmente 20 alunos
      Por algum motivo que não sei explicar ele registra notas diárias para os alunos (sim isso é estranho), portanto na planilha dele tem duas colunas: Nome do aluno e nota (a nota vai de 5 a 10)
       
      Ele quer subir esse excel para um banco de dados e exibir "notas do dia" para os alunos.
       
      Exemplo aluno entra na página e lá tem diversos links (data e horário) o aluno clica nele e exibe a nota de todos alunos na página.
       
      Bem, alguma idéia de como posso fazer isso?
       
      Sim, ja tentei convence-lo para construir um sistema onde cada aluno possa ver sua própria nota, mas não consegui :/ 
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.