Вопрос

Я создал хранимую процедуру в 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

Любые идеи были бы полезны.

Это было полезно?

Решение 2

Так что, как выясняется, это проблема, которая мешала мне в течение нескольких часов, верьте, хотите нет.

Я могу легко определить процедуру, называемую, sp_set-comment_count. Однако при вызове указанной процедуры это не работает так же.

Вызовите sp_set -comment_count (я могу только предположить, что это потому, что сервер интерпретирует - как минус).

С тех пор я изменил имя хранимой процедуры, чтобы использовать только подчеркивание, и, похоже, все разрешило все.

Другие советы

Есть большая причина, по которой вы никогда не должны вызывать хранимые процедуры из триггеров.

Триггеры, по своей природе, хранятся процедуры. Их действия практически трудно отказаться от. Анкет Даже если все базовые таблицы являются InnoDB, вы испытаете пропорциональный объем общих замков строк и раздражающей прерывистости из эксклюзивных замков строк. Так было бы, если бы триггеры манипулировали таблицами Вставки и обновления стагнируются для выполнения тяжелой работы MVCC Внутри каждого вызова на триггер.

Не забывайте, что триггеры требуют накладных расходов. На самом деле, согласно MySQL хранящаяся процедура Программирование, стр. 256 под головой "Trigger Overh Head Hear" говорит следующее:

Важно помнить, что по необходимости триггеры добавляют накладные расходы к заявлению DML, к которому они применяют. Фактическое количество накладных расходов будет зависеть от природы триггера, но-как все триггеры MySQL выполняются для каждой строки-накладные расходы могут быстро накапливаться для операторов, которые обрабатывают большое количество строк. Поэтому вам следует избегать размещения каких -либо дорогих заявлений SQL или процедурного кода в триггеры.

Расширенное объяснение триггеров дается на страницах 529-531. В заключительном пункте этого раздела указывается следующее:

Урок здесь заключается в следующем: поскольку код триггера будет выполняться один раз для каждой строки, затронутой оператором DML, триггер может легко стать наиболее значимым фактором в производительности DML. Код внутри кузова триггера должен быть настолько легким, насколько это возможно, и, в частности, любые операторы SQL в триггере должны поддерживаться индексами, когда это возможно.

Я объяснил другие неприятные аспекты триггеров в предыдущем посте.

РЕЗЮМЕ

я бы настоятельно рекомендую не вызывать никаких хранимых процедур с триггера, даже если MySQL позволяет это. Вы должны проверить текущие ограничения для MySQL 5.5.

Если это говорит об ошибке синтаксиса, наиболее вероятно, что вы забыли изменить разделитель (как вы это сделали для хранимой процедуры). Так что вам нужно

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

Похоже на запятую после AC это синтаксическая ошибка:

UPDATE usergroups
   SET allCount = AC,
 WHERE ........
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top