Eine Eventtechnikfirma möchte seine Auftragsverwaltung in einer Datenbank erfassen. Dazu sollen folgende Informationen gespeichert werden:
Sie finden nun im folgenden Bild ein ER-Diagramm, das die grobe Struktur der Datenbank abbildet, wobei Sie davon ausgehen können, dass die Abbildung sowohl den Sachverhalt als auch alle Kardinalitäten bereits korrekt abdeckt.
Ihre Aufgabe ist es nun:
Bei der Überführung in die CREATE-Anweisungen werden Sie feststellen, dass NULL-Werte durch das ERD erlaubt sind. Beim Abgabegespräch sollten Sie in der Lage sein, die betroffenen Tabellen zu nennen und Vorschläge zu machen, wie man diese NULL-Werte vermeiden kann. Es ist aber nicht notwendig, NULL-Werte bei den CREATE-Befehlen zu vermeiden und die mündliche Erklärung während des Abgabegesprächs ist ausreichend.
Erstellen Sie folgende Trigger:
Function:
f_calc_apos
, welche als Parameter die Auftragsnummer und
die APNr einer Auftragsposition erhält.
f_calc_apos
soll nun für die übergebene Auftragsposition den Wert
berechnen. Wobei folgendes zu beachten gilt:
Leiten Sie aus dem ER-Diagramm die Relationen der Datenbank in 3. Normalform so
ab, dass sie verbundtreu und abhängigkeitstreu sind. Sie können die Ableitung der
Relationen gleich unmittelbar in der geforderten Datei create.sql
vornehmen
und müssen KEIN explizites Dokument für das Relationenmodell (wie in den vorangegangenen
Semestern) erstellen.
Erstellen Sie eine Datei create.sql
, in welcher die nötigen CREATE-Befehle
gespeichert werden, um die Relationen mittels SQL zu realisieren. Dabei sind folgende
Punkte zu beachten:
Erstellen Sie eine weitere Datei insert.sql
, welche die INSERT-Befehle
für die Testdaten der in Punkt 2 erstellten Tabellen enthält. Jede Tabelle soll
zumindest drei Zeilen enthalten. Sie dürfen die Wahl der Namen, Bezeichnungen etc.
so einfach wie möglich gestalten, d. h. Sie müssen nicht "real existierende" Aufträge,
Personen, Leistungen, etc. wählen. Stattdessen können Sie auch einfach "Auftrag 1", "Auftrag
2", "Leistung 1", "Leistung 2" etc. verwenden.
Erstellen Sie eine Datei queries.sql
, welche den Code für
die SQL Query und die beiden Views enthält.
Erstellen Sie eine Datei plpgsql-teil.sql
, welche den Code für die
Trigger und die Funktion f_calc_apos
enthält.
Erstellen Sie eine Datei drop.sql
, welche die nötigen DROP-Befehle
enthält, um alle in den Punkten 2 und 4 erzeugten Datenbankobjekte wieder zu löschen. Das Schlüsselwort
CASCADE darf dabei NICHT verwendet werden.
Überlegen Sie sich eine sinnvolle Testabdeckung für die PL/pgSQL-Programmteile laut
Punkt 5, z.B.: Erweiterung der Testdaten, Aufruf der zu testenden PL/pgSQL-Programmteile
mit entsprechenden Ausgaben, so dass sich die erfolgreiche Durchführung der Tests
überprüfen lässt. Denken Sie auch an negative Tests, welche mit einer Exception
enden sollen, z.B. Aufruf der Funktion f_calc_apos
mit einer falschen Auftragsnummer.
Stellen Sie in Ihrem ZIP-Archiv die SQL-Dateien mit den zusätzlichen INSERT-Befehlen
und den "Testtreibern" in der Datei test.sql
bereit. Sie müssen in
der Lage sein, diese SQL-Dateien und PL/pgSQL-Dateien im Rahmen des Abgabegesprächs
ablaufen zu lassen.
Stellen Sie in Ihrem Abgabearchiv eine Listing-Datei mit dem Namen listing.txt
bereit, die Sie bei der Ausführung der SQL-Dateien erzeugt haben. Diese Datei soll
alle Informationen beinhalten, die beim Ablauf der Dateien create.sql, insert.sql, queries.sql
plpgsql-teil.sql, test.sql
und drop.sql
erzeugt werden.
Beachten Sie dazu bitte die Hinweise zur Benützung von psql am Ende dieses Dokuments.
Im Rahmen des Abgabegesprächs müssen Sie in der Lage sein, alle von Ihnen in der Abgabe bereitgestellten Dateien erklären zu können. Weiters wird erwartet, dass Sie auch das ER-Diagramm einwandfrei analysieren können, auch wenn es in diesem Semester bereits vorgegeben wurde. Bitte achten Sie auch darauf, dass sich alle von Ihnen abgegebenen Dateien auf dem bordo-Server ausführen lassen, um Probleme (und möglicherweise daraus resultierenden Punktabzug) zu vermeiden
Zusammenfassend sind nun folgende Dateien abzugeben:
create.sql
insert.sql
drop.sql
queries.sql
plpgsql-teil.sql
test.sql
listing.txt
Die aufgezählten Dateien sind in einer ZIP-Datei beispiel1.zip
bis
spätestens 02.11.2015 um 23:59 im TUWEL
abzugeben. Es wird stets die zuletzt hochgeladene Version Ihrer Lösung gewertet.
Achten Sie darauf, dass der Name jeder dieser abzugebenden Dateien so lautet wie oben
beschrieben. Erstellen Sie keine Ordner innerhalb der ZIP-Datei.
Die Verteilung der Punkte erfolgt nach folgendem Schlüssel:
create.sql
, insert.sql
, drop.sql
): max. 4 Punktequeries.sql
): max. 2 Punkteplpgsql-teil.sql
, test.sql
): max. 4 Punktelisting.txt
: Vorhandensein für das Erreichen der vollen Punkteanzahl
notwendig Im Rahmen des Kontrollgespräches wird nicht nur die Korrektheit, sondern vor allem das Verständnis der Konzepte überprüft. Durch die Übung sollen sowohl Ihre praktische Problemlösungskompetenz als auch das theoretische Wissen über Datenbanksysteme gefördert werden. Sie müssen daher bei den Abgabegesprächen in der Lage sein, nicht nur Ihre Beispiele zu erklären, sondern ebenfalls zeigen, dass Sie die bisher in der Vorlesung behandelte Theorie zu diesen Beispielen ausreichend verstanden haben. Dies soll Ihnen die Vorbereitung für die Prüfung erleichtern und so können Sie Ihr Wissen während der Abgabegespräche selbst testen und gegebenenfalls vertiefen.
Die volle Punktezahl gibt es nur, wenn die Beispiele korrekt gelöst wurden und die Lösung einwandfrei erklärt werden kann. Nicht selbstständig gelöste Abgaben werden mit 0 Punkten bewertet!
Erscheinen Sie in Ihrem eigenen Interesse pünktlich zum Abgabegespräch, da andernfalls nicht garantiert werden kann, dass Ihre gesamte Lösung in der verbleibenden Zeit beurteilt werden kann.
Bringen Sie bitte Ihren Studentenausweis zur Abgabe mit. Eine Abgabe ohne Ausweis ist nicht möglich.
Folgende Befehle können für Ihre Arbeit mit der interaktiven SQL-Shell psql von PostgreSQL hilfreich sein:
\?
: Listet alle psql-internen Befehle samt Erklärung auf.\i <dateiname>
: Führt das Skript <dateiname>
aus. Beispiel: \i create.sql
\o <dateiname>
: Lenkt die Ausgabe in eine Datei mit dem Namen
<dateiname>
um. Lässt man den Parameter <dateiname>
weg, so wird dieses Verhalten wieder abgestellt. Beispiel: \o listing.txt