Aufgabe 15 - Datenbankseitige Programmierung
Aufgabe 15 - Datenbankseitige Programmierung
Abschnitt betitelt „Aufgabe 15 - Datenbankseitige Programmierung“Worum geht es?
Abschnitt betitelt „Worum geht es?“In dieser Übung wird zentrale Geschäftslogik direkt in PostgreSQL umgesetzt: Funktionen für Berechnungen, eine Stored Procedure für validierte Operationen und Trigger für automatische Geschäftsregeln (siehe Kapitel 7 - Datenbankseitige Programmierung). Alles baut auf Northwind auf. Im Expertenteil entsteht ein bedingtes Audit-Log samt Architekturbewertung.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel 7 - Datenbankseitige Programmierung.
- Ein PostgreSQL-Server mit Northwind.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie schreiben Funktionen und rufen sie ineinander auf.
- Sie kapseln eine mehrstufige Operation mit Validierung in einer Procedure.
- Sie setzen Geschäftsregeln mit BEFORE-Triggern durch.
- Sie bauen ein bedingtes Audit-Log und beurteilen, wann Logik in die Datenbank gehört.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: Funktionen erstellen und testen (Teil A).
- Reorganisation und Transfer: eine Procedure und Validierungs-Trigger bauen (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: ein Audit-Log bauen und die Architekturfrage beurteilen (Teil D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Zur Vorbereitung die Struktur von orders, order_details und products prüfen (\d order_details).
Teil A - Funktionen
Abschnitt betitelt „Teil A - Funktionen“calculate_line_total(LANGUAGE sql): berechnetunit_price * quantity * (1 - discount), gerundet auf 2 Stellen. Testen:calculate_line_total(14.40, 12, 0.10)= 155.52.get_order_total(p_order_id INT): Summe aller Zeilentotals einer Bestellung, unter Verwendung voncalculate_line_total; bei nicht existierender ID0.00. Gegen eine manuelle Summe prüfen.get_top_products_by_supplier(p_supplier_id INT)(RETURNS TABLE(...)): die am häufigsten bestellten Produkte eines Lieferanten, absteigend nach Menge.
Reflexion: Warum ist eine zentrale Funktion besser als die Formel in jeder Query? Warum ist ein Standardwert bei ungültiger ID wichtig?
Teil B - Stored Procedure
Abschnitt betitelt „Teil B - Stored Procedure“adjust_stock(p_product_id INT, p_quantity_change INT): ändertproducts.units_in_stock; der Bestand darf nie unter 0 fallen (RAISE EXCEPTION); das Produkt muss existieren (RAISE EXCEPTIONbeiNOT FOUND); jede Änderung wird in eine Tabellestock_log(product_id, change_qty, new_stock, changed_at, changed_by) protokolliert. Gültige und ungültige Aufrufe testen undstock_logprüfen.
Reflexion: Zwei Vorteile gegenüber einem direkten UPDATE; Folge, wenn die NOT FOUND-Prüfung fehlt.
Teil C - Validierungs-Trigger
Abschnitt betitelt „Teil C - Validierungs-Trigger“- BEFORE UPDATE Zeitstempel: Spalte
updated_atzuproductshinzufügen und mit einer Trigger-Funktionset_products_updated_at()bei jedem Update automatisch aufNOW()setzen. Nachweisen, dass sichupdated_atändert, obwohl es imUPDATEnicht genannt wird. - BEFORE INSERT/UPDATE Validierung: Trigger
trg_validate_order_detailauforder_details, der eine Exception auslöst beiunit_price < 0.01,discount > 0.50oderquantity <= 0. Mit gültigen und ungültigen Inserts testen.
Teil D - Expertenteil: Bedingtes Audit-Log und Architektur
Abschnitt betitelt „Teil D - Expertenteil: Bedingtes Audit-Log und Architektur“- AFTER-UPDATE-Audit: Eine Tabelle
product_price_audit(old_price, new_price, changed_at, changed_by) und einAFTER UPDATE-Triggertrg_product_price_auditaufproducts, der nur feuert, wenn sichunit_pricetatsächlich geändert hat (OLD.unit_price <> NEW.unit_price). Mit zwei Preisänderungen und einem Update ohne Preisänderung testen; genau zwei Audit-Einträge erwarten. - Warum bedingt? Erklären, warum
OLD.unit_price <> NEW.unit_pricebesser ist als immer zu protokollieren, und warum ein BEFORE-Trigger zur Validierung, ein AFTER-Trigger zum Auditing passt. - Objektüberblick: Alle erstellten Funktionen, Procedures und Trigger über
information_schema.routinesundinformation_schema.triggersauflisten und dokumentieren, welcher Trigger auf welcher Tabelle liegt. - Architekturfrage: In mindestens fünf Sätzen Stellung nehmen zum Streit „alles ins Backend” gegen „kritische Integrität in die Datenbank”: Wann hat wer recht, und wie würden Sie die Logik dieses Übungsbeispiels konkret aufteilen?
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Worin unterscheiden sich
FUNCTIONundPROCEDURE, und wie ruft man sie auf? - Was passiert bei
RAISE EXCEPTIONinnerhalb einer Procedure mit den bisherigen Änderungen? - Was enthalten
NEWundOLDin einemUPDATE-Trigger? - Warum protokolliert man Preisänderungen nur bei
OLD <> NEW? - Warum eignet sich ein BEFORE-Trigger besser zur Validierung als ein AFTER-Trigger?
- Ein Dokument mit den Screenshots der Definitionen (Functions, Procedure, Trigger-Funktionen), der Testaufrufe samt Ergebnissen bzw. Fehlermeldungen, den Antworten auf alle Theorie- und Reflexionsfragen und dem Objektüberblick aus Teil D.
HTL Villach, Schuljahr 2025-2026,
https://www.htl-villach.at