Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ricardo Galvão

[Resolvido] Triggers para log de exclusão e alteração de cadastro

Recommended Posts

Ola pessoal !!!

 

Sou membro antigo aki, porém entro pouco, como estou iniciando minha carreira acadêmica, devo entrar mais agora e tentar ajudar as pessoas com dúvida como eu (neste momento) pra também aprender, mas vamos, lá !

Meu problema é simples demais, mas já varri vários fórums e não consegui uma resposta que me salve e não sei como fazer ou o que está errado.

Tenho uma tabela e preciso gravar o registro que for excluído ou alterado em uma outrra tabela (log).

Ocorre que não acho a sintaxe correta pra fazer isso no mysql em uma única TRIGGER.

DELIMITER $$

USE `teste-extjs`$$

DROP TRIGGER /*!50032 IF EXISTS */ `email_log`$$

CREATE
   /*!50017 DEFINER = 'root'@'localhost' */
   TRIGGER `email_log` BEFORE UPDATE ON `ab_emails` 
   FOR EACH ROW BEGIN
INSERT INTO log_email(log_email,log_user_id,log_comp_id) VALUES(OLD.email,OLD.user_id,OLD.comp_id);	
   END;
$$

DELIMITER ;

Dessa forma, funciona perfeitamente, porém só dispara com update eu precisava que disparasse com delete também !!!

vi em um fórum onde o cara usava algo assim:

 

TRIGGER `email_log` BEFORE UPDATE OR DELETE ON `ab_emails`

 

mas aqui não funcionou não, dá erro de sintaxe.

 

Agradeço a ajuda de todos

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pergunta: pq está usando o before?

O ideal não seria AFTER? Ou seja, SE ocorrer a inserção, aí sim grava na logs ?

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, entendi..

 

Mas e se caso não acontecesse a exclusão por algum problema.. O mais aconselhável não seria AFTER?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, agradeço imensamente, mas a solução surgiu quando o inglês da documentação foi interpretado corretamente.

Não é possível criar duas triggers para mesma tabela. (Ponto) Desde que estas triggers disparem com o mesmo tempo e evento (trigger_time+trrigger_event).

Ou seja, como eu quero que ele dispare before update (antes de atualizar) e before delete (antes de apagar), então temos dois trigger_time + trrigger_event diferentes, podendo ou melhor devendo assim criar uma trigger pra cada um. Exemplo: duas triggers disparando Before Delete não seria possível.

 

Resultado, primeira Trigger:

DELIMITER $$

CREATE
   TRIGGER `email_bu` BEFORE UPDATE ON `ab_emails` 
   FOR EACH ROW BEGIN
INSERT INTO log_email(log_email,log_user_id,log_comp_id) VALUES(OLD.email,OLD.user_id,OLD.comp_id);	
   END;
$$

DELIMITER ;

A outra:

DELIMITER $$

CREATE
   TRIGGER `email_bd` BEFORE DELETE ON `ab_emails` 
   FOR EACH ROW BEGIN
INSERT INTO log_email(log_email,log_user_id,log_comp_id) VALUES(OLD.email,OLD.user_id,OLD.comp_id);	
   END;
$$

DELIMITER ;

Certo então? agradeço a boa vontade dos colegas.

 

Ps: TRIGGER `email_bd` BEFORE DELETE,BERFORE UPDATE ON `ab_emails` não funciona.

TRIGGER `email_bd` BEFORE DELETE OR BERFORE UPDATE ON `ab_emails` também não, mas esse último, parecece que em outros bancos funciona, só no mysql que não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.