Dalla versione 5.1.6 di MySQL è stata introdotta la possibilità della schedulazione di eventi. L’evento è un oggetto che si attiva in base al suo riferimento temporale ed effettua una determinata azione, che consiste in uno statement SQL.
E’ possibile definire due tipologie di eventi, ad una sola esecuzione e ricorrente. Nel primo caso si specifica il timestamp di esecuzione, mentre nel secondo caso viene specificato l’intervallo di ripetizione, sotto forma di un numero di minuti, ore, giorni, fino ad anni. Si può procedere con un semplice esempio di schedulazione, atto ad illustrate la sintassi da utilizzare. Si ha una tabella che servirà da contenitore:
CREATE TABLE `regeventi` (
`ID_RIGA` int(11) NOT NULL AUTO_INCREMENT,
`data` datetime DEFAULT NULL,
`conteggio` int(11) DEFAULT NULL,
PRIMARY KEY (`ID_RIGA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
La tabella oltre alla chiave primaria ha un campo data che memorizzerà il momento in cui scatta l’evento, e un campo numerico che fungerà da contatore delle sue repliche. La seguente procedura verrà richiamata periodicamente dall’evento:
CREATE PROCEDURE `memScatto`() NOT DETERMINISTIC
SQL SECURITY DEFINER COMMENT ''
BEGIN
DECLARE iConteggio INT;
SET iConteggio = 0;
SELECT IFNULL(max(conteggio)+1, 1) INTO iConteggio from regeventi;
INSERT INTO `regeventi` (`data`, `conteggio`) VALUES (now(), iConteggio);
END;
Si creerà un evento di tipologia ricorrente, con intervallo di un minuto, che si occuperà di richiamare la procedura memScatto:
CREATE EVENT `contaMinuti` ON SCHEDULE EVERY 1 MINUTE
ON COMPLETION PRESERVE
ENABLE
COMMENT 'lancia ogni minuto la procedura memScatto'
DO call memScatto;
Con questi comandi DDL è stato preparato il sistema, ma occorre attivare il processo di scheduling. Questo si ottiene tramite una variabile globale event_scheduler. Si possono controllare i valori di tutte le variabili settate utilizzando mysqladmin nel seguente modo:
mysqladmin -uroot -ppassword variables
con root e password da sostituire con un utente e password del proprio database. Se event_scheduler è a OFF, la schedulazione degli eventi è disattivata e si può utilizzare il seguente comando per l’attivazione:
SET GLOBAL event_scheduler = ON;
Una volta in esecuzione il processo che sovrintende agli eventi, ogni minuto scatterà contaMinuti, che richiamerà la procedura memScatto e questa inserirà un record nella tabella regeventi. La query SELECT * FROM `regeventi` ; mostrerà i record inseriti con data, che differisce esattamente di un minuto uno dall’altro.
di Emanuele Gianturco - Programmazione.it