Datenbanksysteme WS 2015/16 Prof. Dr.-Ing. Sebastian Michel MSc. Manuel Hoffmann TU Kaiserslautern, FB Informatik – Lehrgebiet Informationssysteme Übungsblatt 10: Ausgabe 12.01.2016, Präsentation 20.01.2016 Aufgabe 1: User-Defined Functions http://dbis.informatik.uni-kl.de (1 P.) Verwenden Sie die Tabelle fernbus von Übungsblatt 9 und erstellen Sie User-Defined Functions: 1. Eine Prozedur preiserhoehung(int zuschlag), die den Preis jeder Busreise pro voller Stunde Reisedauer um zuschlag EUR erhöht. Beispiel: preiserhoehung(1) erhöht die Preise von Fernbusreisen, die weniger als 60 Minuten dauern, nicht, aber von Reisen, die z.B. 65 Minuten dauern, um einen Euro, die 150 Minuten dauern, um zwei Euro, etc. 2. Eine Funktion teuerer(int, int), die zwei Busnummern als Parameter erhält und −1 ausgibt, wenn die erste Fernbusreise günstiger als die zweite ist, 0, wenn die beiden Reisen gleich teuer sind und 1, wenn die erste Reise teurer als die zweite ist. 3. Eine Tabellenfunktion anschluss(int), die als Parameter eine Busnummer entgegennimmt und die Fernbusreisen anzeigt, die am Zielort der gegebenen Reise starten. Aufgabe 2: Trigger (1 P.) (a) Verwenden Sie auch für diese Aufgabe die Tabelle fernbus und erstellen Sie folgende Trigger: 1. Wenn eine neue Busreise eingetragen wird, soll ebenfalls die Rückfahrt eingetragen werden (sofern diese noch nicht existiert). 2. Wenn der Preis oder die Dauer einer Busreise geändert wird, soll dies auch für die Rückfahrt gelten. 3. Erstellen sie eine Tabelle fernbus archiv. Beim Löschen einer Busreise wird die Rückfahrt ebenfalls gelöscht und beide Fahrten kommen in diese Archiv-Tabelle. Verwenden Sie innerhalb der Trigger-Prozeduren den Befehl RAISE NOTICE, um Meldungen wie ”Der Preis und die Dauer der Rückfahrt wurde ebenfalls angepasst” auszugeben. (b) Gegeben eine abstrakte Relation Bus(busnr), die als Spezialisierungen Fernbus wie gehabt und Stadtbus(busnr, tarifzonen, wlan) hat. Erstellen Sie die passenden SQL-Tabellen für eine Ralisierung im Hausklassenmodell (vgl. Folien InSy SS2015, Kapitel 3). Wir wollen die Nachteile des Hausklassenmodells mit Triggern ausbügeln. Erstellen Sie einen Trigger, der bei einem INSERT-Befehl dafür sorgt, dass die eingefügte busnr über alle erstellten Tabellen eindeutig ist; auch wenn dazu eine andere als die vom Benutzer gewünschte Nummer benutzt werden muss. 1 Datenbanksysteme WS 2015/16 Prof. Dr.-Ing. Sebastian Michel MSc. Manuel Hoffmann TU Kaiserslautern, FB Informatik – Lehrgebiet Informationssysteme Übungsblatt 10: Ausgabe 12.01.2016, Präsentation 20.01.2016 http://dbis.informatik.uni-kl.de Aufgabe 3: Aktualisierbare Sichten (1 P.) In dieser Aufgabe betrachten wir nicht-verschachtelte Anfragen und Sichten. Das Regelsystem, nachdem PostgreSQL festlegt, welche Sichten automatisch durch INSERT, UPDATE oder DELETE Anfragen aktualisierbar sind, lautet wie folgt: • Die Sichtdefinition hat genau einen Eintrag in der FROM-Klausel. Dieser Eintrag referenziert eine Tabelle oder eine andere aktualisierbare Sicht. • Die Sichtdefinition beinhaltet keine WITH, DISTINCT, GROUP BY, HAVING, LIMIT oder OFFSET Klausel. • Die Sichtdefinition beinhaltet keine Mengenoperationen (UNION, INTERSECT oder EXCEPT). • Die Selektionsliste der Sicht darf keine Aggregatsfunktionen, Fensterfunktionen oder Funktionen, die Mengen zurückgeben, beinhalten. Erfüllt eine Sicht diese Anforderungen nicht, können Trigger definiert werden, die beim Aufruf einer dieser drei Anfragen ausgeführt werden, etwa: CREATE TRIGGER update_my_view INSTEAD OF UPDATE ON my_view FOR EACH ROW EXECUTE PROCEDURE update_my_view () ; 1. Kann eine Sichtdefinition der Form SELECT DISTINCT ... FROM view aktualisierbar gemacht werden? Können alle drei Operationen (INSERT, UPDATE, DELETE) oder nur ein Teil davon ausgeführt werden und gibt es vielleicht weitere Restriktionen? Wie muss ein Trigger und die getriggerte Funktion aussehen, um diese Funktionen auszuführen? 2. Wie lauten die Antworten für Definitionen der Form SELECT a, AGG(b) FROM view GROUP BY a, wobei AGG eine der Aggregatsfunktionen SUM, COUNT, MAX ist. 2