Bei MySQL EVENT geht es darum, zu einer bestimmten Zeit oder in bestimmten Intervallen MySQL-Kommandos auszuführen, z. B. Routinen aufrufen.

Anwendungsmöglichkeiten

EVENTs sind immer dann nützlich wenn Aufgaben zyklisch ausgeführt werden sollen.

  • Datenbank zu einem bestimmten Zeitpunkt bereinigen
  • alte Daten löschen
  • neue Daten hinzufügen
  • zu einen bestimmten Intervall Daten auslesen (z. B. Messdaten)


Voraussetzung

Damit wir EVENT überhaupt benutzen können, sollten wir zuerst den Scheduler einschalten. Dafür muss man die Variable event_scheduler auf ON bzw. 1 setzen.

OFF oder 0:       Scheduler ist aus, erscheint auch nicht in SHOW PROCESSLIST

ON oder 1:         Scheduler läuft und ist in der SHOW PROCESSLIST

DISABLED:        dasselbe wie OFF

Um den Scheduler einzuschalten, gibt es zwei Möglichkeiten

  • für Konfigurationsdatei (my.ini) reicht event_scheduler=1;
  • SET GLOBAL event_Scheduler=ON;‘

Info

Ereignisse auflisten                            SHOW EVENTS;

Prüfen der Scheduler on oder off ist      SHOW PROCESSLIST;


Hinweis

Damit nicht immer der SCHEDULER beim Neustart der Datenbank aktivieren muss, kann dies auch in der Konfigurationsdatei my.ini hinterlegt werden.

[mysqld] event-scheduler = 1

Syntax 

CREATE EVENT event_Name ON SCHEDULE AT {DATE AND TIME} DO {SQL COMMAND};

‘ODER

CREAT EVENT event_Name ON SCHEDULE EVERY {x=Zahl z.B. 1} {SECOND|MINUTE|HOUR|DAY|MONTH|YEAR|WEEK} DO {SQL COMMAND};

Weitere Syntax Möglichkeiten

CREATE EVENT alter_event
ON SCHEDULE
EVERY 6 HOUR
DO
UPDATE event.test_alter SET zahl = zahl +1;

ALTER EVENT alter_event
ON SCHEDULE
COMMENT
‘alter_event wird ab sofort nur noch alle 12 Std. ausgeführt.‘        
EVERY 12 HOUR
COMMENT 
‘ Beginnend 4 Std. ab dem Zeitpunkt an dem die Anweisung ausgeführt wird. ‘
STARTS CURRENT_TIMESTAMP + INTERVAL 4 HOUR;
CREATE EVENT artikel_event
ON SCHEDULE
EVERY 1 MINUTE
DO
INSERT INTO artikel (artikel) 
values ((Select bezeichnung from artikel_neu where ok = 1));
CREATE EVENT update_event
ON SCHEDULE
EVERY 90 SECOND
DO
UPDATE artikel_neu SET ok=0 WHERE ok = 1;

Folgende Datenbank wird für beide Beispiele benötigt!

Anlegen einer Datenbank event mit zwei Tabellen artikel und artikel_neu.

CREATE DATABASE event;

CREATE TABLE artikel(
ID INT NOT NULL auto_increment primary key,
ARTIKEL VARCHAR(100))
ENGINE = INNODB;

CREATE TABLE artikel_neu(
ID INT NOT NULL auto_increment primary key,
Bezeichnung VARCHAR(100),
OK INT NOT NULL)
ENGINE = INNODB;

Beispiel 1

Über ein EVENT neu_event wird eine Procedure proc_event aufgerufen, welche Datensätze zu einem bestimmten Zeitpunkt in die Tabelle artikel einfügt.

Der Scheduler muss aktiviert sein!

1. Procedure proc_event erstellen

DELIMITER //
DROP PROCEDURE if exists proc_event;
CREATE PROCEDURE proc_event
(                                                                      
IN E_ID INT,
IN E_artikel VARCHAR(100)
)
BEGIN
INSERT INTO event.artikel
( ID, Artikel )
VALUES
( E_ID, E_artikel );
//
DELIMITER ;

2. EVENT neu_event erstellen

CREATE EVENT neu_event
ON SCHEDULE AT ‘2013-04-17 14:05:00’
DO CALL proc_event(null, “WERT”);

Beispiel 2

Das EVENT neu_artikel ruft zu einem bestimmten Intervall eine Procedure proc_insert auf, diese überprüft die Spalte ok in der Tabelle artikel_neu, ob der Wert 1 entspricht.
Trifft dies zu, so wird der Datensatz in die Taballe artikel geschrieben und der Wert 1 auf 0 gesetzt.

Der Scheduler muss aktiviert sein!

1. Procedure proc_event_insert erstellen

CREATE DROP PROCEDURE IF EXISTS proc_event_insert;
DELIMITER //
CREATE PROCEDURE event.proc_event_insert ()
BEGIN

DECLARE posID, ende INT DEFAULT 0;
DECLARE posBez VARCHAR(100);
DECLARE curArt CURSOR FOR SELECT id, bezeichnung FROM artikel_neu WHERE OK=1;
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
	SET ende=1;
END;
	SET ende=0;

	OPEN curArt;

		REPEAT
		FETCH curArt INTO posID, posBez;

			IF ende=0 THEN
				INSERT INTO artikel (id,artikel) VALUES (null,posBez);
				UPDATE artikel_neu SET ok=0 WHERE ID=posID;
			END IF;

		UNTIL ende=1
		END REPEAT;

	CLOSE curArt;

END;
//
DELIMITER ;

2. EVENT neu_event_insert erstellen

drop event if exists new_artikel; 
create event neu_artikel on schedule every 1 SECOND Do call proc_event_insert();
EVENT in MySQL

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert