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 a partir 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 alguma razão, toda vez que eu faço o mysql lança um erro para mim, isso é menos do que útil, afirmando que há um erro de sintaxe na linha 4.
Eu procurei na 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.
mysql
stored-procedures
trigger
Mark D
fonte
fonte
Respostas:
Há uma grande razão pela qual você nunca deve chamar procedimentos armazenados a partir de gatilhos.
Os gatilhos são, por natureza, procedimentos armazenados. Suas ações são praticamente difíceis de reverter . Mesmo que todas as tabelas subjacentes sejam o InnoDB, você experimentará um volume proporcional de bloqueios de linha compartilhados e intermitência irritante dos 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 esqueça que os gatilhos exigem sobrecarga. De fato, de acordo com a Programação de procedimentos armazenados do MySQL , a página 256, sob o cabeçalho "Trigger Overhead", diz o seguinte:
Uma explicação expandida da sobrecarga do acionador é fornecida nas páginas 529-531. O ponto final dessa seção afirma o seguinte:
Expliquei outros aspectos desagradáveis do Triggers em um post anterior.
RESUMO
Eu recomendaria 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 .
fonte
Acontece que esse é o problema que me atormentou por algumas horas, acredite ou não.
Eu posso definir facilmente um procedimento chamado sp_set-comment_count. No entanto, ao chamar o referido procedimento, ele não funciona da mesma maneira.
CHAMADA sp_set-comment_count (só posso assumir 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.
fonte
CALL `sp-set-comment_count`(NEW.`gid`);
Se houver algum erro de sintaxe, é mais provável que você tenha esquecido de alterar o delimitador (como fez no procedimento armazenado). Então você precisa
fonte
Parece que a vírgula depois
AC
é um erro de sintaxe:fonte