He creado un procedimiento almacenado en mysql usando la siguiente sintaxis.
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 su información, he simplificado enormemente el procedimiento almacenado, pero sé que funciona sin ningún problema.
Lo que me gustaría poder hacer es configurar un activador desde usergroup_comments que funcione de esta manera.
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;
Pero por alguna razón, cada vez que hago mysql me arroja un error que no es útil, indicando que hay un error de sintaxis en la línea 4.
Revisé la documentación de mysql y encontré información sobre las restricciones de los desencadenantes, pero la encontré bastante complicada.
http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html
Cualquier idea sería útil.
mysql
stored-procedures
trigger
Mark D
fuente
fuente
Respuestas:
Hay una gran razón por la cual nunca debe llamar a los procedimientos almacenados desde dentro de los disparadores.
Los disparadores son, por naturaleza, procedimientos almacenados. Sus acciones son prácticamente difíciles de revertir . Incluso si todas las tablas subyacentes son InnoDB, experimentará un volumen proporcional de bloqueos de fila compartidos e intermitencia molesta de bloqueos de fila exclusivos. Tal sería el caso si los activadores estuvieran manipulando tablas con INSERT y ACTUALIZACIONES estancadas para realizar MVCC de servicio pesado dentro de cada llamada a un activador .
No olvide que los disparadores requieren gastos generales. De hecho, de acuerdo con la programación de procedimientos almacenados de MySQL , la página 256 debajo del encabezado "Trigger Overhead" dice lo siguiente:
En las páginas 529-531 se ofrece una explicación ampliada de la sobrecarga del activador. El punto final de esa sección establece lo siguiente:
Expliqué otros aspectos desagradables de Triggers en una publicación anterior.
RESUMEN
Me gustaría recomendar encarecidamente no llamar a los procedimientos almacenados de un gatillo , aunque MySQL permite. Debería consultar las restricciones actuales para MySQL 5.5 .
fuente
Resulta que este es el problema que me atormentó durante unas horas, lo creas o no.
Puedo definir fácilmente un procedimiento llamado sp_set-comment_count. Sin embargo, al llamar a dicho procedimiento, no funciona de la misma manera.
LLAME a sp_set-comment_count (solo puedo suponer que esto se debe a que el servidor interpreta el - como un signo menos).
Desde entonces he cambiado el nombre del procedimiento almacenado para usar solo guiones bajos y parece haber resuelto todo.
fuente
CALL `sp-set-comment_count`(NEW.`gid`);
Si dice acerca del error de sintaxis, lo más probable es que haya olvidado cambiar el delimitador (como lo hizo para el procedimiento almacenado). Así que tú necesitas
fuente
Parece que la coma después
AC
es un error de sintaxis:fuente