Question

J'ai créé une procédure stockée dans une base 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 votre information, j'ai grandement simplifié la procédure stockée, mais je ne sais que cela fonctionne sans aucun problème.

Ce que je voudrais être en mesure de faire est de mettre en place un déclencheur de usergroup_comments qui fonctionne comme celui-ci.

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 renvoie une erreur à moi qui est moins utile indiquant qu'il ya une erreur de syntaxe en ligne 4.

Je l'ai passé au peigne fin la documentation de MySQL et trouvé quelques informations sur les restrictions de déclencheurs, mais je l'ai trouvé assez alambiqué.

http://dev.mysql.com/doc/refman/5.1 /en/stored-program-restrictions.html

Toutes les idées seraient utiles.

Était-ce utile?

La solution 2

Ainsi, il se c'est la question qui me harcelaient pour quelques heures croire ou non.

Je peux facilement définir une procédure appelée, sp_set-COMMENT_COUNT. Cependant lors de l'appel ladite procédure, il ne fonctionne pas de la même manière.

APPEL sp_set-COMMENT_COUNT (je ne peux que supposer que cela est parce que les interprète serveur les - comme moins).

Je l'ai depuis changé le nom de la procédure stockée pour underscores d'utilisation seulement et il semble avoir tout résolu.

Autres conseils

Il y a une grande raison pour laquelle vous ne devriez jamais appeler des procédures stockées à partir des triggers.

Les déclencheurs sont, par nature, des procédures stockées. Leurs actions sont pratiquement difficiles à faire reculer le . Même si toutes les tables sous-jacentes sont InnoDB, vous ferez l'expérience d'un volume proportionnel des verrous de lignes partagées et intermittences ennuyeux de verrous ligne exclusifs. Tel serait le cas si les déclencheurs manipulaient des tables avec et INSERTs étant stagnaient à UPDATEs effectuer lourds MVCC l'intérieur de chaque appel à un déclencheur .

Ne pas oublier que les déclencheurs ont besoin les frais généraux. En fait, selon MySQL procédure stockée programmation , la page 256 sous la tête "Trigger Overhead" dit ce qui suit:

Il est important de se rappeler que, par nécessité, les déclencheurs ajoutent les frais généraux la déclaration de DML auquel ils se rapportent. le montant réel des frais généraux dépendra de la nature de la détente, mais --- comme tout MySQL déclencheurs exécutent POUR CHAQUE LIGNE --- les frais généraux peut accumuler rapidement des déclarations qui traitent un grand nombre de lignes. Vous devriez donc éviter de placer des instructions SQL coûteuses ou de procédure code dans les déclencheurs.

Une explication approfondie des frais généraux de déclenchement est donnée aux pages 529-531. Le point final de cette section stipule ce qui suit:

La leçon ici est la suivante: puisque le code de déclenchement exécutera une fois pour chaque ligne affectée par une instruction DML, la gâchette peut facilement devenir le facteur le plus important dans la performance DML. Code à l'intérieur du corps a besoin déclenchement d'être aussi léger que possible et - notamment - toutes les instructions SQL dans le déclencheur doivent être pris en charge par index chaque fois que possible.

je l'ai expliqué d'autres aspects désagréables de Triggers dans un précédent post .

SOMMAIRE

Je recommande vivement de ne pas appeler des procédures stockées à partir d'un déclencheur , même si MySQL permet. Vous devez wlays vérifier les restrictions pour MySQL 5.5 .

S'il est dit sur l'erreur de syntaxe, le plus probablement vous avez oublié de delimiter de changement (que vous avez fait pour la procédure stockée). Vous avez donc besoin

DELIMITER $$
CREATE TRIGGER `usergroups_comments_insert` AFTER INSERT ON `usergroups_comment`
FOR EACH ROW
BEGIN
   CALL sp_set_count(NEW.`gid`);
END;
$$

On dirait que la virgule après AC est une erreur de syntaxe:

UPDATE usergroups
   SET allCount = AC,
 WHERE ........
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top