Datenbank-Änderungen Sprint AW
Sammel-Sprint vom 13.06.2026 — 5 Items aus dem Cloud-DB-Backlog (Modul 9 +
Modul 29 Teil B + 2 Views + Gast-Spalten) wurden in einem Rutsch
eingespielt. Migrationen 20260613000017 … 20260613000021,
SQL-Blöcke 0033 … 0037.
Repo: de.profipos.shared ·
DB: 0profipos auf 88.99.138.84.
Übersicht
| # | Migration | SQL-Blöcke | Inhalt |
|---|---|---|---|
| 17 | Sprint3Modul29bStoredProcedures | 0033 (6 Blocks) | 2 Procedures + EVENT (DISABLED) |
| 18 | Sprint3Modul9QrReservierfixEsl | 0034 (6 Blocks) | qr_codes_statisch + reservierfix_tische + 3 Spalten an tische + 2 FKs |
| 19 | Sprint3ViewArtikelAktuellerPreis | 0035 (1 Block) | View v_artikel_aktueller_preis (CTE + ROW_NUMBER) |
| 20 | Sprint3ViewEslUpdatePending | 0036 (1 Block) | View v_esl_update_pending mit Priorisierung |
| 21 | Sprint3BestellungenGastSpalten | 0037 (3 Blocks) | 4 gast_*-Spalten + FULLTEXT-Index |
Item 1 — Modul 29 Teil B: Stored Procedures + EVENT
-- Wartung: monatliche Partitionen anlegen
CALL proc_create_monthly_partitions();
-- Wartung: alte Partitionen archivieren
CALL proc_archive_old_partitions();
-- Scheduler-Event (DEAKTIVIERT bis Phase 2 Partitionierung live)
CREATE EVENT ev_partition_maintenance
ON SCHEDULE EVERY 1 DAY STARTS '2026-06-14 03:30:00'
DISABLE
DO BEGIN
CALL proc_create_monthly_partitions();
CALL proc_archive_old_partitions();
END;
Aktivierung (Phase 2):
ALTER EVENT ev_partition_maintenance ENABLE;
SET GLOBAL event_scheduler = ON;
Item 2 — Modul 9 Erweiterung: QR + Reservierfix + ESL
-- Neue Tabellen
CREATE TABLE qr_codes_statisch (
qr_code_uuid CHAR(36) PRIMARY KEY,
mandant_uuid CHAR(36) NOT NULL,
standort_uuid CHAR(36) NOT NULL,
kennung VARCHAR(60) NOT NULL,
ziel_url VARCHAR(500) NOT NULL,
erstellt_am DATETIME NOT NULL,
KEY idx_mandant (mandant_uuid)
);
CREATE TABLE reservierfix_tische (
reservierfix_tisch_id VARCHAR(100) NOT NULL,
tisch_uuid CHAR(36) NOT NULL,
zugeordnet_am DATETIME NOT NULL,
PRIMARY KEY (reservierfix_tisch_id, tisch_uuid),
CONSTRAINT fk_rt_tisch FOREIGN KEY (tisch_uuid)
REFERENCES tische(tisch_uuid) ON DELETE CASCADE
);
-- Erweiterung tische
ALTER TABLE tische
ADD COLUMN qr_code_static_uuid CHAR(36) NULL,
ADD COLUMN reservierfix_tisch_id VARCHAR(100) NULL,
ADD COLUMN esl_display_uuid CHAR(36) NULL,
ADD CONSTRAINT fk_tische_qr_code_static
FOREIGN KEY (qr_code_static_uuid) REFERENCES qr_codes_statisch(qr_code_uuid),
ADD CONSTRAINT fk_tische_esl_display
FOREIGN KEY (esl_display_uuid) REFERENCES esl_etiketten(esl_uuid);
tische.reservierfix_tisch_idist KEIN FK — VARCHAR(100) ohne Constraint. Die echte interne Brücke ist die separate Tabellereservierfix_tische(mehrere externe IDs pro Tisch möglich).tische.esl_display_uuidzeigt aufesl_etiketten(esl_uuid)— semantisch korrekter alsgeraete(geraet_uuid)(welches ESL-Etikett hängt am Tisch).
Item 3 — v_artikel_aktueller_preis
CTE + ROW_NUMBER ermittelt pro Artikel den aktuell gültigen Preis
basierend auf artikel_preise (gueltig_ab, gueltig_bis, wochentage,
uhrzeit_von, uhrzeit_bis).
SELECT *
FROM v_artikel_aktueller_preis
WHERE mandant_uuid = ? AND standort_uuid = ?;
Wochentag-Konvention ab Sprint AW: CSV deutscher Kürzel
Mo,Di,Mi,Do,Fr,Sa,So. Leer/NULL = alle Tage.
Der historische DB-Kommentar zu artikel_preise.wochentage sagt „1–7“
(Mo=1..So=7). Diese Notation greift in der neuen View nicht mehr —
Bestandsdaten müssen einmalig auf die deutschen Kürzel umgeformt werden
(offen, Backlog).
Die View matched per:
FIND_IN_SET(ELT(WEEKDAY(NOW())+1, 'Mo','Di','Mi','Do','Fr','Sa','So'), wochentage)
Item 4 — v_esl_update_pending
Priorisierte Liste anstehender ESL-Display-Updates:
| Priorität | Bedingung |
|---|---|
hoch | Preisänderung wurde > 1 h nicht propagiert |
normal | sonstige ausstehende Updates |
Quell-Tabelle: esl_update_queue (Feld angefordert_am, nicht
created_at).
Item 5 — Gast-Spalten an bestellungen
Für Online-Bestellungen mit Gast-Kontaktdaten:
ALTER TABLE bestellungen
ADD COLUMN gast_vorname VARCHAR(80) NULL,
ADD COLUMN gast_nachname VARCHAR(80) NULL,
ADD COLUMN gast_email VARCHAR(180) NULL,
ADD COLUMN gast_telefon VARCHAR(40) NULL,
ADD FULLTEXT INDEX idx_ft_bestellungen_gast
(gast_vorname, gast_nachname, gast_email, gast_telefon);
Lesson Learned: DELIMITER ist KEIN Server-Konzept
// Klappt: ein Compound-Statement direkt durch PDO::exec
$this->execute(<<<SQL
CREATE PROCEDURE proc_xyz()
BEGIN
DECLARE x INT;
SET x = 1;
-- ...
END
SQL);
DELIMITER ist nur ein Konzept im mysql-CLI, der Server parsed die
internen ; selbst. Das hat in der Vergangenheit zu unnötigen Workarounds
(getAdapter()->getConnection()->exec()) geführt — nicht mehr nötig.
Verwandte Themen
- Cloud-REST v6
- Tagesabschluss + Z-Bon (greift auf
bestellungenzu) - Backoffice Übersicht