Я создал хранимую процедуру в MySQL, используя следующий синтаксис.
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 ;
К вашему сведению, я значительно упростила хранимую процедуру, но знаю, что она работает без проблем.
Я хотел бы иметь возможность настроить триггер из usergroup_comments, который работает следующим образом.
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;
Но по какой-то причине каждый раз, когда я делаю это, mysql выдает ошибку, которая не очень полезна, так как в строке 4 есть синтаксическая ошибка.
Я просмотрел документацию по mysql и нашел некоторую информацию об ограничениях триггеров, но нашел ее довольно запутанной.
http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html
Любые идеи будут полезны.
mysql
stored-procedures
trigger
Марк Д
источник
источник
Ответы:
Есть веская причина, по которой вы никогда не должны вызывать хранимые процедуры изнутри триггеров.
Триггеры по своей природе являются хранимыми процедурами. Их действия практически трудно откатить . Даже если все базовые таблицы являются InnoDB, вы будете испытывать пропорциональный объем общих блокировок строк и раздражающую прерывистость от исключительных блокировок строк. Так было бы, если бы триггеры манипулировали таблицами со стагнациями INSERT и UPDATE для выполнения MVCC в тяжелых условиях внутри каждого вызова триггера .
Не забывайте, что триггеры требуют накладных расходов. На самом деле, согласно программированию хранимых процедур MySQL , страница 256 под заголовком «Служебная нагрузка триггера» говорит следующее:
Подробное объяснение накладных расходов триггера приведено на страницах 529-531. Заключительный пункт из этого раздела гласит следующее:
Я объяснил другие неприятные аспекты триггеров в предыдущем посте.
РЕЗЮМЕ
Я настоятельно рекомендую не вызывать хранимые процедуры из Trigger , даже если MySQL это позволяет. Вам следует проверить текущие ограничения для MySQL 5.5 .
источник
Вот и получается, что это проблема, которая мучила меня несколько часов, хотите верьте, хотите нет.
Я могу легко определить процедуру с именем sp_set-comment_count. Однако при вызове указанной процедуры она не работает так же.
CALL sp_set-comment_count (я могу только предположить, что это потому, что сервер интерпретирует - как минус).
С тех пор я изменил имя хранимой процедуры, чтобы использовать только подчеркивания, и, похоже, все решено.
источник
CALL `sp-set-comment_count`(NEW.`gid`);
Если это говорит о синтаксической ошибке, скорее всего вы забыли изменить разделитель (как вы сделали для хранимой процедуры). Так вам нужно
источник
Похоже, запятая после
AC
синтаксической ошибки:источник