Eu criei um procedimento armazenado no mysql usando a seguinte sintaxe.
DROP PROCEDURE IF EXISTS `sp-set_comment_count`;
DELIMITER $$
CREATE PROCEDURE `sp_set-comment_count` (IN _id INT)
BEGIN
-- AC - AllCount
DECLARE AC INT DEFAULT 0;
SELECT COUNT(*) AS ac
INTO AC
FROM usergroups AS ug
LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id`
LEFT JOIN mediagallery AS dm ON ugm.mid = dm.`id`
WHERE dm.`status` NOT IN (200, 201, 202, 203, 204, 205)
AND ug.`id` = _id;
UPDATE usergroups
SET allCount = AC,
WHERE usergroups.`id` = _id;
END $$
DELIMITER ;
Para sua informação, simplifiquei bastante o procedimento armazenado, mas sei que funciona sem problemas.
O que eu gostaria de poder fazer é configurar um gatilho de usergroup_comments que funciona assim.
DROP TRIGGER IF EXISTS `usergroups_comments_insert`
CREATE TRIGGER `usergroups_comments_insert` AFTER INSERT ON `usergroups_comment`
FOR EACH ROW
BEGIN
CALL sp-set-comment_count(NEW.`gid`);
END;
Mas, por algum motivo, toda vez que eu faço o mysql lança um erro para mim que é menos do que útil, afirmando que há um erro de sintaxe na linha 4.
Eu vasculhei a documentação do mysql e encontrei algumas informações sobre restrições de gatilhos, mas achei bastante complicado.
http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html
Qualquer idéia será útil.
Há uma grande razão pela qual você nunca deve chamar procedimentos armazenados de dentro de gatilhos.
Os gatilhos são, por natureza, procedimentos armazenados. Suas ações são virtualmente difíceis de reverter . Mesmo que todas as tabelas subjacentes sejam InnoDB, você experimentará um volume proporcional de bloqueios de linha compartilhados e intermitência irritante de bloqueios de linha exclusivos. Esse seria o caso se os gatilhos estivessem manipulando tabelas com INSERTs e UPDATEs estagnados para executar MVCC de serviço pesado dentro de cada chamada para um gatilho .
Não se esqueça de que os gatilhos exigem sobrecarga. De fato, De acordo com MySQL Stored Procedure Programming , página 256 sob o título "Trigger Overhead" diz o seguinte:
Uma explicação expandida da sobrecarga do acionador é fornecida nas páginas 529-531. O ponto de conclusão dessa seção afirma o seguinte:
Expliquei outros aspectos desagradáveis dos gatilhos em um post anterior.
RESUMO
Eu recomendo fortemente não chamar nenhum procedimento armazenado de um Trigger , mesmo que o MySQL permita. Você deve verificar as restrições atuais para o MySQL 5.5 .
Então, acontece que essa é a questão que me atormentou por algumas horas, acredite ou não.
Posso definir facilmente um procedimento chamado sp_set-comment_count. No entanto, ao chamar o referido procedimento, ele não funciona da mesma maneira.
CALL sp_set-comment_count (só posso supor que isso ocorre porque o servidor interpreta o - como um sinal de menos).
Desde então, alterei o nome do procedimento armazenado para usar apenas sublinhados e parece ter resolvido tudo.
Se ele diz sobre erro de sintaxe, provavelmente você esqueceu de alterar o delimitador (como fez para o procedimento armazenado). Então você precisa
Parece que a vírgula depois
AC
é um erro de sintaxe: