J'ai créé une procédure stockée dans mysql en utilisant la syntaxe suivante.
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 ;
Pour info j'ai considérablement simplifié la procédure stockée mais je sais que cela fonctionne sans aucun problème.
Ce que j'aimerais pouvoir faire, c'est configurer un déclencheur à partir de usergroup_comments qui fonctionne comme ceci.
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;
Mais pour une raison quelconque, chaque fois que je fais, mysql me lance une erreur qui n'est pas utile en déclarant qu'il y a une erreur de syntaxe à la ligne 4.
J'ai parcouru la documentation mysql et trouvé quelques informations sur les restrictions des déclencheurs mais je l'ai trouvée assez compliquée.
http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html
Toutes les idées seraient utiles.
mysql
stored-procedures
trigger
Mark D
la source
la source
Réponses:
Il y a une bonne raison pour laquelle vous ne devez jamais appeler des procédures stockées à partir de déclencheurs.
Les déclencheurs sont, par nature, des procédures stockées. Leurs actions sont pratiquement difficiles à annuler . Même si toutes les tables sous-jacentes sont InnoDB, vous rencontrerez un volume proportionnel de verrous de ligne partagés et une intermittence gênante de verrous de ligne exclusifs. Ce serait le cas si les déclencheurs manipulaient des tables avec des INSERT et des UPDATE stagnant pour effectuer un MVCC robuste à l'intérieur de chaque appel à un déclencheur .
N'oubliez pas que les déclencheurs nécessitent des frais généraux. En fait, selon MySQL Stored Procedure Programming , page 256 sous la rubrique "Trigger Overhead" dit ce qui suit:
Une explication détaillée de la surcharge de déclenchement est donnée aux pages 529-531. Le point de conclusion de cette section indique ce qui suit:
J'ai expliqué d'autres aspects désagréables des déclencheurs dans un post précédent.
SOMMAIRE
Je recommande fortement de ne pas appeler de procédures stockées à partir d'un déclencheur , même si MySQL le permet. Vous devriez vérifier les restrictions actuelles pour MySQL 5.5 .
la source
Il s'avère donc que c'est le problème qui m'a tourmenté pendant quelques heures, croyez-le ou non.
Je peux facilement définir une procédure appelée sp_set-comment_count. Cependant, lors de l'appel de ladite procédure, cela ne fonctionne pas de la même manière.
APPELER sp_set-comment_count (je peux seulement supposer que c'est parce que le serveur interprète le - comme un moins).
J'ai depuis changé le nom de la procédure stockée pour n'utiliser que des traits de soulignement et il semble avoir tout résolu.
la source
CALL `sp-set-comment_count`(NEW.`gid`);
S'il indique une erreur de syntaxe, il est fort probable que vous ayez oublié de modifier le délimiteur (comme vous l'avez fait pour la procédure stockée). Vous avez donc besoin
la source
On dirait que la virgule après
AC
est une erreur de syntaxe:la source