it-praxisportal/courses/sql/15_views_und_gespeicherte_logik/aufgabe.sql

115 lines
4.4 KiB
SQL

-- ============================================================================
-- 🗄️ SQL 15: VIRTUELLE VIEWS & DATENBANK-TRIGGER 🗄️
-- ============================================================================
-- ----------------------------------------------------------------------------
-- 1. TABELLEN-SCHEMA & TESTDATEN
-- ----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS kunden (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
passwort_hash TEXT NOT NULL,
stadt TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS produkte (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
preis REAL NOT NULL,
lagerbestand INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS bestellungen (
id INTEGER PRIMARY KEY,
kunde_id INTEGER NOT NULL,
bestell_datum TEXT NOT NULL,
gesamtbetrag REAL NOT NULL,
FOREIGN KEY (kunde_id) REFERENCES kunden(id)
);
CREATE TABLE IF NOT EXISTS bestellpositionen (
id INTEGER PRIMARY KEY AUTOINCREMENT,
bestell_id INTEGER NOT NULL,
produkt_id INTEGER NOT NULL,
menge INTEGER NOT NULL,
einzelpreis REAL NOT NULL,
FOREIGN KEY (bestell_id) REFERENCES bestellungen(id),
FOREIGN KEY (produkt_id) REFERENCES produkte(id)
);
CREATE TABLE IF NOT EXISTS audit_preis_historie (
id INTEGER PRIMARY KEY AUTOINCREMENT,
produkt_id INTEGER NOT NULL,
alter_preis REAL NOT NULL,
neuer_preis REAL NOT NULL,
aenderungs_datum TEXT NOT NULL
);
-- Testdaten
INSERT INTO kunden (id, name, email, passwort_hash, stadt) VALUES
(1, 'Alice Becker', 'alice@example.com', '$2y$12$e8Y7G...', 'Berlin'),
(2, 'Bob Meier', 'bob@example.com', '$2y$12$K9j2L...', 'Hamburg'),
(3, 'Carla Wagner', 'carla@example.com', '$2y$12$P3m8Q...', 'München');
INSERT INTO produkte (id, name, preis, lagerbestand) VALUES
(101, '4K OLED Monitor 32"', 899.00, 50),
(102, 'Ergonomische Tastatur Pro', 149.00, 100),
(103, 'Wireless Noise Cancelling Headset', 249.00, 30);
INSERT INTO bestellungen (id, kunde_id, bestell_datum, gesamtbetrag) VALUES
(1, 1, '2024-02-10', 1048.00),
(2, 1, '2024-03-01', 249.00),
(3, 2, '2024-02-15', 899.00);
INSERT INTO bestellpositionen (bestell_id, produkt_id, menge, einzelpreis) VALUES
(1, 101, 1, 899.00),
(1, 102, 1, 149.00),
(2, 103, 1, 249.00),
(3, 101, 1, 899.00);
-- ============================================================================
-- 🎯 AUFGABEN
-- ============================================================================
-- 🎯 TODO 1: Virtueller View `v_kunden_bestell_cockpit`
-- Erstelle einen View `v_kunden_bestell_cockpit` (OHNE die Spalte passwort_hash!),
-- der für jeden Kunden folgende Spalten bündelt:
-- - kunde_id: k.id
-- - name: k.name
-- - email: k.email
-- - stadt: k.stadt
-- - anzahl_bestellungen: COUNT(b.id)
-- - gesamt_umsatz: COALESCE(SUM(b.gesamtbetrag), 0.0)
-- - letzte_bestellung: MAX(b.bestell_datum)
-- Gruppiere nach k.id, k.name, k.email, k.stadt.
-- TODO: CREATE VIEW v_kunden_bestell_cockpit AS ...
-- 🎯 TODO 2: Virtueller View `v_top_seller_uebersicht`
-- Erstelle einen View `v_top_seller_uebersicht`, der für jedes Produkt folgende Spalten berechnet:
-- - produkt_id: p.id
-- - produkt_name: p.name
-- - aktueller_preis: p.preis
-- - verkaufte_menge: COALESCE(SUM(bp.menge), 0)
-- - gesamt_erloes: COALESCE(SUM(bp.menge * bp.einzelpreis), 0.0)
-- Nutze LEFT JOIN von produkte auf bestellpositionen und gruppiere nach p.id, p.name, p.preis.
-- TODO: CREATE VIEW v_top_seller_uebersicht AS ...
-- 🎯 TODO 3: Trigger `trg_lagerbestand_reduzieren`
-- Erstelle einen Trigger, der bei JEDEM neuen Eintrag in `bestellpositionen`
-- (AFTER INSERT ON bestellpositionen FOR EACH ROW) den Lagerbestand in der Tabelle `produkte`
-- automatisch um NEW.menge verringert:
-- UPDATE produkte SET lagerbestand = lagerbestand - NEW.menge WHERE id = NEW.produkt_id;
-- TODO: CREATE TRIGGER trg_lagerbestand_reduzieren ...
-- 🎯 TODO 4: Trigger `trg_preis_historie_audit`
-- Erstelle einen Trigger, der bei JEDER Änderung des Preises eines Produkts
-- (AFTER UPDATE OF preis ON produkte FOR EACH ROW)
-- einen Audit-Eintrag in `audit_preis_historie` schreibt:
-- INSERT INTO audit_preis_historie (produkt_id, alter_preis, neuer_preis, aenderungs_datum)
-- VALUES (OLD.id, OLD.preis, NEW.preis, '2024-03-15 12:00:00');
-- TODO: CREATE TRIGGER trg_preis_historie_audit ...