10.02.2013 Aufrufe

Aufgabensammlung Datenbankkurs

Aufgabensammlung Datenbankkurs

Aufgabensammlung Datenbankkurs

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!