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

(Resolvido) Trigger SQL


neo_soro

Pergunta

Boa tarde pessoal,

to tentando fazer uma trigger para economizar tabelas. Tipo: tenho um tabela saída e nela registro a movimentação de saída. Para não ter que criar uma tabela "contas a pagar" criei apenas um campo pago. Queria que a trigger atualizasse um tabela saldo somente se fosse atualizado o campo pago. No caso eu consigo criar a trigger mas para uma inserção na tabela saida. Mas aí queria atualizar somente quando clicr no campo conforme falei. Segue o script:

mysql> DELIMITER |
mysql> CREATE TRIGGER trg_saida
    -> AFTER INSERT ON saida
    -> FOR EACH ROW BEGIN
    -> UPDATE conta SET saldo = saldo - NEW.valor WHERE idconta = NEW.idconta;
    -> END;
    -> | DELIMITER;

Obrigado

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Oi,'neo_soro'

Por padrão um trigger é disparado automaticaente e independente da intenção do usuário, toda vez que uma ação de atualização (dependendo do tipo de triger, inclusão, atualização ou exclusão de registro) ocorre em determinada tabela.

Para que uma atualização ocorra dependendo da intenção do usuário você tem duas escolhas:

1ª - colocar a instrução de update dentro de um IF OLD.campo <> NEW.campo then e mudar a opção de AFTER para BEFORE do seu triger para que a avaliação possa ser realizada antes que o campo seja modificado.

2ª passar a instrução de um trigger para uma storage procedure, para que seja acionada somente pela vontade do ator.

Link para o comentário
Compartilhar em outros sites

  • 0
Oi,'neo_soro'

Por padrão um trigger é disparado automaticaente e independente da intenção do usuário, toda vez que uma ação de atualização (dependendo do tipo de triger, inclusão, atualização ou exclusão de registro) ocorre em determinada tabela.

Para que uma atualização ocorra dependendo da intenção do usuário você tem duas escolhas:

1ª - colocar a instrução de update dentro de um IF OLD.campo <> NEW.campo then e mudar a opção de AFTER para BEFORE do seu triger para que a avaliação possa ser realizada antes que o campo seja modificado.

2ª passar a instrução de um trigger para uma storage procedure, para que seja acionada somente pela vontade do ator.

Bpa tarde Denis, Muito obrigado. Consegui resolver o meu problema, mas aí entrou outra questão que não sei se seria possível de resolver. Seguinte: para incrementar o código determinei que o campo pago for atulizado e for 0 não dispara a trigger:

mysql> DELIMITER |
mysql> CREATE TRIGGER trg_pago_saida
    -> BEFORE UPDATE ON saida
    -> FOR EACH ROW BEGIN
    -> IF((OLD.pago<>NEW.pago)AND(NEW.pago!=0))THEN
    -> UPDATE conta SET saldo = saldo - NEW.valor WHERE idconta = NEW.idconta;
    -> END IF;
    -> END;
    -> |

No entanto se o usuário atualizar o campo uma vez, para true beleza, altera conforme a crítica. Se eu alterar para false tranquilo não muda nada. Porém se eu alterar para true novamente ela soma ao valor que já se encontra lá. Ou seja, atualizo uma vez com 30, beleza... mudo apra false ainda fica 30, mas se eu atualizo para true novamente fica 60. Acho que pelo banco não dá né?Se caso não farei via programação mesmo. Obrigado. Se não der tópico resolvido. =) :rolleyes:

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'neo_soro'

O correto para o sinal de diferente é <> e você usou !=

-> IF((OLD.pago<>NEW.pago)AND(NEW.pago!=0))THEN

No entanto se o usuário atualizar o campo uma vez, para true beleza, altera conforme a crítica. Se eu alterar para false tranquilo não muda nada. Porém se eu alterar para true novamente ela soma ao valor que já se encontra lá. Ou seja, atualizo uma vez com 30, beleza... mudo apra false ainda fica 30, mas se eu atualizo para true novamente fica 60. Acho que pelo banco não dá né?

Neste caso você terá que pensar em uma lógica para que o campo só seja alterado uma vez. Pois do jeito que você escreveu, todas as vezes que o campo NEW.pago estiver true ele gravará. Lembre-se o triger é disparado independente da vontade do ator.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'neo_soro'

O correto para o sinal de diferente é <> e você usou !=

-> IF((OLD.pago<>NEW.pago)AND(NEW.pago!=0))THEN

Obrigado pelas dicas Denis. Vou fazaer via código mesmo. Agora sobre o sinal ele aceitou normalmente o sinal !=

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...