Frage

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 das gespeicherte Verfahren stark vereinfacht, aber ich weiß, dass es ohne Probleme funktioniert.

Was ich gerne tun möchte, ist, einen Auslöser von UserGroup_Coments einzurichten, der so 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 MySQL ein Fehler auf mich, der weniger als hilfreich ist und angibt, dass es in Zeile 4 einen Syntaxfehler gibt.

Ich habe die MySQL -Dokumentation durchgemacht und einige Informationen zu Beschränkungen von Triggern gefunden, aber festgestellt, dass sie ziemlich verworren ist.

http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html

Alle Ideen wären hilfreich.

War es hilfreich?

Lösung 2

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 namens sp_set-coment_count definieren. Wenn Sie jedoch das Verfahren anrufen, funktioniert es jedoch nicht auf die gleiche Weise.

Rufen Sie SP_SET -CMENT_COUNT auf (ich kann nur annehmen, dass der Server die - als Minus interpretiert).

Ich habe seitdem den Namen des gespeicherten Prozedurs geändert, um nur Unterstriche zu verwenden, und es scheint alles gelöst zu haben.

Andere Tipps

Es gibt einen guten Grund, warum Sie nie gespeicherte Verfahren aus Triggern anrufen sollten.

Auslöser sind von Natur aus gespeicherte Verfahren. Ihre Aktionen sind praktisch schwer zurückzusetzen. Auch wenn alle zugrunde liegenden Tabellen innoDB sind, erfahren Sie ein proportionales Volumen von gemeinsamen Zeilenschlössern und nervigen Intermittenz aus exklusiven Zeilensperrungen. Dies wäre der Fall, wenn Trigger Tische mit manipulieren würden Einfüge und Updates, die stagniert werden, um Hochleistungen auszuführen MVCC In jedem Aufruf zu einem Auslöser.

Vergessen Sie nicht, dass Auslöser Overhead erfordern. In der Tat nach Angaben MySQL gespeicherte Prozedurprogrammierung, Seite 256 unter dem Kopf "Trigger Overhead" lautet Folgendes:

Es ist wichtig, sich daran zu erinnern, dass Auslöser, aus der notwendig, die DML -Anweisung, für die sie sich bewerben, Overhead hinzufügen. Die tatsächliche Menge an Gemeinkosten hängt von der Art des Auslösers ab, aber-wie alle MySQL-Auslöser für jede Zeile ausgeführt werden-kann sich der Overhead schnell für Aussagen ansammeln, die eine große Anzahl von Zeilen verarbeiten. Sie sollten daher vermeiden, teure SQL -Anweisungen oder Verfahrenscode in Auslöser zu platzieren.

Eine erweiterte Erklärung des Trigger-Overheads ist auf den Seiten 529-531 angegeben. Der abschließende Punkt aus diesem Abschnitt besagt Folgendes:

Die Lektion hier ist Folgendes: Da der Triggercode für jede von einer DML -Anweisung betroffene Zeile einmal ausgeführt wird, kann der Trigger leicht zum wichtigsten Faktor für die DML -Leistung werden. Der Code innerhalb des Triggerkörpers muss so leicht wie möglich sein, und insbesondere alle SQL -Anweisungen im Trigger sollten nach Möglichkeit von Indizes unterstützt werden.

Ich erklärte andere böse Aspekte von Triggern in einem früheren Beitrag.

ZUSAMMENFASSUNG

Ich würde Empfehlen Sie dringend, keine gespeicherten Verfahren von einem Auslöser aufzurufen, auch wenn mysql es zulässt. Sie sollten die aktuellen Beschränkungen für MySQL 5.5 überprüfen.

Wenn es sich um einen Syntaxfehler handelt, haben Sie am wahrscheinlichsten vergessen, den Trennzeichen zu ändern (wie Sie es für gespeichertes Verfahren getan haben). Also brauchst du

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

Sieht aus wie das Komma danach AC ist ein Syntaxfehler:

UPDATE usergroups
   SET allCount = AC,
 WHERE ........
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top