Upload
xiu
View
48
Download
0
Embed Size (px)
DESCRIPTION
Vorlesung #8 Wiederholung: Referentielle Integrität/ Embedded SQL. „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) - PowerPoint PPT Presentation
Citation preview
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Vorlesung #8
Wiederholung: Referentielle Integrität/
Embedded SQL
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
2
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 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
3
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Relationales Modell
... 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
4
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 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)
T1/T2 1 n
1 1:1 1:n
m m:1 n:m
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
5
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Beziehungstypen (fortgesetzt)
Notation Prof. Schwenkert
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
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
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
6
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Schlüsselbegriff 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
7
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
1:1 Beziehungen 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
8
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
1:n Beziehungen
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
9
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
n:m Beziehungen
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
10
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Dynamische Integritätsbedingungen 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
11
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Trigger in Oracle Syntax
create or replace trigger keineDegradierungbefore update on Professorenfor each rowwhen (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
12
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Trigger in Oracle Syntax (2)
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 }
Vereinfacht – nur DML Events, man kann auch DDL abfangenVereinfacht – nur DML Events, man kann auch DDL abfangen
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
13
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Trigger in DB2 Syntax
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
14
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Prozedurale Erweiterung von SQL – Oracle PL/SQL Trigger waren bzw. sind bereits prozedural! Prozedurale Erweiterung ist notwendig
Aus theoretischer Sicht – um Touring-Vollstä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
15
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Oracle PL/SQL Prozedurale Erweiterung von SQL Beispiel: Funktion Summe - rekursiv
CREATE FUNCTION Summe1 (n INTEGER)RETURN INTEGERISBEGIN
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
16
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Oracle PL/SQL (2) nicht rekursiv
FUNCTION Summe2(n INTEGER)RETURN INTEGERISresult 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;
nicht rekursiv, schlau
FUNCTION Summe3(n INTEGER)RETURN INTEGERISBEGIN RETURN (n*(n+1))/2;END;
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
17
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
18
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Oracle PL/SQL Beispiel
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 Saison-Intervale 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
19
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Deklarativ vs. Prozedural (2)
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
20
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Deklarativ vs. Prozedural (3)
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
21
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Cursor Beispiel (3)
...CURSOR c_club_trainer_saisonIS SELECT saison, trainer, verein FROM club_trainer_saisonORDER BY saison;...BEGINFOR curvar IN c_club_trainer_saisonLOOP ... 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
22
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
23
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Einbettung in Wirtssprachen „Embedded SQL“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
24
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Einbettung in Wirtssprachen „Embedded SQL“ (2)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
25
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Einbettung in Wirtssprachen „Embedded SQL“ (3)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
26
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Datenbankanbindungen
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
27
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
28
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
29
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
30
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
© Bojan Milijaš, 28.11.2007 Vorlesung #8 - Wiederholung Referentielle Integrität / Embedded SQL
31
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
WS 2007/08Datenbanksysteme
Mi 17:00 – 18:30R 1.007
Vorlesung #8
Ende