Você está na página 1de 21

SQL Events

Luciano F. de Medeiros
Eventos
• É uma tarefa que é executada baseada num
agendamento pré-definido
• Conhecido como “trigger” temporal
• O evento é similar a uma programação de tarefas
do sistema operacional (cron – Linux; Task
Scheduler – Windows)
• Podem ser usados para otimização de tabelas,
limpeza de logs, arquivamento de dados ou
geração de relatórios complexos durante
períodos de baixo movimento
MySQL Events
• No caso do MySQL, uma thread especial é
utilizada para executar todos os eventos
agendados (thread de agendamento)

SHOW PROCESSLIST;
Habilitando o Agendamento
• Por default, a thread de agendamento está
desligada.
SET GLOBAL event_scheduler = ON;

• Para desabilitar:

SET GLOBAL event_scheduler = OFF;


Sintaxe
CREATE EVENT <nome>
ON SCHEDULE [AT <tempo> [+INTERVAL <intervalo>] |
EVERY <intervalo> [STARTS <tempo> [ENDS <tempo>]]
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT ‘<comentário>’]
DO [BEGIN]
<código SQL>
[END] $$
Exemplos de SCHEDULE
• AT ‘2015-12-25 00:00:00’
• AT NOW
• AT NOW + INTERVAL 15 MINUTE
• EVERY 1 MINUTE
• EVERY 1 WEEK
• EVERY 1 MONTH
ON COMPLETION PRESERVE
• Quando um evento é programado para
acontecer em uma data fixa, o próprio sistema
se encarrega de deletar os events
• Para que seja preservada, o comando deve ser
complementado com ON COMPLETION
PRESERVE
Exemplo: Mensagem fixa
DELIMITER $$
DROP EVENT IF EXISTS mensagem_natal;
CREATE EVENT mensagem_natal
ON SCHEDULE AT DATE'2015-12-25 00:00:00'
ON COMPLETION PRESERVE
ENABLE
DO BEGIN
INSERT INTO aluguel_audit
SET action = 'FELIZ NATAL',
funcionario_id = 1,
changed = NOW();
END $$
Exemplo: Mensagem Fixa
Exemplo: Backup de Tabelas
• Uso dos comandos PREPARE, EXECUTE e
DEALLOCATE
• Construção de comandos dinâmicos
• Agendamento para gravar o conteúdo em
arquivo CSV
PREPARE
• Prepara o comando SQL, fornecido por meio
de uma string, sendo assinalado em uma
variável de escopo local

PREPARE <stmt_name> FROM <prep_stmt>


EXECUTE e DEALLOCATE
• Execução de um comando já preparado

EXECUTE <prep_stmt>

• Liberação da memória

DEALLOCATE PREPARE <prep_stmt>


SELECT ... INTO OUTFILE
• Gravação do conteúdo da consulta para um
arquivo CSV.

SELECT <…> FROM <tabela> INTO OUTFILE ‘<arquivo>'


FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Event ‘backup_cliente’
DELIMITER $$
DROP EVENT IF EXISTS backup_cliente;
CREATE EVENT backup_cliente
ON SCHEDULE EVERY 1 WEEK
STARTS '2015-11-05 07:40:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
BEGIN
SET @sql_text = CONCAT("SELECT * FROM cliente INTO OUTFILE
'C:/Backups/cliente",DATE_FORMAT(NOW(),'%Y%m%d'),".csv' ");
SET @sql_text = CONCAT(@sql_text, "FIELDS TERMINATED BY ',' ");
SET @sql_text = CONCAT(@sql_text, "OPTIONALLY ENCLOSED BY '\"' ");
SET @sql_text = CONCAT(@sql_text, "LINES TERMINATED BY '\n' ");
PREPARE sql_comm FROM @sql_text;
EXECUTE sql_comm;
DEALLOCATE PREPARE sql_comm;
END $$
DELIMITER ;
Execução
Exemplo: Aniversariantes
• Construção de um evento que retorne os
aniversariantes do dia
• É necessário criar uma tabela (“aniversario”),
onde será gravado o id do cliente

CREATE TABLE IF NOT EXISTS `aniversario` (


`cliente_id` INT(11) NOT NULL,
PRIMARY KEY (`cliente_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Modificação da tabela cliente
• Deve ser colocada na tabela “cliente” o campo
“data_nascimento”
• Comandos sugeridos:
// Adicionando campo da data de nascimento
ALTER TABLE cliente
ADD data_nascimento DATETIME NULL;

// Gerando datas aleatórias de aniversário


UPDATE cliente
SET data_nascimento = DATE_ADD(DATE'1980/01/01',INTERVAL
FLOOR(RAND()*365*10) DAY);
Event
DROP EVENT IF EXISTS event_aniversario_do_dia;
DELIMITER $$
CREATE EVENT event_aniversario_do_dia
ON SCHEDULE EVERY 1 DAY
DO BEGIN
DECLARE m_cliente_id In(11);
DECLARE done INT DEFAULT FALSE;

DECLARE cursor_nasc CURSOR FOR


(SELECT cliente_id
FROM cliente
WHERE DAY(data_nascimento) = DAY(NOW())
AND MONTH(data_nascimento) = MONTH(NOW()));
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET done = TRUE;

DELETE FROM aniversario;

OPEN cursor_nasc;
SET m_cliente_id = 0;
FETCH cursor_nasc INTO m_cliente_id;

-- Processa linha a linha


WHILE NOT done DO

INSERT INTO aniversario (cliente_id) VALUES (m_cliente_id);

FETCH cursor_nasc INTO m_cliente_id;


END WHILE;

CLOSE cursor_nasc;
END $$
Execução
Referências
• MILANI, A. MySQL: Guia do programador. São
Paulo: Novatec, 2006.
• http://www.mysqltutorial.org/mysql-
triggers.aspx
• http://www.mysqltutorial.org/mysql-trigger-
implementation.aspx

Você também pode gostar