Aufgabensammlung Datenbankkurs
Aufgabensammlung Datenbankkurs
Aufgabensammlung Datenbankkurs
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Aufgabensammlung</strong><br />
<strong>Datenbankkurs</strong><br />
© Dr. Arno Schmidhauser<br />
Letzte Revision: 1. Juni 2006<br />
Email: arno.schmidhauser@bfh.ch<br />
Webseite: http://www.sws.bfh.ch/db
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 2/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Inhalt<br />
Teil I - Datenmodellierung<br />
1 Die Support-Applikation................................................................................. 7<br />
2 Das Evaluationssystem................................................................................ 10<br />
Teil II - Relationenmodell und Normalisierung<br />
3 Schlüssel................................................................................................... 17<br />
4 Normalisierung........................................................................................... 17<br />
Teil III - SQL<br />
5 Vorbemerkungen........................................................................................ 21<br />
6 Erstellen von Tabellen ................................................................................. 23<br />
7 Domains ................................................................................................... 24<br />
8 Abfragen mit einer Tabelle ........................................................................... 24<br />
9 Einfaches Einfügen, Ändern, Löschen............................................................. 25<br />
10 Ändern der Tabellenstruktur......................................................................... 25<br />
11 Abfragen mit Gruppierung ........................................................................... 25<br />
12 Abfragen mit Unterabfragen in der where-Klausel............................................ 26<br />
13 Abfragen mit Inner Join............................................................................... 26<br />
14 Abfragen mit Outer Join .............................................................................. 26<br />
15 Abfragen mit Self Join ................................................................................. 27<br />
16 Views ....................................................................................................... 28<br />
17 Referentielle Integrität, Constraints............................................................... 28<br />
18 Trigger...................................................................................................... 28<br />
19 Funktionen ................................................................................................ 29<br />
20 Prozeduren ................................................................................................ 30<br />
Teil IV - Java Anbindung mit JDBC<br />
21 Übung Support-Servlet................................................................................ 33<br />
Teil V - Transaktionen und Technologie<br />
22 Transaktionsmodell..................................................................................... 39<br />
23 Serialisierbarkeit ........................................................................................ 39<br />
24 Concurrency Control in SQL ......................................................................... 40<br />
25 Lange Transaktionen................................................................................... 42<br />
26 Recovery................................................................................................... 42<br />
27 Optimierung .............................................................................................. 42<br />
Juni 2006 Arno Schmidhauser 3/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 4/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Teil I<br />
Datenmodellierung<br />
Juni 2006 Arno Schmidhauser 5/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 6/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
1 Die Support-Applikation<br />
1.1 Beschreibung<br />
Eine Hotline eines Software-Herstellers nimmt Anfragen und Anrufe von Kunden zu verschiedensten<br />
Fragen und Problemen entgegen. Anfragen können per Telefon oder per<br />
Web-Formular eingehen. Die telefonischen Anfragen werden vom Mitarbeiter, der Telefondienst<br />
hat, über eine Applikation in die Datenbank eingegeben. Die Formular-Anfragen<br />
werden via Webserver direkt in eine Datenbank übertragen.Kunden sind Personen, welche<br />
in der Regel eine Lizenz für eines oder mehrere der vertriebenen Produkte besitzen.<br />
Die Mitarbeiter, welche Supportdienst haben, sitzen vor einem Bildschirm und sehen darauf<br />
die wartenden Support-Anfragen. Ein Support-Mitarbeiter übernimmt, wenn er frei<br />
ist, die nächste Anfrage. Er ist dann für deren Beantwortung verantwortlich. Die Beantwortung<br />
kann unterschiedlich lange dauern, je nach Komplexität des Falles. Die Antwort<br />
wird vom Supportsystem beim Abschluss des Falles per Email an den Kunden zurückgeschickt.<br />
Jede Anfrage hat einen Status. Der Status ist bei Eintreffen der Anfrage "eingegangen".<br />
Mit der Übernahme durch einen Mitarbeiter wird die Anfrage "uebernommen".<br />
Sobald der Fall vom Mitarbeiter abgeschlossen wird, geht die Anfrage in den Zustand<br />
"abgeschlossen" über. Für die Support-Abteilung ist die Durchführung von statistischen<br />
Abfragen sehr wichtig, zum Beispiel welche Produkte wieviel Support verlangen, wie lange<br />
die Mitarbeiter für die Beantwortung brauchen usw. Der gesamte Fall wird daher aufbewahrt.<br />
Juni 2006 Arno Schmidhauser 7/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
1.2 Uses Case Diagramm<br />
Kunde<br />
F übernehmen<br />
1.3 Weitere Informationen<br />
Support-Applikation<br />
Fall eröffnen<br />
Fall bearbeiten<br />
F beantworten<br />
SupportStatistik<br />
anzeigen<br />
F abschliessen<br />
Mitarbeiter<br />
SupportLeiter<br />
� Von einem Fall wird das Eingangs- und das Abschlussdatum festgehalten.<br />
� Für den Mitarbeiter, welcher den Fall behandelt hat, wird die geleistete Supportzeit<br />
für diesen Fall festgehalten.<br />
� Produkte haben einen Namen und eine Version. Zu jedem Produkt gehört auch ein<br />
Datenblatt (Beispielsweise eine PDF-Datei).<br />
� Mitarbeiter haben einen Namen und einen Vornamen.<br />
� Die gesamte von einem Mitarbeiter geleistete Supportzeit ist wichtig für dessen Zeitabrechnung.<br />
Diese Supportzeit muss erhalten bleiben, auch wenn Fälle gelöscht werden.<br />
Das Mitarbeitertotal wird nach der Überzeitabrechnung Ende Jahr auf 0 zurückgesetzt.<br />
Die geleistete Supportzeit wird mit dem Abschluss eines Falles festgehalten<br />
und dem Mitarbeiter gutgeschrieben, der den Fall abschliesst.<br />
� Kunden haben einen Namen, eine Email-Adresse, eine Telefonnummer und ein Passwort.<br />
Letzteres wird für das Login in der Support-Applikation benötigt.<br />
� Kunden können für ein Produkt eine oder mehrere Lizenzen besitzen. Jede Lizenz ist<br />
zeitlich begrenzt. Unterschiedliche Versionen eines Produktes müssen einzeln lizenziert<br />
werden.<br />
� Für jede Lizenz existiert ein Key. Dieser Key wird dem Kunden mitgeteilt und dient als<br />
Beweis, dass der Kunde in Besitz der Lizenz ist.<br />
� Jeder Mitarbeiter hat einen anderen Mitarbeiter als Stellvertreter. Ein Mitarbeiter kann<br />
mehrere andere vertreten, hat selber jedoch nur einen, oder im Ausnahmefall keinen<br />
Stellvertreter.<br />
Juni 2006 Arno Schmidhauser 8/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
� Eine Lizenz kann nur existieren, wenn der zugehörige Kunde und das zugehörige Produkt<br />
existiert.<br />
� Eine Lizenz gehört lebenslang zum selben Kunden und zum selben Produkt. Sie kann<br />
nicht auf einen anderen Kunden oder ein anderes Produkt übertragen werden.<br />
� Ein Fall wird durch einen bestimmten Mitarbeiter übernommen. Es kann jedoch vorkommen,<br />
dass ein Mitarbeiter krank wird oder den Supportdienst verlässt. Unter diesen<br />
Umständen kann der Fall seinem Stelvertreter oder einem anderen Mitarbeiter<br />
zugewiesen werden.<br />
� Jeder Fall ist einer der Kategorien 'Softwarefehler', 'Bedienungsproblem', 'Lizenzierungsfrage'<br />
zugewiesen.<br />
1.4 Aufgaben<br />
F1 Erstellen Sie ein Datenmodell mit UML, welches die notwendigen Informationen<br />
für den Supportdienst umfasst.<br />
F2 Erstellen Sie ein State Event-Diagramm für den Zustand eines Supportfalles.<br />
F3 Erstellen Sie ein normalisiertes Tabellenmodell mit UML, inkl. Bezeichnung der<br />
Primärschlüssel und Sekundärschlüssel. Definieren Sie im Tabellenmodell auch die<br />
Datentypen für Attribute und allenfalls Hilfstabellen zur Ablage von festen Werten<br />
oder Konstanten.<br />
1.5 Anschlussfragen<br />
F4 Ein Fall bezieht sich auf Produkt und Kunde. Er könnte sich stattdessen nur auf<br />
Lizenz beziehen. Wo sehen sie Vor- und Nachteile? Technische Betrachtungen wie<br />
Performance oder Anzahl Tabellen in einer Abfrage sollen keine Rolle spielen, es<br />
geht nur um konzeptionell Vor- oder Nachteile.<br />
F5 Ein Supportfall soll sich auf einen früheren Supportfall beziehen können. Mit Hilfe<br />
welcher neuer Attribute in welcher (ev. neuen) Tabelle können Sie das modellieren?<br />
F6 Supportfälle werden von unterschiedlich qualifizierten Mitarbeitern behandelt. Die<br />
Kategorie 'Softwarefehler' wird von Ingenieuren behandelt, was den Support 250<br />
CHF/Stunde kostet. Die Kategorie 'Bedienungsproblem' wird von Mitarbeitern des<br />
Schulungszentrums behandelt, was den Support 180 CHF/Stunde kostet. Die Kategorie<br />
'Lizenzierungsfrage' wird von Verkaufsmitarbeitern behandelt, was den<br />
Support 140 CHF/Stunde kostet.<br />
Die Kosten des Supportdienstes werden periodisch ermittelt.<br />
Wo im Datenmodell bauen Sie die Kostensätze ein?<br />
F7 Die Kostensätze ändern sich gelegentlich. Trotzdem muss nachvollzogen werden<br />
können, welche Kostensätze zu einem bestimmten Zeitpunkt aktiv waren.<br />
Modellieren Sie diesen Sachverhalt im Datenmodell.<br />
Juni 2006 Arno Schmidhauser 9/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
2 Das Evaluationssystem<br />
2.1 Vorbemerkung<br />
Diese Aufgabe ist relativ komplex, bringt aber einige wichtige Problemstellungen auf, die<br />
im praktischen Datenbankentwurf immer wieder zu lösen sind.<br />
2.2 Beschreibung<br />
Das Evaluationssystem ermöglicht es, Umfragen über ein Fach oder einen Kurs bei Studierenden<br />
einer Fachhochschule per Browser/Email durchzuführen.<br />
2.3 Use Cases<br />
Administrator<br />
Evaluationssystem<br />
Stammdaten<br />
verwalten<br />
Fragebogen<br />
entwerfen<br />
Umfragen planen<br />
Umfrage<br />
abschliessen<br />
System<br />
2.3.1 Stammdaten verwalten<br />
Umfrage starten<br />
Umfrage auswerten<br />
Statistiken<br />
erstellen<br />
Fragebogen<br />
ausfüllen<br />
Student<br />
Stammdaten sind Klassen, Fächer, Dozenten und Studenten. Ein Student gehört gehört<br />
eventuell zu mehreren Klassen. Zwischen Klassen, Dozenten und Fächer besteht kein<br />
fester Zusammenhang. Dieser Zusammenhang wird erst über eine Umfrage hergestellt.<br />
Klassen haben eine Bezeichnung und eine Beschreibung. Dozenten habe einen Name,<br />
Vorname, Email-Adresse und Passwort. Fächer haben eine Abkürzung, einen Titel und<br />
eine Beschreibung. Studenten haben Name, Vorname und Email-Adresse.<br />
Dozent<br />
Juni 2006 Arno Schmidhauser 10/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
2.3.2 Fragebogen entwerfen (Fragebogentyp)<br />
Das Evaluationssystem kann für jede Umfrage einen bestimmten Fragebogentyp verwenden<br />
(Ein Fragebogentyp entspricht dem leeren Fragebogen, definiert also Art und Anzahl<br />
der Fragen, die möglichen Antworten usw.) Ein Fragebogentyp wird einmal erstellt und<br />
kann dann für viele Umfrage verwendet werden. Es muss möglich sein, den Fragenbogentyp<br />
anzupassen, also neue Frage hinzuzufügen, bestehende zu löschen, Frage- und<br />
Antworttexte anzupassen.<br />
Ein Fragebogentyp hat einen Namen und umfasst mehrere Abschnitte. Jeder Abschnitt<br />
hat einen Titel und beinhaltet mehrere Fragen. Die Abschnitte sind nummeriert.<br />
Es gibt folgende Arten von Fragen:<br />
Eine Multiple Choice Frage besteht aus dem Fragetext und einer Vorgabe mehrerer Antwortmöglichkeiten.<br />
Jede Antwortmöglichkeit besteht aus einer Beschriftung und einem<br />
hinterlegten Wert. Je nach Art der Frage ist die Beschriftung das wesentliche Element<br />
oder der Wert. Lautet die Frage beispielsweise 'Welche Zeitungen lesen Sie? (NZZ, Blick,<br />
BZ, Bund)', so ist die Beschriftung das wichtige Element, weil bei der Auswertung lediglich<br />
die Anzahl Nennungen für eine bestimmte Zeitung wichtig ist. Lautet die Frage 'Welche<br />
Noten geben Sie dem Dozenten? (Gut, Mittel, Schlecht)', so ist der Wert das wichtige<br />
Element, weil letztlich ein Mittelwert aller Antworten gebildet werden soll.<br />
Für Multiple Choice-Fragen muss ausserdem angegeben werden können, wieviele Antworten<br />
mindestens und wieviele Antworten höchstens gegeben werden können.<br />
Eine Text-Frage ermöglicht die Eingabe von freiem Text als Antwort.<br />
Eine Wert-Frage ermöglicht die Eingabe eines beliebigen Zahlenwertes zwischen einem<br />
Minimal- und einem Maximalwert. Werte haben typischerweise auch eine Einheit, beispielsweise<br />
Meter, Tage, Kilogramm, Kisten usw.<br />
Zu jeder Frage gehört natürlich auch der eigentliche Fragetext. Die Fragen sind ausserdem<br />
nummeriert.<br />
2.3.3 Umfragen planen<br />
Umfragen können durch den Administrator geplant werden. Er muss hierzu folgende<br />
Angaben eingeben: Fach und Klasse, beteiligte Dozenten, Fragebogentyp, vorgesehenes<br />
Datum und Zeit des Versandes. Jede Umfrage hat einen Status. Beim Erstellen ist dieser<br />
Status 'geplant'.<br />
2.3.4 Umfrage verschicken<br />
Das Verschicken der Umfragen wird durch das System am vorgesehenen Datum zur vorgesehenen<br />
Zeit durchgeführt. Verschicken ist so zu verstehen, dass den Studenten ein<br />
Email geschickt wird. Dieses Email enthält einen Link auf das Evaluationssystem. In diesem<br />
Link ist eine ID eingebaut, die auf die zu beantwortende Umfrage, resp. auf den für<br />
diesen Studenten vorgesehenen Fragebogen zeigt. Klickt der Student im Email auf diesen<br />
Link, wird der Fragebogen aus der Datenbank dynamisch zusammengestellt und an den<br />
Browser geschickt.<br />
Mit dem Verschicken wird der Status der Umfrage auf 'laufend' gesetzt.<br />
2.3.5 Umfrage abschliessen<br />
Nach einer gewissen Zeit (einige Tage) wird die Umfrage durch den Administrator manuell<br />
abgeschlossen. Ab diesem Zeitpunkt können keine Fragebogen mehr beantwortet<br />
werden. Technisch heisst das Abschliessen lediglich, dass der Status der Umfrage auf<br />
'abgeschlossen' gesetzt wird.<br />
2.3.6 Fragebogen ausfüllen<br />
Der Student bekommt beim Versand der Umfrage ein Email zugestellt, das einen HTML-<br />
Link enthält. In diesem Link ist eine ID eingebaut, die auf die zu beantwortende Umfrage,<br />
resp. auf den für diesen Studenten vorgesehenen Fragebogen zeigt.<br />
Der Student klickt auf diesen Link. Damit wird das Evaluationssystem aufgerufen und ein<br />
Fragebogen dynamisch zusammengestellt (Die Formatierungsinformation sei in den Programmen<br />
enthalten und nicht der Datenbank). Für jeden Fragenbogen wird zuerst ein<br />
Juni 2006 Arno Schmidhauser 11/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Kopf erstellt, der Angaben zu Klasse, Fach, beteiligte Dozenten und Versand-Datum der<br />
Umfrage enthält. Der Hauptteil des Fragebogens besteht aus Abschnitten mit jeweils einer<br />
oder mehreren Fragen. Diese werden anhand der Definitionen aus dem Fragebogentyp<br />
zusammengestellt.<br />
Der Fragebogen (sein Layout) ist zwar nicht in der Datenbank vorhanden. In der Datenbank<br />
muss aber festgehalten werden, ob und wann der Fragebogen ausgefüllt wurde,<br />
damit derselbe Fragebogen nicht zweimal beantwortet werden kann.<br />
Beispiel eines Fragebogens:<br />
Juni 2006 Arno Schmidhauser 12/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
2.3.7 Umfrage auswerten / Statistiken erstellen<br />
Sobald eine Umfrage gestartet und die ersten Antworten eingegangen sind, können die<br />
an einer Umfrage beteiligten Dozenten eine Auswertung vornehmen.<br />
Der genaue Inhalt und die Art der Auswertungen ist für die Gestaltung der Datenbank<br />
weniger wichtig. Von äusserster Wichtigkeit ist jedoch, dass alle Informationen und Daten<br />
verfügbar sind. Das heisst auch, dass jede Antwort einzeln aufbewahrt wird, der Zusammenhang<br />
zur gestellten Frage, zum Fragebogen (resp. Student), zur Umfrage, zum<br />
Dozenten, zur Klasse, zum Fach usw. direkt oder indirekt erhalten bleiben muss.<br />
Es müssen beispielsweise folgende Fragen anhand der Datenbank beantwortet werden<br />
können:<br />
Durschnittlicher Wert der Frage F für einen Dozenten D in allen Klassen.<br />
Durschnittlicher Wert der Frage F über alle Dozenten einer bestimmte Klasse K. usw.<br />
usw.<br />
2.4 Aufgaben<br />
F8 Erstellen Sie ein konzeptionelles Datenmodell mit UML.<br />
F9 Wie würden Sie vorgehen, wenn das Evaluationssystem mehrsprachig sein müsste,<br />
das heisst, sämtliche dem Benutzer erscheinende Texte auf dem Fragebogen in einer<br />
vom Benutzer abhängigen Sprache erscheinen sollen?<br />
F10 Hat es in ihrer Lösung Vererbungsbeziehungen? Wenn ja, finden Sie Lösungsmöglichkeiten,<br />
diese in Tabellen abzubilden.<br />
Juni 2006 Arno Schmidhauser 13/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 14/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Teil II<br />
Das Relationenmodell<br />
Juni 2006 Arno Schmidhauser 15/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 16/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
3 Schlüssel<br />
F11 Was ist der Unterschied zwischen einem Relationenschlüssel und einem Primärschlüssel?<br />
F12 Was ist der Unterschied zwischen einem Primär- und einem Sekundärschlüssel?<br />
F13 Beschreiben Sie Anforderungen an einen Primärschlüssel.<br />
F14 Zählen Sie Erzeugungsmöglichkeiten für Primärschlüssel auf.<br />
4 Normalisierung<br />
F15 In welcher Normalform befindet sich eine Relation mit zwei Attributen (inkl.<br />
Schlüssel) immer, sofern sie bereits in erster Normalform ist?<br />
F16 Welche Probleme bezüglich Normalisierung sehen Sie in folgender Tabelle?<br />
Buch exemplarNr isbn titel standort<br />
1 123-123 SQL für Profis Bibliothek<br />
2 123-123 SQL für Profis Abteilung I<br />
3 123-123 SQL für Profis Abteilung W<br />
4 123-124 XML-Datenbanken Bibliothek<br />
5 123-125 UML und Datenbanken Bibliothek<br />
F17 Welche Normalform verletzt untenstehende Tabelle, wenn man von den Tatsachen<br />
ausgeht, dass a) ein Dozent verschiedene Kurse gibt, aber b) ein Kurstyp nur von<br />
einem Dozenten unterrichtet wird und c) derselbe Kurs pro Tag höchstens einmal<br />
stattfindet?<br />
Stellen Sie die funktionalen Abhängigkeiten dar und führen Sie eine Normalisierung<br />
bis zur 3NF durch? Die Attribute des Primärschlüssels sind unterstrichen.<br />
Kurs Doz# Doz_Name Ku# Ku_Name Datum<br />
1 Huber 10 ProjMan 19. April 02<br />
1 Huber 10 ProjMan 12. April 02<br />
2 Iselin 11 Java 13. April 02<br />
2 Iselin 12 C++ 21. Mai 02<br />
2 Iselin 12 C++ 28. Mai 02<br />
3 Fierz 13 Math 30. Juni 02<br />
F18 Stellen Sie die funktionalen Abhängigkeiten in untenstehender Tabelle dar. Überlegen<br />
Sie vorerst die Bedeutung der AHV-Nr.<br />
Dozent Doz# Doz_Name AHV-Nr<br />
1 Huber 822.59.268.113<br />
2 Iselin 162.62.468.122<br />
3 Fierz 423.56.487.132<br />
F19 Prüfen Sie folgende Excel-Tabellen auf die Normalisierung und normalisieren sie<br />
allenfalls:<br />
Juni 2006 Arno Schmidhauser 17/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Notenblatt<br />
Matrikelnr Name Fach Note<br />
05-477-611 Allensbach Peter Arbeitstechnik A<br />
Recht D<br />
Projektmanagement E<br />
05-477-642 Binggeli Martin Arbeitstechnik F<br />
Recht C<br />
Projektmanagement B<br />
05-477-681 Zyssett Claude Arbeitstechnik C<br />
Recht B<br />
Projektmanagement E<br />
Juni 2006 Arno Schmidhauser 18/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Teil III<br />
SQL<br />
Juni 2006 Arno Schmidhauser 19/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 20/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
5 Vorbemerkungen<br />
5.1 UML-Diagramm<br />
Mitarbeiter<br />
0..<br />
1<br />
0..<br />
*<br />
0..<br />
*<br />
1<br />
Fall<br />
Kunde<br />
0..<br />
*<br />
1<br />
1<br />
0..<br />
*<br />
Produkt<br />
1<br />
0..<br />
*<br />
Lizenz<br />
Das Kernelement des Datenmodelles ist der Supportfall (Tabelle Fall). Ein Fall referenziert<br />
obligatorisch einen Kunden und ein Produkt. Ein Fall durchläuft nacheinander die<br />
drei Zustände 'eingegangen', 'übernommen' oder 'abgeschlossen'. Ab dem Zustand 'eingegangen'<br />
ist dem Fall ein Mitarbeiter zugewiesen. Folgendes Zustandsdiagramm gilt für<br />
einen Supportfall:<br />
Übernahme durch Mitarbeiter<br />
eingegangen uebernommen<br />
Antwort erstellt und Kunde informiert<br />
abgeschlossen<br />
Juni 2006 Arno Schmidhauser 21/43
�<br />
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
5.2 SQL-Tabellen<br />
Folgende Tabellen-Definitionen sind für die Übungen vorgegeben:<br />
create table Mitarbeiter (<br />
idMitarbeiter numeric(10,0) not null,<br />
name varchar(32) not null,<br />
vorname varchar(32) not null,<br />
supportZeitTotal float null,<br />
primary key (idMitarbeiter),<br />
);<br />
create table Produkt (<br />
idProdukt numeric(10,0) not null,<br />
name varchar(255) not null,<br />
datenblatt long binary null,<br />
mimeType varchar(64) null,<br />
version varchar(16) not null,<br />
primary key (idProdukt),<br />
unique (name, version)<br />
);<br />
create table Kunde (<br />
idKunde numeric(10,0) not null,<br />
name varchar(32) not null,<br />
email varchar(32) not null,<br />
telefon varchar(16) null,<br />
passwort varchar(16) not null,<br />
primary key (idKunde),<br />
unique (email)<br />
);<br />
create table Lizenz (<br />
idLizenz numeric(10,0) not null,<br />
idKunde numeric(10,0) not null,<br />
idProdukt numeric(10,0) not null,<br />
lizenzKey SecureId not null,<br />
gueltigBis Date not null<br />
default dateadd( day, 30, current date ),<br />
primary key (idLizenz),<br />
unique (lizenzKey),<br />
foreign key (idProdukt)<br />
references Produkt (idProdukt) on delete restrict,<br />
foreign key (idKunde)<br />
references Kunde (idKunde) on delete cascade<br />
);<br />
Wenn Sie direkt mit dem Kapitel 8 'Abfragen mit einer Tabelle' beginnen, müssen Sie<br />
noch die Tabelle 'Fall' gemäss Lösung der Aufgaben F20 und F21 berücksichtigen.<br />
SQL-Definitionen für die Tabellen Mitarbeiter, Produkt, Kunde und Lizenz liegen in der<br />
Datei tables.sql bereits vor. Entsprechende Testdaten zum Einfügen finden Sie in der<br />
Datei data.sql. Übergeben Sie den Inhalt der beiden Dateien via 'Interactive SQL' der<br />
Datenbank.<br />
5.3 'Interactive SQL' Datenbank Frontend<br />
'Interactive SQL' ist das Frontend von Sybase ASA für eine Datenbank, um Tabellen zu<br />
definieren, Administrationsbefehle durchzuführen, Abfragen zu testen usw.<br />
Juni 2006 Arno Schmidhauser 22/43
�<br />
�<br />
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Im oberen Teil des Fensters geben Sie SQL-Befehl ein, im unteren ersehen Sie das Resultat<br />
von Abfragebefehlen:<br />
Bitte nehmen Sie für die Übungen folgende Einstellungen vor:<br />
Extras -> Optionen ...<br />
Die Dateien mit den detaillierten SQL-Definitionen, welche Sie als Vorlagen benützen<br />
können, sind auf der Webseite unter Hilfsmittel für die Aufgaben und Übungen -><br />
SQL-Skripte zu den Aufgaben zu finden.<br />
6 Erstellen von Tabellen<br />
F20 Erstellen Sie eine Tabelle Fall nach folgenden Anforderungen:<br />
Juni 2006 Arno Schmidhauser 23/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
� Die Tabelle muss die ID's des verantwortlichen Mitarbeiters, des Kunden und<br />
des Produktes enthalten. Der verantwortliche Mitarbeiter für den Fall ist nicht<br />
von Anfang bekannt.<br />
� Der Fall selber hat ebenfalls eine ID.<br />
� Jeder Fall hat eine Beschreibung sowie eine Antwort des Supports.<br />
� Jeder Fall durchläuft die folgenden Zustände: 'eingegangen', 'uebernommen'<br />
und 'abgeschlossen'. Im Zustand eingegangen ist noch kein Mitarbeiter zugewiesen.<br />
Dies geschieht erst mit der Übernahme durch einen Mitarbeiter.<br />
� Jeder Fall ist einer der Kategorien 'Softwarefehler', 'Bedienungsproblem', 'Lizenzierungsfrage'<br />
zugewiesen.<br />
� Eingangsdatum, Abschlussdatum und Zeitaufwand (dieser entspricht nicht<br />
notwendigerweise der Datumsdifferenz).<br />
� Definieren Sie die ID des Falles als Primärschlüssel.<br />
7 Domains<br />
F21 Falls Sie in der Tabelle Fall noch keine Domäne für den Support-Status und die<br />
Kategorie eines Falles definiert haben, tun Sie dies hier. Ein Beispiel, welches den<br />
Lizenz-Key für die Tabelle Lizenz definiert, ist in tables.sql zu finden.<br />
8 Abfragen mit einer Tabelle<br />
F22 Menge aller Kundeneinträge, sortiert nach Name. Sortierung aufsteigend.<br />
F23 Menge aller Kundeneinträge ohne Telefonangabe (telefon ist null).<br />
F24 Was ergibt die Abfrage<br />
select name from Kunde<br />
where name like 'O%' ?<br />
F25 Menge aller abgeschlossen Supportfälle zwischen 1. und 7. Juni 2003. Arbeiten<br />
Sie mit einem Tabellenalias.<br />
F26 Menge aller abgeschlossenen Supportfälle unter Angabe von idFall, abgeschlossenAm<br />
und der Dauer zwischen Eingang und Abschluss jedes Falles in Stunden<br />
(Funktion datediff() verwenden). Die Ausgabe soll absteigend sortiert sein, nach<br />
Dauer zwischen Eingang und Abschluss in Stunden. Das Ausgabeformat von abgeschlossenAm<br />
soll 'DD.MM.YYYY HH:NN') sein (Funktion dateformat() oder die<br />
Option set temporary option timestamp_format = '...' verwenden). Der<br />
Name der ersten Spalte soll Abschlussdatum sein, der Name der zweiten Spalte<br />
'Dauer in Stunden'.<br />
Juni 2006 Arno Schmidhauser 24/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
9 Einfaches Einfügen, Ändern, Löschen<br />
F27 Nehmen Sie einen neuen Kunden auf und eine Lizenz für ihn für das Produkt 'BancomatPlus'.<br />
Suchen Sie die idProdukt einmal manuell und einmal aufgrund des<br />
Produktnamens ( einmal insert into tabelle(...) values(...) und einmal<br />
insert into tabelle(...) select-Befehl verwenden.<br />
SQL-Befehle wie insert, delete, update werden immer innerhalb einer so genannten<br />
Transaktion durchgeführt. Das heisst, die vorgenommenen Änderungen<br />
sind noch nicht definitiv. Sie können sie jederzeit mit rollback wieder rückgängig<br />
machen. Erst wenn Sie die Änderungen mit commit bestätigen ('festschreiben'),<br />
sind sie definitiv. Mit rollback werden alle Änderungen seit dem letzten commit<br />
verworfen.<br />
F28 Löschen Sie den Kunden und seine Lizenz wieder.<br />
F29 Was ist der Unterschied zwischen dem Befehl drop und delete?<br />
10 Ändern der Tabellenstruktur<br />
Tabellen müssen aus folgenden Gründen gelegentlich geändert werden:<br />
� Es ist ein zusätzliches Attribut erforderlich.<br />
� Ein Attribute ist überflüssig und soll gelöscht werden.<br />
� Ein Attribut benötigt einen anderen Datentyp, z.B. einen grössere maximale<br />
Länge als bisher.<br />
� Bedingungen für ein Attribut müssen geändert, gelöscht oder hinzugefügt werden.<br />
Tabellen (nicht der Inhalt, sondern die Struktur) werden mit alter table geändert.<br />
Dabei ist es natürlich von absoluter Notwendigkeit, dass bereits bestehende<br />
Datensätze erhalten bleiben.<br />
F30 Ändern Sie die Tabelle Mitarbeiter, indem Sie ein neues Attribut idStellvertreter<br />
hinzufügen. Dieses soll für jeden Mitarbeiter die ID eines anderen Mitarbeiters<br />
sein, der sein Stellvertreter ist. Das Attribut darf null sein, d.h. ein Mitarbeiter<br />
kann auch keinen Stellvertreter haben.<br />
F31 Ändern Sie die Tabelle Mitarbeiter, indem Sie ein paar Stellvertretungen eintragen.<br />
11 Abfragen mit Gruppierung<br />
F32 Anzahl abgeschlossene Supportfälle pro Kategorie.<br />
F33 Anzahl Fälle, gesamter und durchschnittlicher Zeitaufwand aller Supportfälle pro<br />
Kategorie, gerundet auf 2 Stellen (round()-Funktion).<br />
F34 Welche Produkte (nur idProdukt und gesamter Supportaufwand angeben) haben<br />
insgesamt mehr als 10 Stunden Supportaufwand versursacht. Sortieren Sie absteigend<br />
nach Aufwand.<br />
F35 Liste aller Kunden (nur idKunde), sortiert nach total beanspruchtem Supportaufwand.<br />
Was passiert mit Kunden, die überhaupt nie Support beansprucht haben?<br />
Juni 2006 Arno Schmidhauser 25/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
12 Abfragen mit Unterabfragen in der where-Klausel<br />
F36 Welche Kunden haben keine Lizenz für irgendein Produkt? Versuchen sie eine Variante<br />
mit dem exists- und eine mit dem in-Operator.<br />
F37 Welche Kunden haben Produkt 4 und Produkt 5 lizenziert (nur mit idProdukt,<br />
nicht mit dem Produktnamen arbeiten)?<br />
F38 Welche Kunden haben Produkt 4 oder Produkt 5 lizenziert (nur mit idProdukt,<br />
nicht mit dem Produktnamen arbeiten)?<br />
13 Abfragen mit Inner Join<br />
Es gibt verschiedene Arten von Inner Joins. Je nach Aufgabe und Tabellenstrukturen<br />
eignet sich die eine oder andere Art, manchmal gibt es auch mehr als<br />
eine Möglichkeit:<br />
� Natural Join<br />
Verknüpfung von zwei Tabellen über ihre gemeinsamen, gleichnamigen Attribute:<br />
from Tabelle1 natural join Tabelle2<br />
� Key Join<br />
Verknüpfung von zwei Tabellen über die in der Tabellendefinition festgelegte Primärschlüssel/Fremdschlüssel-Beziehung.<br />
Der Key Join ist in der hier verwendeten Syntax<br />
Sybase ASA spezifisch:<br />
from Tabelle1 key join Tabelle2<br />
� Join On<br />
Zwei Tabellen werden durch Angabe einer On-Klausel explizit über eine bestimmte<br />
Join-Bedingung verknüpft:<br />
from Tabelle1 join Tabelle2<br />
on Tabelle1.attr1 = Tabelle2.attr2<br />
� Explizite Join-Bedingung als Teil der where-Klausel<br />
Dies ist die älteste und ausführlichste Schreibweise. Sie ist aber konzeptionell am<br />
klarsten und in jedem Datenbanksystem und für jede Aufgabenstellung anwendbar.<br />
from Tabelle1, Tabelle2<br />
where Tabelle1.attr1 = Tabelle2.attr2<br />
F39 Zu welchen Kunden gehören welche Lizenz-Keys? Erstellen Sie eine Liste der Lizenz-Keys<br />
mit dem zugehörigen Kundennamen und dem Gültigkeitsdatum. Keine<br />
Angabe des Produktnamens.<br />
F40 Liste aller abgeschlossenen Supportfälle mit Name des Mitarbeiters, Abschlussdatum<br />
und Beschreibung des Falles (Neueste Fälle zuerst).<br />
F41 Liste aller eingegangenen Supportfälle mit Name des Produktes, Name des Kunden,<br />
Beschreibung und Eingangsdatum des Falles. Sortiert nach Eingangsdatum.<br />
14 Abfragen mit Outer Join<br />
Es gibt verschiedene Arten von Outer Joins. Je nach Aufgabe und Tabellenstrukturen<br />
eignet sich die eine oder andere Art, manchmal gibt es auch mehr als<br />
Juni 2006 Arno Schmidhauser 26/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
eine Möglichkeit.<br />
� Natural Left|Right|Full Outer Join<br />
Verknüpfung von zwei Tabellen über ihre gemeinsamen, gleichnamigen Attribute:<br />
from Tabelle1 natural left|right|full outer join Tabelle2<br />
� Key Left|Right|Full Outer Join<br />
Verknüpfung von zwei Tabellen über die in der Tabellendefinition festgelegte Primärschlüssel/Fremdschlüssel-Beziehung.<br />
Der Key Join ist in der hier verwendeten Syntax<br />
Sybase ASA spezifisch:<br />
from Tabelle1 [key] left|right|full outer join Tabelle2<br />
Achtung bei Sybase ASA: Es wird ein Key Join durchgeführt, wenn weder natural,<br />
noch key noch eine on-Klausel angegeben ist. Die Syntax full outer join, ohne<br />
Angabe von key, natural oder einer on-Klausel führt zur Bildung eines kartesischen<br />
Produktes.<br />
� Left|Right|Full Outer Join On<br />
Zwei Tabellen werden durch Angabe einer On-Klausel explizit über eine bestimmte<br />
Join-Bedingung verknüpft:<br />
from Tabelle1 left|right|full outer join Tabelle2 on Tabelle1.attr1 =<br />
Tabelle2.attr2<br />
Achtung: Wenn Sie left outer join schreiben, meint Sybase ASA damit einen<br />
key left outer join und nicht einen natural left outer join.<br />
F42 Liste aller Mitarbeiter und ihrer Fälle, sortiert nach Mitarbeitername. Der Name<br />
des Mitarbeiters und das Eingangsdatum des Falles soll angegeben werden. Auch<br />
Mitarbeiter ohne Fälle sollen aufgeführt werden. Welche Mitarbeiter haben keine<br />
Fälle?<br />
F43 Liste aller Kunden und ihrer Lizenzen, sortiert nach Kundenname. Der Name des<br />
Kunden, das Gueltigkeitsdatum und die Lizenznummer soll angegeben werden.<br />
Auch Kunden ohne Lizenzen sollen aufgeführt werden.<br />
F44 Sind folgende zwei Abfragen äquivalent?<br />
select k.name, l.lizenzKey<br />
from Kunde k natural left outer join Lizenz l<br />
select k.name, l.lizenzKey<br />
from Kunde k natural join Lizenz l<br />
union<br />
select k.name, null<br />
from Kunde k<br />
where idKunde not in ( select idKunde from Lizenz)<br />
15 Abfragen mit Self Join<br />
Ein Self Join ist ein Join einer Tabelle mit sich selber. Dabei werden, logisch gesehen,<br />
aus einer Tabelle zwei Kopien erstellt und diese miteinander in einem Join<br />
verbunden. Damit die beiden logischen Kopien unterscheidbar sind, ist es bei einem<br />
Self Join zwingend, mit je einem Aliasnamen für die beiden Tabellen zu arbeiten.<br />
F45 Gegeben sei folgende Tabelle PersonenEigenschaft, welche Eigenschaften von<br />
Personen beschreibt (Der Datentyp aller Attribute ist varchar).<br />
Juni 2006 Arno Schmidhauser 27/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
person eigenschaft wert<br />
A schuhgrösse 41<br />
A haarfarbe braun<br />
A nationalität CH<br />
B schuhgrösse 42<br />
B haarfarbe blond<br />
B nationalität DE<br />
C schuhgrösse 41<br />
C haarfarbe schwarz<br />
C nationalität US<br />
D schuhgrösse 42<br />
D haarfarbe braun<br />
D nationalität US<br />
E schuhgrösse 43<br />
E haarfarbe blond<br />
E nationalität DE<br />
Erstellen Sie eine SQL-Abfrage zur Feststellung von "Berührungspunkten" einer<br />
Person A mit anderen Personen. Das heisst, die Abfrage soll alle Personen ausgeben<br />
(nur einmal), welche für eine oder mehrere Eigenschaften denselben Wert<br />
haben wie die Person A.<br />
16 Views<br />
F46 Zählen Sie Anwendungsmöglichkeiten von Views auf.<br />
F47 Welchem Konstrukt in Programmiersprachen (z.B. Java) entspricht eine View,<br />
wenn man die Tabelle mit einer Klasse vergleicht?<br />
17 Referentielle Integrität, Constraints<br />
F48 Erstellen Sie für die Tabelle Fall folgende zusätzlichen Integritätsbedingungen<br />
(Verwenden Sie den Befehl alter table add foreign key ... ).<br />
� Beim Löschen eines Mitarbeiters soll idMitarbeiter auf null gesetzt werden.<br />
� Das Löschen eines Kunden soll das Löschen aller Fälle dieses Kunden bewirken.<br />
� Das Löschen eines Produktes soll das Löschen aller Fälle dieses Produktes bewirken.<br />
F49 Stellen Sie in der Tabelle Mitarbeiter sicher, dass beim Löschen eines Mitarbeiters<br />
seine Einträge als Stellvertreter bei anderen Mitarbeitern auf null gesetzt werden(Verwenden<br />
Sie den Befehl alter table add foreign key ... ).<br />
18 Trigger<br />
Hinweis: Wenn Sie mehrere Trigger auf derselben Tabelle für dieselbe Aktion definieren<br />
wollen (also beispielsweise mehrere update-Trigger für die Tabelle Fall),<br />
so müssen Sie die Trigger mit der Klausel order n (siehe Manual) nummerieren.<br />
F50 Gegeben sei eine Tabelle, in der einzelne Schritte eines Arbeitsablaufes abgelegt<br />
sind:<br />
Juni 2006 Arno Schmidhauser 28/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
create table Workstep<br />
(<br />
idWorkstep uniqueidentifier default newid(),<br />
position integer not null,<br />
description varchar( 255 ),<br />
primary key ( idWorkstep )<br />
);<br />
Die Schritte müssen eine Nummerierung (Position) besitzen, so dass sie entsprechend<br />
dieser Nummerierung abgearbeitet werden können. Benützer der Tabelle<br />
können durch Einfüge-Operationen an beliebiger Stelle neue Schritte einfügen,<br />
oder durch Löschoperationen Schritte löschen, beispielsweise mit:<br />
insert into Workstep ( position, description )<br />
values( 1, 'Geld abheben' );<br />
insert into Workstep ( position, description )<br />
values( 2, 'Geschenk kaufen' );<br />
insert into Workstep ( position, description )<br />
values( 3, 'Geschenk verschicken' );<br />
Wenn eine Einfüge-Operation an einer bereits besetzten Position erfolgt, sollen<br />
diese und alle nachfolgenden Positionen um 1 erhöht werden. Beim Löschen einer<br />
Position sollen alle nachfolgenden um 1 nach unten rutschen. Erstellen Sie<br />
entsprechende Trigger.<br />
F51 Vervollständigen Sie folgenden Trigger für die Tabelle Fall, welcher die aufgewendete<br />
Supportzeit (Attribut zeitaufwand) für einen Fall beim entsprechenden Mitarbeiter<br />
im Attribut supportZeitTotal dazuaddiert:<br />
create trigger t_Fall_u1 after update of status order 1<br />
on Fall<br />
referencing new as newFall<br />
for each row<br />
when ( newFall.status = 'abgeschlossen' )<br />
begin<br />
...<br />
end;<br />
19 Funktionen<br />
F52 Ein klassisches Beispiel einer Funktion ist das Erzeugen von Primärschlüsseln. Primärschlüssel<br />
können auf verschiedenste Weise erzeugt werden: Eine häufige, aber<br />
unflexible und proprietäre Art ist das Verwenden eines Attributes mit automatischer<br />
Erhöhung (in Sybase ASA default autoincrement-Schlüsselwort für ein<br />
Tabellenattribut. Ein wesentlich allgemeineres und flexibleres Vorgehen ist wie<br />
folgt: In einer Hilfstabelle (z.B. KeyStore genannt) wird für jedes Schlüsselattribut<br />
(z.B. idFall oder idKunde) ein aktueller Zählerwert aufbewahrt. Muss ein Schlüsselwert<br />
generiert werden (z.B. im Rahmen eines insert-Befehls für die Tabelle<br />
Fall oder Kunde), so wird der Zähler in der Hilfstabelle erhöht und gelesen:<br />
KeyStore keyName keyValue<br />
idFall 1000<br />
idProdukt 1000<br />
idMitarbeiter 1000<br />
Juni 2006 Arno Schmidhauser 29/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
idLizenz 1000<br />
idKunde 1000<br />
F53 Erstellen Sie die Funktion getKey( keyName ), welche den verlangten Zähler erhöht,<br />
liest und an den Aufrufer zurückgibt. Ein Anwendungsbeispiel von getKey()<br />
könnte beispielsweise folgender insert-Befehl sein:<br />
insert into Mitarbeiter ( idMitarbeiter, name, vorname )<br />
values ( getKey( 'idMitarbeiter' ), 'Muster', 'Daniela' );<br />
Erstellen Sie ebenfalls die Tabelle KeyStore.<br />
20 Prozeduren<br />
F54 In jeder Datenbank ist die Information über Tabellen und andere Objekte der Datenbank<br />
ebenfalls in (System-)Tabellen abgelegt. Erstellen Sie eine Prozedur namens<br />
help mit dem Parameter tabname. Die Prozedur soll alle Attribute der Tabelle<br />
tabname mit der zugehörigen Information über Datentyp, Länge des Attributes<br />
usw. ausgeben. Konsultieren Sie das Datenbank-Handbuch zum Stichwort 'Systemtabellen'.<br />
Juni 2006 Arno Schmidhauser 30/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Teil IV<br />
Anbindung an Java mit JDBC<br />
Juni 2006 Arno Schmidhauser 31/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 32/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
21 Übung Support-Servlet<br />
Folgende Supportfälle sollen mit einer Web-Lösung realisiert werden.<br />
Kunde<br />
Support-Applikation<br />
Supportfall<br />
eingeben<br />
SupportFälle<br />
anzeigen<br />
«erweitert»<br />
Supportfall<br />
beantworten<br />
Mitarbeiter<br />
Die Weblösung basiert auf HTML-Formularen und einem oder mehreren Servlets (Java-<br />
Programm im Webserver). Die Prozesskette sieht wie folgt aus:<br />
HTML - Applikation<br />
Extranet<br />
HTTP<br />
Webserver<br />
Servlet<br />
JDBC<br />
DMZ<br />
SQL im<br />
Intranet<br />
RDB<br />
Server<br />
Intranet<br />
Das Servlet wird über zwei Einstiegsformulare aufgerufen: Support.html und Kunde.html.<br />
Das Erste ist für die Support-Mitarbeiter und dient dem Anzeigen und später dem Übernehmen<br />
von Supportfällen. Das zweite ist für die Kunden und dient dem Eingeben von<br />
Supportfällen.<br />
Juni 2006 Arno Schmidhauser 33/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
21.1 Aufgaben<br />
F55 Supportfälle anzeigen<br />
Supportfälle sollen als HTML-Webseite dargestellt werden. Der Support-Mitarbeiter kann<br />
in einem Eingabe-Formular (http://localhost/Support.html) den gewünschten Status<br />
(eingegangen, übernommen, abgeschlossen) wählen und sich die dazugehörenden Supportfälle<br />
anzeigen lassen. Die Anzeige soll folgende Felder umfassen:<br />
� Für jeden Fall soll Eingangsdatum, Name des Kunden, Name des Produktes und Beschreibung<br />
des Falles angezeigt werden.<br />
� Bei Fällen im Status 'übernommen' oder 'abgeschlossen' soll auch der Name des Mitarbeiters<br />
ausgegeben werden, der den Fall bearbeitet.<br />
doc\SupportFallAnzeige.html enthält ein paar Beispiele von HTML-Code, wie die Supportfälle<br />
dargestellt werden können. Dieser Code muss natürlich im Servlet dynamisch<br />
generiert werden, die Datei wird also nicht effektiv via Browser aufgerufen.<br />
F56 Supportfall übernehmen<br />
Ändern Sie das Servlet aus Aufgabe F55 so, dass bei der Anzeige der eingegangenen Fälle<br />
jeweils rechts von jedem Fall ein Feld für die Eingabe der Mitarbeiter ID und ein Knopf<br />
mit der Beschriftung 'übernehmen' steht. Beim Drücken des Knopfes wird das Servlet<br />
veranlasst, den Mitarbeiter in der Datenbank diesem Fall zuzordnen. Die Datei<br />
doc\SupportFallUebernahme.html enthält ein Beispiel von HTML-Code, wie die Supportfälle<br />
dargestellt werden können und wie Knöpfe eingebaut werden können. Dieser Code<br />
muss natürlich im Servlet dynamisch generiert werden, die Datei wird also nicht effektiv<br />
via Browser aufgerufen.<br />
Das Übernehmen des Supportfalles soll in der ersten Stufe nur gerade mit einem einfachen<br />
'Fall wurde übernommen' quittiert werden. In einer zweiten Stufe können Sie direkt<br />
ein HTML-Formular ausgeben, in das der Antworttext an den Kunden eingegeben werden<br />
kann. Das Übernehmen des Antworttextes führt dann zum Abschluss des Falles.<br />
F57 Supportfall eingeben<br />
Der Kunde soll nun effektiv einen Supportfall eingeben können. Ausgangspunkt ist das<br />
Eingabe-Formular (http://localhost/Kunde.html). Die Angaben werden vom Support-<br />
Servlet übernommen und in die Datenbank übertragen.<br />
Die Produktauswahl ist im Formular fix einprogrammiert. Das ist natürlich unschön. Entwickeln<br />
Sie anstelle des Formulares ein neues Servlet KundenServlet.java, welches das<br />
Eingabe-Formular dynamisch zusammenstellt. Der Aufruf des Servlets erfolgt dann über<br />
http://localhost/servlet/KundenServlet.<br />
21.2 Vorbereitung und Hinweise<br />
Gemäss Angaben Dozent die ZIP-Datei mit den Vorlagen für die JDBC-Übung entpacken.<br />
In das Verzeichis Vorlagen wechseln.<br />
Durch Anklicken von startWebserver.bat wird der Webserver gestartet.<br />
In einem Browser den URL http://localhost/Support.html eingeben.<br />
Es erscheint ein Formular mit dem man Supportfälle nach Status gefiltert abfragen kann.<br />
Den Namen der eigenen Datenbank angeben, klicken, und es erscheint eine Seite mit<br />
dem Text 'Verbindung aufgebaut.'.<br />
Juni 2006 Arno Schmidhauser 34/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Programmieren Sie die Java-Klasse SupportServlet.java nun entsprechend den obigen<br />
Aufgaben um.<br />
21.3 Hinweis zur Programmierung<br />
Sie können der Einfachheit halber zunächst nur eine fixe Abfrage einbauen, also nur mit<br />
Statement und nicht mit PreparedStatement arbeiten.<br />
Alles was Sie im Programm an den Browser ausliefern wollen, müssen Sie mit<br />
out.println(...) ausgegeben.<br />
Juni 2006 Arno Schmidhauser 35/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 36/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Teil V<br />
Transaktionen und Technologie<br />
Juni 2006 Arno Schmidhauser 37/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Juni 2006 Arno Schmidhauser 38/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
22 Transaktionsmodell<br />
F58 Warum müssen SQL-Lesebefehle (select) in einer Transaktion ablaufen, genauso<br />
wie Änderungsbefehle (insert, update, delete)?<br />
F59 Was bedeutet autocommit?<br />
23 Serialisierbarkeit<br />
F60 Der Primärschlüssel einer Tabelle sei gegeben durch einen Integer-Wert. Was halten<br />
Sie von folgender Methode für das Erzeugen von Primärschlüsseln?<br />
1. Suche den grössten vorhandenen Wert.<br />
2. Inkrementiere um 1.<br />
3. Benütze diesen neuen Wert als Primärschlüssel für den nächsten einzufügenden<br />
Datensatz.<br />
F61 Ist mit einem einfachen S/X-Locking-Mechanismus für Datensätze garantiert, dass<br />
nur noch serialisierbare Abläufe stattfinden können? Prüfen Sie anhand des folgenden<br />
Beispieles:<br />
Transaktion 1<br />
1.1 select :persnr<br />
from Person<br />
where name = "Schmid"<br />
1.2 delete from Person<br />
where persnr = :persnr<br />
1.3 delete from Adressen<br />
where persnr = :persnr<br />
commit<br />
Transaktion 2<br />
2.1 select :persnr<br />
from Person<br />
where name = "Schmid"<br />
2.2 select *<br />
from Adressen<br />
where persnr = :persnr<br />
commit<br />
F62 Mit Locking können natürlich nur Daten gesperrt werden, die vorhanden sind. Beschreiben<br />
Sie, was passieren könnte, wenn eine Transaktion mehrmals hintereinander<br />
den Befehl select * from Person absetzt, währenddesssen eine andere<br />
Transaktion neue Personen einfügt. Ist das Verhalten serialisierbar?<br />
F63 Was schliessen Sie aus der Lösung der Aufgaben F60 und F60 für die Serialisierbarkeit<br />
von Abläufen mit 2-Phasen-Sperr-Protokoll?<br />
F64 Jedes Datenbanksystem gibt X-Locks erst beim Transaktionsende frei. Warum?<br />
F65 Welcher Isolationsgrad ist mit dem Versionenverfahren von Oracle realisiert realisiert<br />
(READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALI-<br />
ZABLE)?<br />
F66 Stellen Sie sich vor, es gäbe einen Isolationsgrad DIRTY WRITE. Was wären die<br />
Konsequenzen für das Transaktionsverhalten des Datenbanksystems?<br />
Juni 2006 Arno Schmidhauser 39/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
F67 Stellen Sie sich vor, es gäbe einen Isolationsgrad SERIALIZE (im Gegensatz zu<br />
SERIALIZEABLE). Was wären die Konsequenzen für das Transaktionsverhalten und<br />
die Performance des Datenbanksystems?<br />
F68 Was ist ein Range Lock?<br />
24 Concurrency Control in SQL<br />
Die folgenden Aufgaben können Sie am besten über die DOS-Konsolenapplikation<br />
dbisql lösen. Geben sie hierzu in zwei DOS-Fenstern je folgenden Befehl ein:<br />
dbisql -nogui -c "DBN=dbname;UID=dba;PWD=sql"<br />
-host hostname -port 2638<br />
Damit wird je eine Session zur Datenbank gestartet. Der Autocommit-Modus ist<br />
standardmässig ausgeschaltet, was für die folgenden Aufgaben auch der Fall sein<br />
muss.<br />
Den Isolationsgrad können Sie ändern mit<br />
set transaction isolation level 0 | 1 | 2 | 3 .<br />
Den Isolationsgrad abfragen können Sie mit<br />
select connection_property ( 'isolation_level' )<br />
F69 Führen Sie in der Session 1 folgenden Befehl durch:<br />
update Mitarbeiter<br />
set supportZeitTotal = 24<br />
where idMitarbeiter = 3<br />
Führen Sie in der Session 2 unter den Isolationsgraden 0, 1, 2, 3 den Befehl<br />
durch:<br />
select *<br />
from Mitarbeiter;<br />
Wie verhält sich Session 2?<br />
Achtung: Schliessen Sie nach Beendigung der Aufgabe die Session 1 mit commit<br />
ab.<br />
F70 Führen Sie in Session 1 die Abfrage durch<br />
select *<br />
from Mitarbeiter<br />
Führen Sie in einer 2 die Abfrage durch<br />
update Mitarbeiter<br />
set supportZeitTotal = 24<br />
where idMitarbeiter = 1<br />
Bei welchem Isolationsgrad der Session 1 wird das Update von Session 2 behindert?<br />
Juni 2006 Arno Schmidhauser 40/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Achtung: Schliessen Sie nach Beendigung der Aufgabe die Session 1 mit commit<br />
ab.<br />
F71 Führen Sie vorerst in beiden Sessions die folgenden SQL-Befehle durch:<br />
create variable totSupp float;<br />
select supportZeitTotal into totSupp<br />
from Mitarbeiter<br />
where idMitarbeiter = 3;<br />
(Mit create variable wird eine lokale Variable erzeugt, die während der ganzen<br />
Session erhalten bleibt und nur in der erzeugenden Session sichtbar ist)<br />
Führen Sie anschliessend in beiden Sessions folgende Befehle<br />
durch:<br />
update Mitarbeiter<br />
set supportZeitTotal = totSupp + 1<br />
where idMitarbeiter = 3;<br />
select * from Mitarbeiter;<br />
commit;<br />
a) Welches Problem tritt auf, wenn die Transaktion in beiden Sessions unter Isolationsgrad<br />
1 ablaufen?<br />
b) Was passiert, wenn die beiden Transaktion unter Isolationsgrad 2 ablaufen?<br />
c) Können Sie das unter b) entstehende Problem mit Isolationsgrad 3 lösen?<br />
d) Könnten Sie den Befehl lock table nutzbringend einsetzen für die Lösung des<br />
Problems unter b)? Was sind die Vorteile/Nachteile?<br />
F72 Eine Applikation soll ausgeben, welche Supportfälle für das Produkt 3 bisher aufgetreten<br />
sind. Ausserdem soll sie die durchschnittliche Zeit ausgegeben, die für<br />
die Beantwortung eines Falles benötigt werden. Folgende SQL-Befehle werden also<br />
abgesetzt:<br />
select *<br />
from Fall<br />
where idProdukt = 3<br />
and status = 'abgeschlossen';<br />
select avg(zeitAufwand)<br />
from Fall<br />
where idProdukt = 3<br />
and status = 'abgeschlossen';<br />
Mit welchem Isolationsgrad sollte eine Transaktion für die Ausführung dieser beiden<br />
Abfragen arbeiten?<br />
F73 Gegeben sei folgende Situation: Die eingegangenen Support-Fälle werden auf einer<br />
Liste in einer Web-Applikation angezeigt. Diese Liste wird auf Knopfdruck des<br />
Mitarbeiters aktualisiert. Ebenfalls auf Knopfdruck kann der Mitarbeiter einen bestimmten<br />
Fall übernehmen. Da mehrere Mitarbeiter gleichzeitig im Support tätig<br />
sind, könnten unter Umständen zwei Mitarbeiter versuchen, denselben Fall zu übernehmen.<br />
Beschreiben Sie ein Vorgehen, wie sichergestellt wird, dass ein Fall<br />
nur von einem Mitarbeiter übernommen werden kann. Schreiben Sie die notwendigen<br />
SQL-Befehle hin.<br />
Juni 2006 Arno Schmidhauser 41/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
F74 Führen Sie die Befehle aus der Lösung von Aufgabe F73 mit Hilfe von zwei Interactive<br />
SQL Fenstern durch und verifizieren Sie die Lösung. Was passiert, wenn<br />
zwei Transaktionen gleichzeitig die Schritte 4 und 5 durchführen?<br />
25 Lange Transaktionen<br />
F75 Nennen Sie Anwendungsbeispiele wo das Arbeiten mit dem Checkout/Checkin-<br />
Verfahren angebracht ist.<br />
F76 Nennen Sie Anwendungsbeispiele wo das Arbeiten mit dem Zeitstempel/Prüfregel-<br />
Verfahren angebracht ist.<br />
26 Recovery<br />
F77 Wodurch unterscheidet sich ein Betriebssystem-Backup von einem On Line-<br />
Backup eines Datenbanksystems?<br />
27 Optimierung<br />
F78 Gegeben seien folgende zwei SQL-Definitionen:<br />
create table Person (<br />
name varchar( 100 ),<br />
vorname varchar( 100 ),<br />
lebenslauf varchar( 1800 ) );<br />
create index ixname on Person ( name );<br />
Die Tabelle Person sei 10‘000 Einträge gross. Der Index ixname sei ein B*-Baum<br />
mit jeweils 10 Schlüsselwerten pro Index-Knoten (Rechnen Sie mit der Vereinfachung,<br />
dass die Anzahl Schlüssel pro Knoten = Verzweigungsgrad des Index = 10<br />
ist). Die Anfangsbuchstaben der Namen seien gleichverteilt über das Alphabet und<br />
das Alphabet habe 25 Buchstaben. Jeder Personeneintrag in der Tabelle person<br />
belege eine ganze I/O-Page (2000 Bytes).<br />
Mit wievielen Zugriffen (Indexknoten und I/O-Pages mit Datensätzen) kann folgende<br />
Abfrage voraussichtlich abgearbeitet werden?<br />
select *<br />
from Person<br />
where name like 'S%'<br />
and vorname != ´Peter´<br />
F79 Gegeben sei folgende, leicht andere Tabelledefinition<br />
als in Aufgabe 27:<br />
create table Person (<br />
name varchar( 100 ),<br />
vorname varchar( 100 ),<br />
create index ixname on Person ( name );<br />
Juni 2006 Arno Schmidhauser 42/43
<strong>Aufgabensammlung</strong> <strong>Datenbankkurs</strong> SWS<br />
Die Tabelle Person sei 10‘000 Einträge gross. Der Index ixname sei ein B*-Baum<br />
mit jeweils 10 Schlüsselwerten pro Index-Knoten.<br />
Die Anfangsbuchstaben der Namen seien gleichverteilt über das Alphabet und das<br />
Alphabet habe 25 Buchstaben. Auf einer I/O-Page in der Tabelle Person finden 10<br />
Personen Platz.<br />
a) Mit wievielen Zugriffen (Indexknoten und I/O-Pages mit Datensätzen) kann folgende<br />
Abfrage abgearbeitet werden?<br />
select *<br />
from person<br />
where name like 'S%'<br />
and vorname != ´Peter´<br />
b) Mit wievielen Zugriffen (Indexknoten und I/O-Pages mit Datensätzen) kann folgende<br />
Abfrage abgearbeitet werden (Alle Personen, deren Name mit A, B oder C<br />
beginnt)?<br />
F80 select *<br />
from person<br />
where name >= 'A' and name < 'D'<br />
and vorname != ´Peter´<br />
F81 Gegeben seien folgende SQL-Tabellen und Indices:<br />
create table Person (<br />
idPerson numeric( 4,0 ),<br />
name varchar( 100 ),<br />
vorname varchar( 100 ),<br />
kommentar varchar( 1700 ) );<br />
create table Adresse (<br />
idPerson numeric( 4,0 ),<br />
strasse varchar( 100 ),<br />
ort varchar( 100 ),<br />
kommentar varchar( 1700 ) );<br />
create index ixPName on Person ( name );<br />
create index ixIdPPerson on Person ( idPerson );<br />
create index ixIdPAdresse on Adresse ( idPerson );<br />
F82 Jede Person habe durchschnittlich eine Adresse. Jede Adresse benötigt eine I/O-<br />
Page und jeder Indexknoten enthält 10 Schlüsselwerte.<br />
F83 a) Wie könnte folgende Abfrage abgearbeitet werden und wieviele Zugriffe werden<br />
dafür benötigt?<br />
F84 select *<br />
from Person join Adresse<br />
where Person.name like 'S%'<br />
F85 b) Wie könnte folgende Abfrage abgearbeitet werden und wieviele Seitenzugriffe<br />
werden dafür benötigt?<br />
F86 select *<br />
from Person join Adresse<br />
Juni 2006 Arno Schmidhauser 43/43