Probeklausur Datenbanken und Informationssysteme II Szenario: Bibliothek. Es gibt Autoren, Bücher, Exemplare, Kunden, Kategorien und Ausleihvorgänge. Aufgabe 1 (Trigger) [ 32 ] a) Analysiere das relationale Schema aus Anhang A und erstelle ein ER-Diagramm (Notation mit min/max- Kardinalitäten). Bitte Attribute angeben, Schlüsselattribute unterstreichen, Not Null Statements beachten! Hinweis: Nur Tabellen, die ein oder mehrere Schlüsselattribute besitzen dürfen als Entitäten abgebildet werden. b) Implementiere in PL/SQL einen Trigger, der beim Eintrag eines Ausleihvorgangs überprüft, ob nicht die maximale Anzahl an gleichzeitig ausgeliehenen Büchern (5 Stück) überschritten wurde. Wenn die Anzahl überschritten wurde so gib mittels RAISE_APPLICATION_ERROR(errno, msg)folgende Fehlermeldung aus: Fehler für Benutzer <benutzernnummer>: Es dürfen maximal 5 Bücher gleichzeitig ausgeliehen werden. c) Erweitere das ER-Modell und das relationale Modell, so dass auch Vormerkungen auf Bücher getätigt werden können. Beachte dabei, dass Vormerkungen später in der Reihenfolge ihres Auftretens bearbeitet werden sollen (d.h. wer zuerst vorgemerkt hat bekommt das Buch auch zuerst). d) Kann mittels DDL-Constraints verhindert werden, dass eine Person verschiedene Exemplare des gleichen Buchs gleichzeitig ausleiht? Begründe deine Antwort. Wie sieht es bei den Vormerkungen aus? Aufgabe 2 (PHP) [ 25 ] Gegeben ist das Fragment einer OR-Schicht (Anhang B). Benutze das in Aufgabe 1 erstellte relationale Schema und erweitere die OR-Schicht um folgende Methoden (Hinweis: du kannst entweder die MDB2 oder die MDB2_Util Library zur Implementierung der Methoden benutzen): Achtung: In Aufgabenteil (a) wird die Instanz eines Exemplars als Parameter übergeben, in Teil (c) ist es eine Buchinstanz. a) Implementiere in der Klasse CRUD_Kunde eine Instanzenmethode leiht_aus($exemplar_instanz). b) Erstelle die Klasse Buch mit der Methode verfuegbare_exemplare(), welche alle zum aktuellen Zeitpunkt verfügbaren Exemplare dieses Buches als Array von Instanzen zurückliefert. c) Erstelle die Applikationslogikklasse Kunde sowie darin eine Methode leiht_aus($buch_instanz), welche einen Ausleihvorgang ausführt. Das konkret ausgeliehene Buchexemplar soll als Instanz zurückgeliefert werden. Ist zum aktuellen Zeitpunkt kein Exemplar verfügbar, so soll NULL zurückgeliefert werden. Hinweis: schau dir die Methoden an die es schon gibt 1
Aufgabe 3 (XML) [ 37 ] a) Gegeben ist das in Anhang C dargestellte XML Dokument. Formuliere als XPATH (Input ist unterstrichen): - Wie viele Bücher hat Karl Sommer aktuell ausgeliehen? - Wie viele verschiedenen Werke (nicht Exemplare) befinden sich von Tom Coraghessan Boyle in der Bibliothek? - Gib jeweils das Anschaffungsdatum der Exemplare von Moby Dick zurück? b) Schreibe einen SQLX-Ausdruck, das einen XML-Datensatz zurückliefert der alle Bücher entsprechend ihrer Kategorie ausgibt. Die Ausgabe soll wie in Anhang D aussehen (Input: Anhang A). c) Erstelle eine XQuery (Input ist die Datei aus Anhang C), die für alle Kunden, welche aktuell Bücher ausgeliehen haben, diese, wie im folgenden XML-Fragment gezeigt, ausgibt. <?xml version="1.0" encoding="utf-8"?> <offene-ausleihen> <kunde name="bernd Buecherwurm"> <buch ausleihdatum="2012-01-12">database System Concepts</buch> <kunde name="lina Leseratte"> <buch ausleihdatum="2013-01-12">drop City</buch> <kunde name="sven Smoeker "> <buch ausleihdatum="2013-01-12">database System Concepts</buch> <buch ausleihdatum="2013-01-05">moby Dick</buch> </offene-ausleihen> d) Gehe davon aus, dass in der Spalte document der Tabelle BIBLIO_XML jeweils als Datensatz die Bibliotheksdaten (Format siehe Anhang C) einer Bibliothek (z.b. HSKA) liegen. Erstelle ein SQL-Statement, so dass sich Sven Schmöker an der HSKA Bibliothek (Attribut des Wurzelelements) heute das einzige Exemplar des Buches Wassermusik ausleiht. Hinweis: Das aktuelle Datum als Zeichenkette bekommst du wie folgt: to_char(sysdate(), YYYY-MM-DD ) 2
Anhänge: Anhang A: create table kunde ( name varchar2(40) not null create table kategorie ( id number(3) primary key, bezeichnung varchar2(20) unique not null create table buch ( titel varchar2(80) not null, erscheinungsjahr number(4), kategorie_fk number references kategorie(id) create table autor ( name varchar2(40) not null create table ist_autor ( buch_fk number(8) references buch(id) on delete cascade not null, autor_fk number(8) references autor(id) on delete cascade not null, position number(2) default 1 -- reihenfolge in autorenliste create table exemplar ( buch_fk number(8) references buch(id) on delete cascade not null, anschaffungsdatum date default sysdate not null create table ausleihvorgang ( exemplar_fk number(8) references exemplar(id) on delete cascade not null, ausleiher_fk number(8) references kunde(id) on delete cascade not null, ausleihdatum date default sysdate not null, rueckgabe date 3
Anhang B: class CRUD_Kunde { protected $id; protected $name; function construct($dic) {... } // von euch zu implementieren function leiht_aus($exemplar) {... } } static function create($name) {... } class CRUD_Buch { protected $id; protected $titel; protected $erscheinungsjahr; function construct($dic) {... } function getid() {... } function gettitel() {... } } static function create($titel, $erscheinungsjahr) {... } class CRUD_Exemplar { protected $id; protected $buch_fk; protected $anschaffungsdatum; function construct($dic) {... } function getid() {... } function getbuch() {... } } static function create($buch_fk, $anschaffungsdatum) {... } 4
Anhang C (XML-Dokument) <?xml version="1.0" encoding="utf-8"?> <bibliothek id="hska"> <autoren> <autor id="a5777">hermann Melville</autor> <autor id="a5778">tom Coraghessan Boyle</autor> <autor id="a7611">avi Silberschatz</autor> </autoren> <buecher> <buch autor="a5778" id="b3493"> <titel>wassermusik</titel> <erscheinungsjahr auflage="1">1990</erscheinungsjahr> <exemplare> <exemplar id="1"> <anschaffungsdatum>1991-10-15</anschaffungsdatum> </exemplar> </exemplare> </buch> <buch autor="a5777" id="b9110"> <titel>moby Dick</titel> <erscheinungsjahr auflage="1">1851</erscheinungsjahr> <exemplare> <exemplar id="1"> <anschaffungsdatum>2002-03-01</anschaffungsdatum> </exemplar> <exemplar id="2"> <anschaffungsdatum>2004-10-15</anschaffungsdatum> </exemplar> </exemplare> </buch> </buecher> <kunden> <kunde id="k324141"> <name>bernd Buecherwurm</name> <ausleihvorgaenge> <ausleihe buch="b3471" exemplar="2" von="2012-01-12" bis="2012-01-31"/> <ausleihe buch="b9110" exemplar="1" von="2012-04-01"/> </ausleihvorgaenge> <kunde id="k324142"> <name>lina Leseratte</name> <ausleihvorgaenge> <ausleihe buch="b3471" exemplar="1" von="2013-01-12"/> </ausleihvorgaenge> </kunden> </bibliothek> 5
Anhang D (SQLX Ausgabe) <katalog> <kategorie name="informatik"> <book erscheinungsjahr="2000">datenbanken Konzepte und Sprachen</book> <book erscheinungsjahr="2005">datenbanken: Implementierungstechniken</book> </kategorie> <kategorie name="roman"> <book erscheinungsjahr="2003">drop City</book> <book erscheinungsjahr="1987">wassermusik</book> <book erscheinungsjahr="1993">gruen ist die Hoffnung</book> </kategorie> </katalog> 1 Zeile(n) ausgewählt. 6