Vorlesung8 - Wiederholung: Referentielle Integrität

Werbung
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
Vorlesung #8
Wiederholung: Referentielle Integrität/
Embedded SQL
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
„Fahrplan“
 Wiederholung
 Beziehungstypen 1:1, 1:n, n:m
 Primärschlüssel, Fremdschlüssel, referentielle Integrität
 Dynamische Intergritätsbedingungen - „Trigger“Konzept von Oracle
 Prozedurale Erweiterungen (Embedded SQL)





Beispiel Oracle PL/SQL
Einbettung von SQL in Wirtssprachen, C, C++
ODBC – Open Database Connectivity
JDBC – Java Database Connectivity
SQLJ – Einbettung von SQL in Java
 QBE – Query by Example
 Fazit und Ausblick Vorlesung #9
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
2
Relationales Modell
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 ... besteht aus Relationen bzw. Tabellen, die
zueinander in Relation stehen
 Relation = Beziehung
 Relation:
 Synonym für Tabelle und
 Synonym für Beziehung
 umgangssprachlich: Tabellen stehen in einer
Beziehung zu einander (Relationen stehein in
Relation zu einander )
 Das relationale Modell beschreibt die Beziehung
zwischen zwei Tabellen (Relationen) mittels
referentieller Integrität
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
3
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
Beziehungstypen
 Zwei Tabellen T1, T2. Beziehungstypen





1:1, 1:n, n:m
m:1 entfällt, da analog zu 1:n
1:1 Ehemann <-> Ehefrau,
1:n Mannschaft <-> Spieler
n:m Studenten <-> Vorlesungen
 (* Notation Prof. Kemper, die meiste Literatur)
© Bojan Milijaš, 28.11.2007
T1/T2
1
n
1
1:1
1:n
m
m:1
n:m
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
4
Beziehungstypen (fortgesetzt)
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 Notation Prof. Schwenkert
T1/T2 1
c
m
mc
1
1:1
1:c
1:m
1:mc
c
c:1
c:c
c:m
c:mc
n
n:1
n:c
n:m
n:mc
nc
nc:1
nc:m
nc:m
nc:mc
 c steht für „conditional“, d.h „ein“ oder „kein“
 Eigentlich 10 statt 16 Funktionalitäten, da Einträge
oberhalb der Diagonale analog zu Einträgen
unterhalb der Diagonale ist
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
5
Schlüsselbegriff
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 Primary Key – PK – Primärschlüssel
 identifiziert eindeutig eine Relation
 kann aus mehreren Attributen (Spalten) bestehen
 zusammengesetzter Primärschlüssen
 Beispiel: Relation Personen
 Personal_ID - einfacher PK
 (Vorname, Nachname, Geburtsort und Geburtsuhrzeit) –
zusammengesetzter PK
 Foreign Key – FK - Fremdschlüssel
 zeigt auf die Primärschlüsselspalte in der
Referenztabelle
 sorgt für referentielle Integrität
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
6
1:1 Beziehungen
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 Beispiele:
 Ehemann <-> Ehefrau
 Fußballverein <-> Trainer (*an einem Spieltag)
 können in eine einzige Relation bzw. Tabelle
zusammengefasst werden
 Stufe 1 (3 Tabellen)
 Männer <-> Ehen <-> Frauen
 FK  zusammengesetzter PK  FK
 Stufe 2 (2 Tabellen):
 Männer <-> Ehefrauen
 FK  PK
 Stufe 3 (1 Tabelle): Eheleute
 Zusammengesetzter PK
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
7
1:n Beziehungen
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 Beispiele:
 Mutter <-> Kinder
 Fußballverein <-> Spieler
 können in zwei sinnvolle Relationen (sinnvoll = ohne
Redundanz) bzw. Tabellen zusammengefasst werden
 Stufe 1 (3 Tabellen):
 Mütter <-> Mutter_Kind <-> Kinder
 FK  zusammengesetzter PK  FK
 Stufe 2 (2 Tabellen): Mütter <-> Kinder
 PK  FK
 Stufe 3 (1 Tabelle): Kinder (Redundanz – sämtliche
Informationen über Mutter wiederholt sich pro Kind!!!)
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
8
n:m Beziehungen
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 Beispiele:
 Menschen <-> befreundet_mit <-> Menschen
(rekursiv, Self-Join)
 Fußballvereine <-> spielen_in <-> Gaststadien
 können nicht sinnvoll zusammengefasst
werden, man braucht immer eine
Zuordnungsrelation
 Fußballvereine <-> spielen_in <->
Gaststadien
 FK  zusammengesetzter PK  FK
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
9
Dynamische
Integritätsbedingungen
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 Statische Integritätsbedingungen: PRIMARY KEY,
FOREIGN KEY, CHECK, UNIQUE etc.
 Dynamische Integritätsbedingungen: Bedingungen
an Zustandsänderungen bzw. Datenänderungen
werden mittels Trigger überprüft. Man kann mit
Triggern auch nachträgliche bzw. zusätzliche
Berechnungen durchführen.
 CREATE TRIGGER – eigenständiger Datenbankobjekt der
einer Tabelle zugeordnet wird, d.h. auf eine Tabelle
„aufpasst“
 Auslöser wird definiert (before update, for each row)
 Bedingungen gefolgt von Anweisungen
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
10
Trigger in Oracle Syntax
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
create or replace trigger keineDegradierung
before update on Professoren
for each row
when (old.Rang is not null)
begin
if :old.Rang = 'C3' and :new.Rang = 'C2' then
:new.Rang := 'C3';
end if;
if :old.Rang = 'C4' then
:new.Rang := 'C4';
end if;
if :new.Rang is null then
:new.Rang := :old.Rang;
end if;
end;
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
11
Trigger in Oracle Syntax (2)
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
Vereinfacht – nur DML Events, man kann auch DDL abfangen
CREATE [OR REPLACE] TRIGGER [schema .] trigger
{ BEFORE | AFTER | INSTEAD OF }
{ DELETE |
INSERT |
UPDATE [OF column [, column]...] }
[FOR EACH ROW]
[WHEN ( condition ) ]
{ pl/sql_block | call_procedure_statement }
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
12
Trigger in DB2 Syntax
© Bojan Milijaš, 28.11.2007
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
13
WS 2007/08
Prozedurale Erweiterung von
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
SQL – Oracle PL/SQL
 Trigger waren bzw. sind bereits prozedural!
 Prozedurale Erweiterung ist notwendig
 Aus theoretischer Sicht – um TouringVollständigkeit zu erreichen
 Aus praktischer Sicht - manche Probleme des
Alltags, lassen sich einfacher prozedural statt
deklarativ lösen
 Hauptbegriff: Datenbank Cursor
 Dynamisches SQL in PL/SQL – würde hier
den Rahmen sprengen
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
14
Oracle PL/SQL
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 Prozedurale Erweiterung von SQL
 Beispiel: Funktion Summe - rekursiv
CREATE FUNCTION Summe1 (n INTEGER)
RETURN INTEGER
IS
BEGIN
IF n = 0
THEN return 0;
ELSIF n = 1 THEN return 1;
ELSIF n > 1 THEN return n + Summe1(n - 1);
END IF;
END;
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
15
Oracle PL/SQL (2)
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 nicht rekursiv
 nicht rekursiv, schlau
FUNCTION Summe2(n INTEGER)
RETURN INTEGER
IS
result INTEGER DEFAULT 0;
v_n INTEGER DEFAULT n;
BEGIN
WHILE v_n >= 0
LOOP
result := result + v_n;
v_n := v_n - 1;
END LOOP;
return result;
END;
FUNCTION Summe3(n INTEGER)
RETURN INTEGER
IS
BEGIN
RETURN (n*(n+1))/2;
END;
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
16
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
17
Oracle PL/SQL Beispiel
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 man verfügt über eine Tabelle (oder eine
View), die zu jeder Spiel-Saison einen oder
mehreren Trainer eines Vereins beinhaltet
 Man möchte für jeden Trainer SaisonIntervale bestimmen
 In SQL sehr umständlich, mit vielen „unsauberen“
Hilfskonstrukten
 Besser mit einer einfachen Schleife, die sich
Zustandsübergänge merkt
 Wie bringt aber man aber Daten aus einer
Tabelle in eine prozedurale Sprache hinein?
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
18
Deklarativ vs. Prozedural (2)
© Bojan Milijaš, 28.11.2007
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
19
Deklarativ vs. Prozedural (3)
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 Zeitintervall jedes Trainers
 Idee
 Sortiere nach der Saison
 Merke den Trainer
 Bei jeder weiteren Saison überprüfe, ob sich der
Trainer geändert hat, d.h. vergleich den aktuellen
Trainer mit dem Trainer der Vorsaison
 Wenn ja, dokumentiere die Änderung
 Wiederhole bis zur aktuellen Saison
 Cursor-FOR oder Cursor-WHILE Schleife 
vorgestellt in der Vorlesung
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
20
Cursor Beispiel (3)
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
...
CURSOR c_club_trainer_saison
IS
SELECT saison, trainer, verein
FROM club_trainer_saison
ORDER BY saison;
...
BEGIN
FOR curvar IN c_club_trainer_saison
LOOP
... v_trainer := curvar.trainer; ...
END LOOP;
...
* Vollständiger Code wird Online gestellt 
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
21
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
22
Einbettung in Wirtssprachen
„Embedded SQL“
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
Mit Hilfe eines Präcompilers!!!
#include <stdio.h>
exec sql begin declare section;
varchar user_passwd[30];
int exMatrNr;
exec sql end declare section;
exec sql include SQLCA;
main()
{
printf("Name/Password:");
scanf("%", user_passwd.arr);
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
23
Einbettung in Wirtssprachen
„Embedded SQL“ (2)
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
user_passwd.len=strlen(user_passwd.arr);
exec sql wheneversqlerror goto error;
exec sql connect :user_passwd;
while (1) {
printf("Matrikelnummer (0 zum beenden):");
scanf("%d", &ecMatrNr);
if (!exMatrNr) break;
exec sql delete from Studenten
where MatrNr= :exMatrNr;
}
exec sql commit work release;
exit(0);
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
24
Einbettung in Wirtssprachen
„Embedded SQL“ (3)
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
error:
exec sql whenever sqlerror continue;
exec sql rollback work release;
printf("fehler aufgetreten!\n");
exit(-1);
}
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
25
Datenbankanbindungen
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
 ODBC (Open Database Connecticity)
 Anbindung von Windows-Programmen
 Beispiel –Excel Zugriff auf Oracle
 JDBC (Java Database Connectivity)
 Eigentlich ein CLI Call-Level Interface
 SQLJ
 Echte Einbettung von SQL in Java, wie C, C++
 Wichtig bei allen Schnittstellen: immer an die
Voreinstellungen denken
 was passiert bei einem Fehler
 gibt es automatisch einen COMMIT oder ROLLBACK
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
26
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
27
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
28
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
29
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
30
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
© Bojan Milijaš, 28.11.2007
Vorlesung #8 - Wiederholung Referentielle
Integrität / Embedded SQL
31
WS 2007/08
Datenbanksysteme
Mi 17:00 – 18:30
R 1.007
Vorlesung #8
Ende
Herunterladen