Universität Konstanz

Werbung
Universität Konstanz
Lehrstuhl DBIS
Prof. Marc H. Scholl / A. Seifert
Übungen zur Vorlesung
Informationssysteme
Wintersemester 01/02
4. Übungsblatt
Kontrolltermin: KW 47
Hinweis: Alle aktuellen Informationen dieser Veranstaltung sowie die ps/pdf-Version des
Übungsblattes können Sie auch im Web unter
http://www.inf.uni-konstanz.de/dbis/teaching/ws0102/informationssysteme abrufen.
1. Nullwerte, Aggregatfunktionen und Joins
Punkte 6
Gegeben ist folgender Datenbankauszug aus der Relation Studenten:
Studenten
SID
SName
SPunkte
SAlter
1
2
Karl
Maier
2
null
34
20
3
4
Geier
Hans
34
8
28
20
Erzeugen Sie die Tabelle Studenten und die dazugehörigen Tabellenwerte in Ihrem
Datenbankaccount. Nutzen Sie dazu das SQL-Skript unter
~seifert/oracleuebung/student.sql.
a) Schreiben Sie SQL-Statements, um die durchschnittliche Kreditpunktzahl,
die Summe aller Kreditpunkte und die Anzahl der Kreditpunkteinträge der
Tabelle Studenten zu berechnen. Wie verhalten sich die Aggregatfunktionen
bezüglich der Existenz von Nullwerten.
b) Ein Kommilitone von Ihnen hat die Aufgabe erhalten, alle Studenten aus der
DB zu erfragen, die mehr Kreditpunkte besitzen, als all diejenigen
Studenten, die jünger als 23 Jahre sind. Die beiden folgenden Statements
wurden von Ihrem Kommilitonen ausgearbeitet. Erzeugen beide Anfragen
das gleiche Ergebnis? Wenn nicht, erklären Sie warum (Gibt es Fälle, bei
denen beide Anfragen nicht das gleiche Ergebnis erzeugen?).
Select S.sname from Studenten s
where not exists
(Select * from studenten s1
where s1.salter < 23 and s.spunkte <= s1.spunkte);
Select s.sname from Studenten s
where s.spunkte > all
(Select s1.spunkte
from studenten s1 where s1.salter < 23);
c) Formulieren Sie folgende Join-Statements:
1
i. Bilden Sie den Left Outer Join der Relation Studenten mit sich selbst unter
Berücksichtigung der Join-Bedingung sid=sid.
ii. Bilden Sie den Right Outer Join der Relation Studenten mit sich selbst unter
Berücksichtigung der Join-Bedingung sid=sid.
iii. Bilden Sie den Left Outer Join der ersten beiden Tupel der Relation
Studenten mit den letzten beiden Tupeln unter Berücksichtigung der JoinBedingung sid=sid.
iv. Bilden Sie den Right Outer Join der ersten beiden Tupel der Relation
Studenten mit den letzten beiden Tupeln unter Berücksichtigung der JoinBedingung sid=sid.
2) DDL und DML Statements in Kombination:
Punkte 5
Gegeben sind folgende Relationenschemata:
Angestellter
AID
AName
AAlter
Abteilung
AbtID
AbtName
Bugdet
arbeitet
AID
AbtID
Stunden
Gehalt
Beantworten Sie die folgenden Fragen kurz und prägnant. Nach jeder
Fragestellung wird in Klammern darauf hingewiesen, ob die Aufgabe mit dem
Rechner (Oracle Datenbank) oder auf dem Papier gelöst werden soll.
a) Was versteht man unter Entity- und referentieller Integrität? Weshalb sind
diese zwei Integritätsbedingungen so wichtig? (Papier)
b) Formulieren Sie ein Beispiel für eine referentielle Integritätsbedingung, die sich
auf die Relation Abteilung bezieht. Geben Sie alle denkbaren Möglichkeiten an,
damit die gebildete referentielle Integritätsbedingung bewahrt wird, wenn ein
Anwender versucht, ein Abteilungstupel zu löschen. (SQL*PLUS, Papier)
c) Formulieren Sie SQL Statements, um die oben genannten drei Relationen
anzulegen. Achten Sie darauf, dass die notwendigen Entity- und referentiellen
Integritätsbedingungen enthalten sind. Beachten Sie, dass Sie die referentiellen
Integritätsbedingungen erst nach dem Anlegen der drei Relationstabellen
definieren können. Löschen Sie anschließend die angelegten Relationen wieder.
Beachten Sie dabei die Löschreihenfolge. (SQL*Plus)
d) Definiere eine Abteilungsrelation mit SQL, so dass garantiert ist, dass jede
Abteilung genau einen Abteilungsmanager zugewiesen bekommt. Löschen Sie
anschließend die angelegte Relation wieder. (SQL*PLUS)
e) Definiere eine Integritätsbedingung für die Relation Angestellter, die garantiert,
dass jeder Angestellte wenigstens 5000 DM verdient. Löschen Sie anschließend
die angelegte Relation wieder. (SQL*PLUS)
2
f) Stellen Sie sich vor, dass folgender View Senior_Angesteller definiert wurde:
Create View Senior_Angesteller (SName, SAlter, Gehalt)
As Select (A.AName, A.AAlter, A.Gehalt)
From Angestellter A
Where A.Alter>50
Erläutern Sie, was der Query Parser macht, wenn folgende Abfrage an die
Datenbank geschickt wird. (Papier)
Select S.SName
From Senior_Angestellter
Where S.Gehalt>100000
g) Kann ein SQL Update jeden Wert eines Relationenattributes ändern? Wenn dies
nicht der Fall ist, gib die Werte an, die nicht geändert werden können. (Papier)
h) Legen Sie die Relation Angestellter ohne Aktivierung der referentiellen
Integritätsbedingung wieder an. Formulieren Sie anschließend ein SQL
Statement, das „B. Maier“ mit der AID=101, Alter=45 und Gehalt=8000 der
Relation Angestellter hinzufügt. (SQL*Plus)
i) Formuliere Sie ein SQL Statement, das jedem Angestellten der Relation
Angestellter eine Gehaltserhöhung von 10 Prozent gewährleistet. (SQL*Plus)
j) Löschen Sie den angelegten Datensatz wieder. (SQL*Plus)
3) Views und Sicherheit mit SQL
Punkte 5
a) Gegeben ist folgendes Relationenschema:
Angestellter
AID
AName
AAlter
Gehalt
Stellen Sie sich vor, Sie müssen als Datenbankadministrator tätig werden. Zur
Vereinfachung besteht ihre Datenbank aus nur einer Relation. Dies ist die
erwähnte Angestellten-Relation. Aus firmenpolitischen Gründen möchte Ihr
Chef vermeiden, dass jeder Datenbankbenutzer herausbekommen kann, welcher
Mitarbeiter welches Gehalt erhält. Jedoch soll es jedem Benutzer erlaubt sein,
sowohl die Namen aller Angestellten als auch das Durchschnittsgehalt aller
Gehälter auszurechnen. Erarbeiten Sie einen Vorschlag, wie obige Forderung
effizient mittels Views realisiert werden kann. Definieren Sie dazu zunächst die
Tabelle Angestellter mit den dazugehörigen Attributen unter SQL*PLUS und
anschließend die dazugehörigen Sichten.
b) Gewähren Sie anschließend jedem Datenbankbenutzer das Recht, auf die
angelegten Sichten lesend zuzugreifen.
c) Ihr Chef möchte wissen, welche Angestellten weniger als 620 DM und welche
mehr als 6500 DM verdienen. Legen Sie dazu einen View an und gewähren Sie
Ihrem Chef (Seifert) das Recht, diesen View lesend zu benutzen. Außerdem
sollten Sie den User seifert die Möglichkeit geben, dass er das erworbene
Leserecht (Select-Recht) auch an andere DB-Benutzer weitergeben kann.
3
d) Als letztes möchte Ihr Chef wissen, wie Oracle das Weitergeben und Entziehen
von Rechten regelt. Als Ausgangsbasis der Betrachtung soll zunächst folgende
Abbildung dienen.
+
(1
R
0,
)
B
(3
0,
R+
)
(4
A*
(20
+
R
0,
)
E
D
, R+
)
+
C
(5
R
0,
) (6 0 ,
R+
)
F
Obige Abbildung ist wie folgt zu interpretieren: User A ist Eigentümer der
Relation Angestellter und hat zum Zeitpunkt 10 dem User B das Recht zum
Lesen (R) der Relation Angestellter mit der Erlaubnis der Propagierung dieses
Rechts (With Grant Option indiziert durch +) gegeben. Gleichfalls, jedoch zum
Zeitpunkt 20, hat A dem User C das Leserecht der Relation gewährleistet. Alle
weiteren Angaben der Abbildung können entsprechend abgeleitet werden.
Erarbeiten Sie experimentell Antworten auf folgende Fragestellungen:
i. Was passiert, wenn B dem User D das Leserecht für die Angestellten
Relation entzieht, d.h., welche User haben nach dem Revoke noch das
Leserecht der Relation?
ii. Wie reagiert Oracle, wenn C anschließend dem User D das Leserecht für die
Angestellten Relation entzieht?
Lösungshinweis: Um eine Antwort auf obige Fragestellung zu bekommen,
benötigen Sie mehrere DB-Accounts. Dazu stehen Ihnen folgende sechs Accounts
zur Verfügung a) $USER, b) $USER1, c) $USER2, d) $USER3, e) $USER4, f)
$USER5. Die Passwörter der Accounts entsprechen wieder den Usernamen.
4
Herunterladen