Ich habe eine gespeicherte Prozedur in MySQL mit der folgenden Syntax erstellt.
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 ;
Zu Ihrer Information Ich habe die gespeicherte Prozedur stark vereinfacht, aber ich weiß, dass sie ohne Probleme funktioniert.
Ich möchte in der Lage sein, einen Trigger aus usergroup_comments einzurichten, der wie folgt funktioniert.
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;
Aber aus irgendeinem Grund wirft mir jedes Mal, wenn ich mit MySQL arbeite, ein Fehler zu, der nicht hilfreich ist und besagt, dass in Zeile 4 ein Syntaxfehler vorliegt.
Ich habe die MySQL-Dokumentation durchgesehen und einige Informationen zu Einschränkungen von Triggern gefunden, aber festgestellt, dass sie ziemlich verworren sind.
http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html
Irgendwelche Ideen wären hilfreich.
quelle
Antworten:
Es gibt einen guten Grund, warum Sie gespeicherte Prozeduren niemals aus Triggern heraus aufrufen sollten.
Trigger sind von Natur aus gespeicherte Prozeduren. Ihre Aktionen sind praktisch schwer rückgängig zu machen . Selbst wenn alle zugrunde liegenden Tabellen InnoDB sind, werden Sie ein proportionales Volumen an gemeinsam genutzten Zeilensperren und ärgerliche Unterbrechungen durch exklusive Zeilensperren feststellen. Dies wäre der Fall, wenn Trigger Tabellen manipulieren würden, wobei INSERTs und UPDATEs stagnieren, um bei jedem Aufruf eines Triggers eine Hochleistungs- MVCC durchzuführen .
Vergessen Sie nicht, dass Trigger Overhead erfordern. Laut MySQL Stored Procedure Programming lautet die Überschrift "Trigger Overhead" auf Seite 256 wie folgt:
Eine ausführliche Erläuterung des Trigger-Overheads finden Sie auf den Seiten 529-531. Der Schlusspunkt aus diesem Abschnitt lautet wie folgt:
Ich habe in einem früheren Beitrag andere unangenehme Aspekte von Triggern erklärt.
ZUSAMMENFASSUNG
Ich würde dringend empfehlen, keine gespeicherten Prozeduren von einem Trigger aufzurufen , auch wenn MySQL dies zulässt. Sie sollten sich die aktuellen Einschränkungen für MySQL 5.5 ansehen .
quelle
Es stellt sich also heraus, dass dies das Problem ist, das mich ein paar Stunden lang geplagt hat, ob Sie es glauben oder nicht.
Ich kann leicht eine Prozedur mit dem Namen sp_set-comment_count definieren. Wenn Sie diese Prozedur aufrufen, funktioniert dies jedoch nicht auf die gleiche Weise.
CALL sp_set-comment_count (das kann ich nur vermuten, weil der Server das - als Minus interpretiert).
Ich habe seitdem den Namen der gespeicherten Prozedur geändert, um nur Unterstriche zu verwenden, und es scheint, alles gelöst zu haben.
quelle
CALL `sp-set-comment_count`(NEW.`gid`);
Wenn es sich um einen Syntaxfehler handelt, haben Sie wahrscheinlich vergessen, das Trennzeichen zu ändern (wie bei der gespeicherten Prozedur). Also brauchst du
quelle
Das nachfolgende Komma
AC
ist ein Syntaxfehler:quelle