Domanda

Ho creato una stored procedure in MySQL utilizzando la seguente sintassi.

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 ;

FYI ho molto semplificata la stored procedure ma so che funziona senza problemi.

Quello che mi piacerebbe essere in grado di fare è impostare un trigger da usergroup_comments che funziona in questo modo.

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;

Ma per qualche motivo ogni volta che faccio mysql genera un errore a me che è meno disponibile affermando che c'è un errore di sintassi sulla linea 4.

ho pettinato attraverso la documentazione mysql e trovato alcune informazioni sulle restrizioni di trigger, ma c'è sembrato abbastanza contorto.

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

Tutte le idee sarebbe utile.

È stato utile?

Soluzione 2

Così si scopre questo è il problema che mi ha afflitto per qualche ora ci crediate o no.

I può facilmente definire una procedura chiamata, sp_set-COMMENT_COUNT. Tuttavia quando la chiamata ha detto procedimento, non funziona allo stesso modo.

CALL sp_set-COMMENT_COUNT (posso solo supporre che questo è perché le interpreta di server le - come un segno meno).

Da allora ho cambiato il nome della stored procedure per solo uso di sottolineatura e sembra di aver risolto tutto.

Altri suggerimenti

C'è un grande motivo per cui non si dovrebbe mai chiamare stored procedure all'interno di trigger.

trigger sono, per natura, stored procedure. Le loro azioni sono praticamente difficile rollback . Anche se tutte le tabelle sottostanti sono InnoDB, si verificherà un volume proporzionale di blocchi di riga e condivisi intermittenza fastidioso da blocchi di riga esclusivi. Tale sarebbe il caso se trigger stavano manipolando le tabelle con inserimenti e aggiornamenti in corso una fase di stagnazione per eseguire pesanti MVCC all'interno di ogni chiamata a un trigger .

Non dimenticate che innesca richiedono spese generali. In realtà, secondo MySQL stored procedure di programmazione , pagina 256 sotto la testa "Trigger Overhead" dice il seguente:

E 'importante ricordare che, per necessità, trigger aggiungere in testa la dichiarazione DML a cui si applicano. la quantità effettiva di overhead dipenderà dalla natura del grilletto, ma --- come tutti MySQL trigger eseguono PER OGNI FILA --- l'overhead può rapidamente accumulare per le istruzioni che elaborano gran numero di righe. Dovresti quindi evitare di collocare eventuali istruzioni SQL costosi o procedurale codice trigger.

Una spiegazione estesa di innesco testa viene dato alle pagine 529-531. Il punto conclusivo da quella sezione si afferma quanto segue:

La lezione è questa: dal momento che il codice di attivazione verrà eseguito una volta per ogni riga interessata da una dichiarazione DML, il grilletto può facilmente diventare il fattore più significativo in termini di prestazioni DML. Codice all'interno del corpo ha bisogno di innesco di essere il più leggero possibile e - in particolare - eventuali istruzioni SQL nel trigger dovrebbero essere supportate da indici ove possibile.

ho spiegato altri aspetti sgradevoli di trigger in un precedente post .

SOMMARIO

Suggerirei vivamente di non chiamare qualsiasi stored procedure da un trigger , anche se MySQL permette. Si dovrebbe wlays verificare le attuali restrizioni per MySQL 5.5 .

Se si dice di errore di sintassi, il più probabile che si è dimenticato di cambiare delimitatore (come avete fatto per la stored procedure). Quindi è necessario

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

appare come la virgola dopo AC è un errore di sintassi:

UPDATE usergroups
   SET allCount = AC,
 WHERE ........
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top