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