entendendo trigger BEFORE e AFTER

já entendi (em parte) porque numa aplicação de cadastro da tabela ‘unidade’ recebo o seguinte erro:

Erro ao alterar a base de dados:
Can’t update table ‘unidade’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

tenho essa trigger na BD que, entre outras coisas, faz o seguinte:

  1. atualiza um registro na mesma tabela com outro valor.
  2. atualiza o mesmo registro dependendo de condições.

Pergunta: dividindo o trigger em parte BEFORE e o resto no AFTER questiono SE houver algum erro no trigger no BEFORE ele ainda executará o trigger AFTER ?

porque neste caso teria de desfazer as alterações que ele fez no BEFORE, e caio num circulo vicioso terrivel.

Facilitando a ideia: se voce atualizar o registro 4 dizendo que ele pertence a outra classe de produto, preciso tirar a quantidade dessa classe e atualizar o saldo da classe que selecionei agora.
Se faço a baixa no BEFORE e der erro no AFTER, tô ferrado.

agradeço ideias.

Amigo, não tem como fazer uma operação de statment na mesma tabela que está executando a trigger.
Se quer alterar um valor use no evento BEFORE INSERT ou UPDATE, com a opção:

set new.campo = valor;

Se der algum erro no statment sua ação não será feita.

NO CASO, exemplificando, já que o google por vezes enlouquece a gente:

tenho triggers na tabelaA, tabelaB e tabelaC para insert, update e delete.

Considerando que a tabelaB, num trigger faça um insert na tabelaA, ISSO DISPARARIA o trigger insert da tabelaA?

ou se eu fizer num trigger update na tabelaC, onde dentro desse trigger estou fazendo um delete e um update em outras tabelas, ISSO DISPARARIA os respectivos triggers das referidas tabelas (respectivos triggers delete e update)?

… finalmente.

"Desculpe pelo mico. Reli o manual e a conclusão é que não é possível dar qualquer comando (insert/update ou delete), para a mesma tabela, dentro da trigger que está sendo executada.
Não é possível, também, chamar uma storage procedure ou função, que faça esta tarefa (insert/update ou delete para a mesma tabela), dentro da trigger.
A solução é via programação. Após você commitar a transação, dê um update para atualizar os dados necessários. "

Se você quer alterar os dados do INSERT OU UPDATE da mesma tabela da trigger, basta altera-lo manualmente. Uma certeza eu tenho, funciona no BEFORE do Update ou do Insert, já não sei no AFTER. Tipo na minha tabela cliente tem o campo ‘Adicional’, toda vez que alterar um cliente quero adicionar nesse campo que o cliente foi alterado e colocar a dada, ex:

na TRIGGER BEFORE UPDATE:

set new.Adicional = concat(old.Adicional, "Cliente Alterado as ", now(), "\r\n");

O que esse exemplo faz, a cada alteração na tabela “cliente”, vai ser adicionado no campo Adicional(TEXT) a frase Cliente Alterado as {DATA}.
Não precisei fazer um UPDATE novamente, peguei carona no UPDATE enviado, alterei os dados diretamente.

obrigado eliezer,

vou por em pratica esse assunto.

agradeço as sugestoes.