Utworzyłem procedurę przechowywaną w mysql przy użyciu następującej składni.
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 ;
Do waszej informacji znacznie uprościłem procedurę przechowywaną, ale wiem, że działa ona bez żadnych problemów.
To, co chciałbym móc zrobić, to skonfigurować wyzwalacz z usergroup_comments, który działa w ten sposób.
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;
Ale z jakiegoś powodu za każdym razem, gdy robię, mysql rzuca we mnie błędem, który jest mniej niż pomocny, stwierdzając, że w wierszu 4 występuje błąd składniowy.
Przeczesałem dokumentację mysql i znalazłem informacje o ograniczeniach wyzwalaczy, ale okazało się, że są dość skomplikowane.
http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html
Wszelkie pomysły byłyby pomocne.
mysql
stored-procedures
trigger
Mark D.
źródło
źródło
Odpowiedzi:
Jest wielki powód, dla którego nigdy nie należy wywoływać procedur przechowywanych z poziomu wyzwalaczy.
Wyzwalacze są z natury procedurami przechowywanymi. Ich działania są praktycznie trudne do wycofania . Nawet jeśli wszystkie tabele bazowe to InnoDB, doświadczysz proporcjonalnej ilości współdzielonych blokad wierszy i denerwujących przerw z wyłącznych blokad wierszy. Tak by się stało, gdyby wyzwalacze manipulowały tabelami z INSERTami i UPDATEMI w stagnacji, aby wykonać MVCC o dużej wytrzymałości wewnątrz każdego wywołania wyzwalacza .
Nie zapominaj, że wyzwalacze wymagają narzutu. W rzeczywistości, zgodnie z programowaniem procedur przechowywanych MySQL , strona 256 pod nagłówkiem „Trigger Overhead” mówi:
Rozszerzone objaśnienie narzutu na spust podano na stronach 529-531. Punkt końcowy z tej sekcji brzmi następująco:
Wyjaśniłem inne nieprzyjemne aspekty Triggerów we wcześniejszym poście.
STRESZCZENIE
Chciałbym gorąco polecam nie nazywając żadnych procedur przechowywanych z wyzwalaczem , nawet jeśli MySQL pozwala. Powinieneś zapoznać się z aktualnymi ograniczeniami dla MySQL 5.5 .
źródło
Okazuje się, że to problem, który nękał mnie przez kilka godzin, wierzcie lub nie.
Mogę łatwo zdefiniować procedurę o nazwie sp_set-comment_count. Jednak wywoływanie wspomnianej procedury nie działa w ten sam sposób.
ZADZWOŃ sp_set-comment_count (mogę tylko założyć, że to dlatego, że serwer interpretuje - jako minus).
Od tego czasu zmieniłem nazwę procedury składowanej, aby używać tylko znaków podkreślenia i wygląda na to, że wszystko rozwiązało.
źródło
CALL `sp-set-comment_count`(NEW.`gid`);
Jeśli mówi o błędzie składni, najprawdopodobniej zapomniałeś zmienić ogranicznik (tak jak w przypadku procedury składowanej). Więc potrzebujesz
źródło
Wygląda na to, że przecinek po
AC
jest błędem składni:źródło