Vortrag

Werbung
Seminar Intelligente Datenbanken
Integritätsbedingungen in SQL
Syntax und Semantik
Bastian Kraemer
© Bastian Kraemer
Seminar IDB, 10.05.05
1
Quellen
“Semantic integrity support in SQL:1999 and commercial (object-)relational
database management systems”
von C. Türker und M. Gertz in VLDB J. 10(4): Seite: 241-269, 2001
“An Amateur’s Introduction to Integrity Constraints and Integrity Checking
in SQL”
Behrend A., Manthey R., Pieper B in BTW 2001: Seiten: 405-423 2001
Folien zur Vorlesung "Objektrelationale, erweiterbare Datenbanken„ von C. Türker,
ETH Zürich; WS 2002/2003; Kapitel 3: SQL:1999 – Der objektrelationale
Datenbankstandard
© Bastian Kraemer
Seminar IDB, 10.05.05
2
Überblick
1) Einführung
– Welche Unterschiede gibt es?
– Was muss beachtet werden?
2) Syntax
– Wie werden IB in SQL formuliert?
3) Semantik
– Welche Bedeutungen haben die verschiedenen Möglichkeiten?
– Wann sind IB erfüllt?
3) Ausblick
– Gibt es noch weitere Methoden, die SQL anbietet?
– Wie wurden die bisherigen Möglichkeiten umgesetzt?
4) Zusammenfassung
© Bastian Kraemer
Seminar IDB, 10.05.05
3
Einführung
• Integritätsbedingungen (IB) in SQL sind semantische IB:
– d.h. sie sind nur bezogen auf Eigenschaften der Miniwelt
– im Gegensatz zu Mechanismen zum Schutz der Datenkonsistenz
• Wohin „gehören“ IB?
– ins DBMS (+)
• nicht so fehleranfällig
• weniger Wartungsaufwand
– in Anwendungsprogramme (-)
• Anpassung muss mehrmals implementiert werden
• kurzfristiges globales Abschalten nicht möglich
© Bastian Kraemer
Seminar IDB, 10.05.05
4
Konsistenz
Wann werden IB verletzt?
– bei Veränderungen des Datenbankschemas
– bei Veränderungen der gespeicherten Daten
• Konsistenz auf der Transaktionsebene
– innerhalb einer Transaktion können inkonsistente Zustände
auftreten
– konsistenter Zustand muss aber am Ende wieder erreicht sein
• Konsistenz auf der Zustandsebene
– nach jeder Aktion muss die Datenbank in einem konsistenten
Zustand sein
© Bastian Kraemer
Seminar IDB, 10.05.05
5
Einteilung von IB
1. Einteilung basierend auf der Anzahl der beteiligten Zeilen
– zeileninterne Beschränkungen
z.B.: Gehalt + Spesen < 10000
– tabelleninterne Beschränkungen
z.B.: PRIMARY KEY
– tabellenübergreifende Beschränkungen
z.B.: FOREIGN KEY mit Referenz auf eine andere Tabelle
2. Einteilung nach Anzahl der zu betrachtenden Zustände
– statische IB
können durch genau einen Datenbankzustand verifiziert werden
– transitionelle IB
können nur mit zwei Datenbankzuständen überprüft werden
– dynamische oder temporale IB
mehr als zwei Datenbankzustände zur Verifizierung nötig
© Bastian Kraemer
Seminar IDB, 10.05.05
6
Syntax von IB in SQL:1999
Gemeinsamkeiten aller IB in SQL:
– eindeutiger Name
• explizit angegeben: CONSTRAINT <name>
• ohne Angabe wird vom System ein Name zugewiesen
– initialer Überprüfungsmodus
• DEFERRED: Überprüfung am Ende der Transaktion
• IMMEDIATE: Überprüfung unmittelbar nach jedem Zustandswechsel
– Verzögerungsmodus
• DEFERRABLE: späteres Umstellen auf DEFFERED ist möglich
• NOT DEFERRABLE: es bleibt immer bei IMMEDIATE
© Bastian Kraemer
Seminar IDB, 10.05.05
7
Überblick
• lokale IB:
Spaltenbeschränkungen
CREATE TABLE mitarbeiter (
id
INTEGER
PRIMARY KEY
name
VARCHAR(25) IS NOT NULL
gehalt INTEGER
CHECK ( > 0 AND < 10000)
...
Spaltendefinitionen
…
CHECK(gehalt + spesen < 25000)
...
);
Tabellenbeschränkungen
• globale IB:
– Assertions
– Wertebereichsbeschränkungen
© Bastian Kraemer
Seminar IDB, 10.05.05
8
Spaltenbeschränkungen
CREATE TABLE mitarbeiter (
Spaltenbeschränkungen
mnr
buero_nr
INTEGER
INTEGER
PRIMARY KEY,
UNIQUE,
name
VARCHAR(25)
NOT NULL,
vorgesetzter SMALLINT
abteilung
SMALLINT
Schlüsselbedingungen
Fremdschlüsselbedingungen
REFERENCES mnr,
REFERENCES abteilungen (id),
CHECK-Bedingungen
gehalt
DECIMAL(7,2)
NOT NULL
CHECK(gehalt > 2000),
CHECK( < 5000)
spesen
DECIMAL(7,2)
anstellung
DATE DEFAULT CURRENT_DATE,
);
implizite Spalte: spesen
© Bastian Kraemer
Seminar IDB, 10.05.05
9
Tabellenbeschränkungen
CREATE TABLE mitarbeiter (
...
UNIQUE (vorname, nachname),
CHECK (gehalt < 10000),
Tabellenbeschränkungen
mehrstellige Bedingungen
CONSTRAINT check_gesamtgehalt CHECK(gehalt + spesen < 25000)
CHECK (NOT EXISTS (SELECT * FROM projekte AS p
WHERE p.betreuer = name AND p.bonus > spesen))));
);
tabellenübergreifende Bedingungen
© Bastian Kraemer
Seminar IDB, 10.05.05
10
Referentielle Integrität
Fremdschlüsselbedingungen
Tabelle t1
S1
S2
A
1
C
4
H
6
NULL 9
S2 referenziert t2S2
S3
1
2
3
4
Tabelle t2
S1
t2S2
1
4
2
1
3
6
4
9
5
7
S3
C
A
H
NULL
J
Als Spaltenbeschränkung
Tabellenbeschränkungvon
in t1S2
(mehrstelliger
Schlüssel):
in t1:
FOREIGN
KEY (S1,
S2) REFERENCES
t2 (t2S2, S3)
S2
INTEGER
REFERENCES
t2 (t2S2)
Wann sollen zwei Zeilen übereinstimmen?
Was passiert bei Veränderungen in der referenzierten Tabelle?
© Bastian Kraemer
Seminar IDB, 10.05.05
11
Referentielle Integrität
Auf was wird verwiesen?
<ref-spec> ::=
REFERENCES <table-name>
( <column-list> )
[MATCH {SIMPLE | PARTIAL | FULL}]
[<ref-trig-action>]
<ref-trig-action> ::= ON UPDATE
[ON DELETE
| ON DELETE
[ON UPDATE
<ref-action>
<ref-action>]
<ref-action>
<ref-action>]
Wann wird reagiert?
<ref-action> ::=
© Bastian Kraemer
NO ACTION
| RESTRICT
| CASCADE
| SET NULL
| SET DEFAULT
Wie wird reagiert?
Seminar IDB, 10.05.05
12
Wertebereichsbeschränkung
CREATE DOMAIN hauptstaedte CHAR(30)
DEFAULT ’Berlin’
CHECK( VALUE IN (’Berlin’, ’Paris’, ’Rom’, ’London’)
);
CREATE TABLE land(
hauptstadt
hauptstaedte,
… );
CREATE TABLE land(
hauptstadt
DEFAULT ’Berlin’
CHECK( IN (’Berlin’, ’Paris’, ’Rom’,
’London’)
… );
© Bastian Kraemer
Seminar IDB, 10.05.05
13
Assertions
CREATE ASSERTION gesamt_jahresgehalt
CHECK(
(SELECT 12*SUM(gehalt + spesen) FROM mitarbeiter)
< 5000000
);
CREATE ASSERTION gehalt_untergrenze
CHECK (
NOT EXISTS (
SELECT *
FROM mitarbeiter
WHERE NOT (gehalt > 2000))
);
© Bastian Kraemer
Seminar IDB, 10.05.05
Allquantor
14
Semantik
Semantik von IB in SQL:1999
mögliche Vorgehensweisen:
direkt: pro Typ von IB Überprüfungsprinzip angeben
indirekt: durch Rückführung auf Assertions
Wertebereichsbeschränkungen
kein Existenzquantor, keine Variablen
Spaltenbeschränkungen
Kein Existenzquantor, keine Variablen
Tabellenbeschränkungen
CHECK
CHECK
Kein Existenzquantor, aber Variablen
Assertions
Existenzquantor und Variablen
© Bastian Kraemer
Seminar IDB, 10.05.05
15
Rückführung auf Assertions
CREATE TABLE t2 (…,
CONSTRAINT tc21 UNIQUE(a21,a22)
);
spezielle (Spalten-/)
Tabellenbeschränkungen
CREATE TABLE t2(…,
CONSTRAINT tc21‘ CHECK (NOT EXISTS
(SELECT * FROM t2 AS x WHERE
EXISTS (SELECT * FROM t2 AS y
WHERE x <> y
AND x.a21 = y.a21
AND x.a22 = y.a22)))
);
© Bastian Kraemer
Seminar IDB, 10.05.05
Tabellen-CHECKBedingungen
16
Rückführung auf Assertions
CREATE TABLE t3 (…,
CHECK ( a31 IN ( SELECT a43 FROM t4) )
);
Tabellenbeschränkungen
CREATE ASSERTION as1
CHECK (
NOT EXISTS (
SELECT a31
FROM t3 AS a31‘
WHERE a31‘ NOT IN
( SELECT a43 FROM t4 ) )
);
© Bastian Kraemer
Seminar IDB, 10.05.05
Assertions
17
Trigger
Ausblick auf Trigger
-
Seit SQL:1999 standardisierte Syntax
-
werden schon länger von kommerziellen DBMS unterstützt
- z.B. Sybase (seit 1987)
- dadurch keine einheitliche Syntax
-
bieten die Möglichkeit auf vordefinierte Ereignisse zu reagieren
(Damit lassen sich mit ihnen auch IB prüfen.)
-
aber: Probleme im Zusammenspiel zwischen Trigger und deklarativen
IB (Determinismus)
-
ermöglichen vor allem die Prüfung von dynamischen IB
© Bastian Kraemer
Seminar IDB, 10.05.05
18
Trigger
CREATE TRIGGER on_update_cascade_mitarbeiter
AFTER UPDATE OF id ON mitarbeiter
REFERENCING OLD AS alt NEW AS neu
Überprüfung
FOR EACH ROW
WHEN( EXISTS (SELECT * FROM abteilung WHERE leiter = alt.id))
BEGIN ATOMIC
UPDATE dept
SET leiter = neu.id
WHERE leiter = alt.id;
kompensierende Aktion
END;
© Bastian Kraemer
Seminar IDB, 10.05.05
19
Verzahnung von Triggern und deklarativen IB
SQL-Anweisung
↓
Bestimmen der Menge der betroffenen Objekte
↓
Ausführen der BEFORE-Trigger
↓
SQL-Anweisung ausführen (Änderungen werden wirksam)
↓
Überprüfung der deklarativen IB
↓
Ausführen der AFTER-Trigger
© Bastian Kraemer
Seminar IDB, 10.05.05
20
Überprüfung der deklarativen IB
…
↓
Überprüfe alle Fremdschlüssel mit der Einstellung RESTRICT!
↓
Überprüfe alle Fremdschlüssel mit den Einstellungen
CASCADE, SET NULL, SET DEFAULT!
↓
Überprüfe alle Fremdschlüssel mit der Einstellung NO ACTION
und alle anderen Integritätsbedingungen!
↓
…
© Bastian Kraemer
Seminar IDB, 10.05.05
21
Vergleich von IB in SQL und kommerziellen DBMS
SQL:
1999
Oracle
DB2
Informix
MS
SQL
Sybase
Ingres
Sybase
ANY
NOT NULL
√
√
√
√
√
√
√
√
DEFAULT
√
√
√
√
√
√
√
√
UNIQUE
√
√
√
√
√
√
√
√
PRIMARY KEY
√
√
√
√
√
√
√
√
SIMPLE
√
(√)
(√)
(√)
(√)
(√)
(√)
(√)
PARTIAL
√
-
-
-
-
-
-
-
FULL
√
-
-
-
-
-
-
-
NO ACTION
√
(√)
√
(√)
(√)
(√)
(√)
-
RESTRICT
√
-
√
-
-
-
-
√
CASCADE
√
√
√
√
-
-
-
√
SET NULL
√
√
√
-
-
-
-
√
SET DEFAULT
√
-
-
-
-
-
-
√
NO ACTION
√
(√)
√
(√)
(√)
(√)
(√)
-
RESTRICT
√
-
√
-
-
-
-
√
CASCADE
√
-
-
-
-
-
-
√
SET NULL
√
-
-
-
-
-
-
√
SET DEFAULT
√
-
-
-
-
-
-
√
FOREIGN KEY
MATCH
ON DELETE
ON UPDATE
© Bastian Kraemer
Seminar IDB, 10.05.05
22
Vergleich von IB in SQL und kommerziellen DBMS
DB2
Informix
MSSQL
Sybase
Ingres
Sybase
ANY
√
√
√
√
√
√
√
√
√
√
√
√
√
√
√
Tabellen
√
-
-
-
-
-
-
-
Datenbank
√
-
-
-
-
-
-
-
DOMAIN
√
-
-
-
-
-
-
√
ASSERTION
√
-
-
-
-
-
-
-
CHECK
√
(√)
SQL:
1999
Oracle
Spalten
√
Zeilen
= wie in SQL umgesetzt
= Konzept wie in SQL umgesetzt, aber mit anderer Syntax
Quelle: Semantic integrity support in SQL:1999 and commercial (object-)relational database management
systems. S. 12
© Bastian Kraemer
Seminar IDB, 10.05.05
23
Zusammenfassung
• Überblick über IB im Allgemeinen
• Syntax deklarativer IB in SQL
• Semantik deklarativer IB in SQL
– Zurückführung auf Tabellen- CHECK- Bedingungen und dann auf
Assertions
• Trigger zur Integritätserhaltung
• Realisierung in gängigen DBMS
© Bastian Kraemer
Seminar IDB, 10.05.05
24
Herunterladen