21 EVENT

Events sind geplante Aufgaben, die automatisch zu bestimmten Zeitpunkten ausgeführt werden. Sie sind vergleichbar mit Cron-Jobs in Unix-Systemen.

21.1 Wie lege ich ein Ereignis an?

Ein Event wird mit CREATE EVENT erstellt:

-- Einfaches Event, das einmal ausgeführt wird
CREATE EVENT einmaliges_event
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
    UPDATE statistik SET letzter_lauf = NOW();

-- Wiederholendes Event
CREATE EVENT tägliche_bereinigung
ON SCHEDULE EVERY 1 DAY
STARTS '2024-01-01 23:00:00'
DO
    DELETE FROM temp_tabelle 
    WHERE datum < DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY);

-- Komplexeres Event mit mehreren Anweisungen
DELIMITER //

CREATE EVENT monatliche_abrechnung
ON SCHEDULE 
    EVERY 1 MONTH
    STARTS '2024-01-01 00:00:00'
DO
BEGIN
    -- Monatsstatistik erstellen
    INSERT INTO monatsstatistik
    SELECT 
        DATE_FORMAT(CURRENT_DATE, '%Y-%m') AS monat,
        COUNT(*) AS anzahl_bestellungen,
        SUM(betrag) AS gesamtumsatz
    FROM bestellungen
    WHERE DATE_FORMAT(datum, '%Y-%m') = 
          DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m');
    
    -- Alte Protokolleinträge bereinigen
    DELETE FROM protokoll
    WHERE datum < DATE_SUB(CURRENT_DATE, INTERVAL 6 MONTH);
    
    -- Statusaktualisierung
    UPDATE system_status 
    SET letzter_monatslauf = NOW();
END //

DELIMITER ;

Scheduling-Optionen:

-- Verschiedene Scheduling-Beispiele
CREATE EVENT stündliches_event
ON SCHEDULE EVERY 1 HOUR;

CREATE EVENT arbeitstage_event
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 YEAR
DO
    -- Nur an Werktagen ausführen
    IF DAYOFWEEK(CURRENT_DATE) BETWEEN 2 AND 6 THEN
        -- Event-Logik
    END IF;

CREATE EVENT quartal_event
ON SCHEDULE EVERY 1 QUARTER
STARTS '2024-01-01 00:00:00'
ENDS '2024-12-31 23:59:59';

21.2 Wie werde ich ein Ereignis wieder los?

Events können gelöscht oder deaktiviert werden:

-- Event löschen
DROP EVENT einmaliges_event;

-- Sicherere Variante
DROP EVENT IF EXISTS einmaliges_event;

-- Event deaktivieren
ALTER EVENT tägliche_bereinigung
DISABLE;

-- Event wieder aktivieren
ALTER EVENT tägliche_bereinigung
ENABLE;

-- Event ändern
ALTER EVENT monatliche_abrechnung
ON SCHEDULE EVERY 1 MONTH
STARTS '2024-01-01 00:00:00'
DO
    -- Neue Event-Logik

Praktische Beispiele:

  1. Datenbankwartung:
DELIMITER //

CREATE EVENT db_wartung
ON SCHEDULE EVERY 1 WEEK
DO
BEGIN
    -- Temporäre Tabellen bereinigen
    DELETE FROM temp_daten 
    WHERE erstellt < DATE_SUB(NOW(), INTERVAL 1 DAY);
    
    -- Statistiken aktualisieren
    ANALYZE TABLE wichtige_tabelle;
    
    -- Protokollierung
    INSERT INTO wartungsprotokoll
    (zeitpunkt, aktion)
    VALUES (NOW(), 'Wöchentliche Wartung durchgeführt');
END //

DELIMITER ;
  1. Automatische Datensicherung:
CREATE EVENT backup_erstellen
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_DATE + INTERVAL 23 HOUR
DO
    -- Backup in separate Tabelle
    INSERT INTO kunden_backup
    SELECT *, CURRENT_TIMESTAMP as backup_datum
    FROM kunden
    ON DUPLICATE KEY UPDATE
        email = VALUES(email),
        telefon = VALUES(telefon),
        backup_datum = CURRENT_TIMESTAMP;
  1. Status-Updates:
CREATE EVENT status_aktualisierung
ON SCHEDULE EVERY 5 MINUTE
DO
    UPDATE bestellungen
    SET status = 'überfällig'
    WHERE status = 'offen'
    AND datum < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 24 HOUR);

Tipps für Events:

  1. Fehlerbehandlung einbauen:
DELIMITER //

CREATE EVENT sicheres_event
ON SCHEDULE EVERY 1 DAY
DO
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        INSERT INTO fehlerprotokoll
        (zeitpunkt, ereignis, fehler)
        VALUES (NOW(), 'sicheres_event', 'SQL-Fehler aufgetreten');
    END;
    
    -- Event-Logik
END //

DELIMITER ;
  1. Event-Status überwachen:
-- Events anzeigen
SHOW EVENTS;

-- Event-Status prüfen
SELECT * FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'meine_datenbank';

-- Eigene Überwachungstabelle
CREATE TABLE event_protokoll (
    event_name VARCHAR(100),
    letzter_lauf DATETIME,
    status VARCHAR(50),
    bemerkung TEXT
);
  1. Ressourcennutzung beachten:
-- Große Operationen aufteilen
CREATE EVENT große_bereinigung
ON SCHEDULE EVERY 1 HOUR
DO
    DELETE FROM große_tabelle
    WHERE datum < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
    LIMIT 1000;
  1. Zeitzonen beachten:
-- Event mit expliziter Zeitzone
CREATE EVENT zeitkritisches_event
ON SCHEDULE EVERY 1 DAY
STARTS '2024-01-01 00:00:00' + INTERVAL 1 HOUR
DO
    -- Wird eine Stunde nach Mitternacht ausgeführt
    -- unabhängig von der Systemzeitzone