Effiziente Integritätsprüfung für SQL-Constraints

30
Effiziente Integritätsprüfung für SQL-Constraints Seminar „Intelligente Datenbanken“ Henning Lehmacher 12. Juli 2005

description

Seminar „Intelligente Datenbanken“. Effiziente Integritätsprüfung für SQL-Constraints. Henning Lehmacher. 12. Juli 2005. Übersicht. Teil 1: Einführung Überprüfung von Constraints Simulation durch Trigger Constraints vs. Trigger Teil 2: Soundcheck-Verfahren - PowerPoint PPT Presentation

Transcript of Effiziente Integritätsprüfung für SQL-Constraints

Page 1: Effiziente Integritätsprüfung für SQL-Constraints

Effiziente Integritätsprüfungfür SQL-Constraints

Seminar „Intelligente Datenbanken“

Henning Lehmacher 12. Juli 2005

Page 2: Effiziente Integritätsprüfung für SQL-Constraints

2

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

ÜbersichtÜbersichtÜbersichtÜbersicht

Teil 1: Einführung

Überprüfung von Constraints

Simulation durch Trigger

Constraints vs. Trigger

Teil 2: Soundcheck-Verfahren

Umwandlung: Constraints effiziente Trigger

Page 3: Effiziente Integritätsprüfung für SQL-Constraints

3

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

QuellenQuellenQuellenQuellen

Hendrik Decker: Soundcheck for SQLI.V. Ramakrishnan (Ed.): PADL2001, LNCS 1990. Springer-Verlag, 2001

Hendrik Decker: Integrity Enforcement on Deductive DatabasesLarry Kerschberg (Ed.): Expert Database Systems. The Benjamin/Cummings Publishing Company, 1987

Andreas Behrend, Rainer Manthey, Birgit Pieper: An Amateur‘s Introduction to Integrity Constraints and Integrity Checking in SQLAndreas Heuer u.a. (Eds.): Datenbanksysteme in Büro, Technik und Wissenschaft (BTW), 9. GI-Fachtagung, Oldenburg, 7.-9. März 2001, Proceedings. Informatik Aktuell Springer 2001

Page 4: Effiziente Integritätsprüfung für SQL-Constraints

4

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Teil ITeil I: Einführungsbeispiel: EinführungsbeispielTeil ITeil I: Einführungsbeispiel: Einführungsbeispiel

Integritätsbedingung:

Ein Kennzeichen ist nichtsowohl einem PKW als auch einem LKW zugeordnet

Kennzeichen Fabrikat

BN-AB-1234 VW

... ...

Kennzeichen Achsen

SU-CD-5678 4

... ...

pkw lkw

Page 5: Effiziente Integritätsprüfung für SQL-Constraints

5

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

AssertionsAssertionsAssertionsAssertions

AssertionsAssertions

Table ConstraintsTable Constraints

Column ConstraintsColumn Constraints

Domain ConstraintsDomain Constraints

Erinnerung:

Page 6: Effiziente Integritätsprüfung für SQL-Constraints

6

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Umwandlung in AssertionUmwandlung in AssertionUmwandlung in AssertionUmwandlung in Assertion

CREATE ASSERTION fahrz1CHECK (NOT EXISTS (SELECT * FROM pkw, lkw

WHERE pkw.kennzeichen = lkw.kennzeichen));

CREATE ASSERTION fahrz1CHECK (NOT EXISTS (SELECT * FROM pkw, lkw

WHERE pkw.kennzeichen = lkw.kennzeichen));

Problem:

Kein gängiges DBMS unterstützt Assertions / CHECK-Constraints über mehrere Tabellen.

Wo liegen die Schwierigkeiten?

Ein Kennzeichen ist nichtsowohl einem PKW als auch einem LKW zugeordnet

Page 7: Effiziente Integritätsprüfung für SQL-Constraints

7

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Überprüfung von ConstraintsÜberprüfung von ConstraintsÜberprüfung von ConstraintsÜberprüfung von Constraints

„Naive“ Handhabung durch ein DBMS

CREATE ASSERTION fahrz1CHECK (NOT EXISTS (SELECT * FROM pkw, lkw

WHERE pkw.kennzeichen = lkw.kennzeichen));

CREATE ASSERTION fahrz1CHECK (NOT EXISTS (SELECT * FROM pkw, lkw

WHERE pkw.kennzeichen = lkw.kennzeichen));

O( |pkw| * |lkw| ) Vergleiche

Überprüfe bei jeder Änderung von pkw und lkw die CHECK-Bedingung (führe die SELECT-Anfrage aus)

+

-

-

CHECK

CHECK

pkw

lkw

Page 8: Effiziente Integritätsprüfung für SQL-Constraints

8

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS inserted

WHEN (EXISTS (SELECT * FROM lkwWHERE inserted.kennzeichen = lkw.kennzeichen))

BEGIN ROLLBACK END;

CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw

WHERE inserted.kennzeichen = pkw.kennzeichen))BEGIN ROLLBACK END;

CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS inserted

WHEN (EXISTS (SELECT * FROM lkwWHERE inserted.kennzeichen = lkw.kennzeichen))

BEGIN ROLLBACK END;

CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw

WHERE inserted.kennzeichen = pkw.kennzeichen))BEGIN ROLLBACK END;

Simulation durch TriggerSimulation durch TriggerSimulation durch TriggerSimulation durch Trigger

Zusätzlich noch zwei Update-Trigger(von nun an nur noch Einfügen/Löschen berücksichtigt)!

DELETE-Trigger sind (in diesem Bsp.) nicht erforderlich!

Ein Kennzeichen ist nicht sowohl einem PKW als auch einem LKW zugeordnet

Page 9: Effiziente Integritätsprüfung für SQL-Constraints

9

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS inserted

WHEN (EXISTS (SELECT * FROM lkwWHERE inserted.kennzeichen = lkw.kennzeichen))

BEGIN ROLLBACK END;

CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw

WHERE inserted.kennzeichen = pkw.kennzeichen))BEGIN ROLLBACK END;

CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS inserted

WHEN (EXISTS (SELECT * FROM lkwWHERE inserted.kennzeichen = lkw.kennzeichen))

BEGIN ROLLBACK END;

CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw

WHERE inserted.kennzeichen = pkw.kennzeichen))BEGIN ROLLBACK END;

PerformancePerformancePerformancePerformance

O( |inserted| * |pkw| ) bzw.O( |inserted| * |lkw| ) Vergleiche bei Einfügungen

Bei jeder Änderung O( |pkw| * |lkw| ) Vergleiche

Im Gegensatz zu:

Vergleiche beiEinfügeoperationenauf pkw oder lkw ...

... die neu eingefügten Zeilen mit der jeweils anderen Tabelle

Page 10: Effiziente Integritätsprüfung für SQL-Constraints

10

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Triggereher imperativ

Optimierungsarbeit liegt beim Ersteller des SQL-Codes

wenig Optimierungs-möglichkeiten für DBMS

unübersichtlicher

Constraints vs. TriggerConstraints vs. TriggerConstraints vs. TriggerConstraints vs. Trigger

CHECK-Constraintsrein deklarativ

Optimierungsarbeit liegt beim DBMS

hoher Optimierungsbedarf intuitiver

Optimierender Compiler

Page 11: Effiziente Integritätsprüfung für SQL-Constraints

11

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Soundcheck-VerfahrenSoundcheck-Verfahren

Teil IITeil II: Das Soundcheck-Verfahren: Das Soundcheck-VerfahrenTeil IITeil II: Das Soundcheck-Verfahren: Das Soundcheck-Verfahren

CHECK-ConstraintCHECK-Constraint

Effizienter TriggerEffizienter Trigger

I. Differenz zwischen altem und neuem Zustand bestimmen

II. „Idle Updates“ überspringen

III. Relevante Integr.-Bedingungen bestimmen

IV. Relevante Integr.-Bedingungen spezialisieren

V. Spezialisierte Integr.-Bedingungen optimieren

VI. Optimierten Trigger überprüfenVI. Optimierten Trigger überprüfen

Page 12: Effiziente Integritätsprüfung für SQL-Constraints

12

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 1Phase 1Phase 1Phase 1

Phase 1: Differenz zwischen altem und neuem Zustand bestimmen

Kennzeichen Fabrikat

BN-AB-1234 VW

K-VB-1000 Ford

BM-W-999 BMW

SU-RF-4545 Fiat

inserted_pkw

BM-W-999 BMW

SU-RF-4545 Fiat+

Kennzeichen Fabrikat

BN-AB-1234 VW

K-VB-1000 Ford

BM-W-999 BMW

SU-RF-4545 Fiat

K-VB-1000 Ford

BM-W-999 BMW

deleted_pkw

--

Differenztabelle

Page 13: Effiziente Integritätsprüfung für SQL-Constraints

13

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 1Phase 1Phase 1Phase 1

Bei Constraints über Sichten:Effektive Änderungen an den Sichten bestimmen

Wichtig für deduktive Datenbanken, würde hier jedoch zu weit führen

Annahme: Keine Constraints über Sichten!

Constr.

!!

Page 14: Effiziente Integritätsprüfung für SQL-Constraints

14

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 2Phase 2Phase 2Phase 2

Phase 2: „Idle Updates“ überspringen

UPDATE pkw SET fabrikat = `Opel`WHERE kennzeichen = `BN-AA-1234`;

UPDATE pkw SET fabrikat = `Opel`WHERE kennzeichen = `BN-AA-1234`;

kann nicht verletzt werden,da kennzeichen nicht verändert wird

Allgemein:

Überprüfung, ob ein Update eine „tatsächliche“ Änderung bewirkt,kann fast genauso aufwendig sein wie Überprüfung des Constraints selbst.

Updates / Doppeleinfügungen werden nicht gesondert betrachtet(„Update := Löschen + Einfügen“)

Ein Kennzeichen ist nicht sowohl einem PKW als auch einem LKW zugeordnet

Page 15: Effiziente Integritätsprüfung für SQL-Constraints

15

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 3: Relevante Integritätsbedingungen bestimmen

Phase 3Phase 3Phase 3Phase 3

Constraints

Differenztabellen

inserted deleted

?Welche Constraints können verletzt werden?

?

Page 16: Effiziente Integritätsprüfung für SQL-Constraints

16

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 3Phase 3Phase 3Phase 3

Kennzeichen Fabrikat

BN-D-007 VW

... ...

BM-W-999 BMW

K-UH-123 BMW

Kennzeichen Achsen

K-VB-112 4

... ...

... CHECK (NOTNOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen));

... CHECK (NOTNOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen));

----

Kennzeichen Fabrikat

BN-D-007 VW

... ...

Kennzeichen Achsen

K-VB-112 4

... ...

auf jeden Fall konsistenter DB-Zustand!

Kann nichtverletzt werden !

KonsistenterDB-Zustand

Page 17: Effiziente Integritätsprüfung für SQL-Constraints

17

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 3Phase 3Phase 3Phase 3

Kennzeichen Fabrikat

BN-D-007 VW

... ...

BM-W-999 BMW

K-UH-123 BMW

Kennzeichen Achsen

K-VB-112 4

... ...

... CHECK (NOTNOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen =

lkw.kennzeichen));

... CHECK (NOTNOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen =

lkw.kennzeichen));

++

KonsistenterDB-Zustand

Kennzeichen Fabrikat

BN-D-007 VW

... ...

Kennzeichen Achsen

K-VB-112 4

... ...

könnte Konsistenz verletzen

Kann u.U.verletzt werden !

BM-W-999 BMW

K-UH-123 BMW

Page 18: Effiziente Integritätsprüfung für SQL-Constraints

18

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 3Phase 3Phase 3Phase 3

Formal:

NOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen)

atom. Prädikate negativer Polarität

Negation-innermost Form

Atomare Prädikate sind von„negativer/positiver Polarität“wenn sie in der Negation-innermost Form negiert bzw. nicht negiert auftreten

Prädikatenlogik (Bereichskalkül)

¬ X [ pkw(X,_) lkw(X,_) ]∃ ∧

Verschiebe Negationenmöglichst weit nach innen!

∀ X [ ¬ pkw(X,_) ¬ lkw(X,_) ]∨

Page 19: Effiziente Integritätsprüfung für SQL-Constraints

19

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 3Phase 3Phase 3Phase 3

Eine Änderung ist dann relevant, wenn...

... sie auf ein atomares Prädikat „matcht“ und ... ... entgegengesetzte Polarität besitzt

+ t(k,a) -- v(n,p)

Muss für alle atom. Prädikate untersucht werden!(Abbruch falls Matching gefunden wurde)

X/k X/pSubstitution

+ t(k,a) -- v(n,p)

∀ X [ ¬ t(X,a) ∨ ¬ t(X,b) ] ∃ X [ ¬ u(X,m) ∨ v(n,X) ]

Page 20: Effiziente Integritätsprüfung für SQL-Constraints

20

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Bsp.:

∃ X‘ [ inserted_pkw(X‘,_) ¬ X [ ¬ pkw(X,_) ¬ lkw(X,_) ] ]∧ ∀ ∨ ∃ X‘ [ inserted_lkw(X‘,_) ¬ X [ ¬ pkw(X,_) ¬ lkw(X,_) ] ]∧ ∀ ∨

Phase 3Phase 3Phase 3Phase 3

Erstelle für jedes atom. Prädikat t(x1,...,xn, k1,...,km) der Constraint eine Formel…

IC])k,...,k,'x,...,'(x[deleted_t'x,...,'x

IC])k,...,k,'x,...,'t(x[inserted_'x,...,'x

m1n1n1

m1n1n1

falls t neg. Polarität hat

falls t pos. Polarität hat

var. const.

Integr.-Bedingung

oder

Wann ist die Integritätsbedingung verletzt?

Auswertung

Page 21: Effiziente Integritätsprüfung für SQL-Constraints

21

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 4Phase 4Phase 4Phase 4

Phase 4: Relevante Integr.-Bedingungen spezialisieren

... CHECK (NOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen))

... CHECK (NOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen))

... CHECK (NOT EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen))

... CHECK (NOT EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen))

Spezialisierung

Relevante Änderungvon pkw

BN-AA-1111 Volvo

... ...

inserted_pkw

+

Page 22: Effiziente Integritätsprüfung für SQL-Constraints

22

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 4Phase 4Phase 4Phase 4

Funktioniert das immer?

... CHECK (NOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen))

... CHECK (NOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen))

... CHECK (EXISTS (SELECT * FROM deleted_pkw, lkwWHERE deleted_pkw.kennzeichen = lkw.kennzeichen))

... CHECK (EXISTS (SELECT * FROM deleted_pkw, lkwWHERE deleted_pkw.kennzeichen = lkw.kennzeichen))

Spezialisierung ?

BN-AA-1111 Volvo

deleted_pkw

--

Kennzeichen Fabrikat

K-VB-110 VW

BN-AA-1111 Volvo

Kennzeichen Achsen

K-VB-110 4

BN-AA-1111 3

Bei Existenzaussagen: Betrachtung ganzer Tabelle unvermeidlich!

OK

Page 23: Effiziente Integritätsprüfung für SQL-Constraints

23

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 4Phase 4Phase 4Phase 4

Und hier?

... NOT EXISTS ( SELECT ... WHERE

EXISTS (SELECT ... WHERE

NOT EXISTS ... )

AND NOT EXISTS ( ... WHERE

EXISTS ... ) );

... NOT EXISTS ( SELECT ... WHERE

EXISTS (SELECT ... WHERE

NOT EXISTS ... )

AND NOT EXISTS ( ... WHERE

EXISTS ... ) );

Existenz- oder Universalaussage?

Page 24: Effiziente Integritätsprüfung für SQL-Constraints

24

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 4Phase 4Phase 4Phase 4

Formal:

Eine Variable ist -∃ dominiert wenn links von ihr ein auftaucht.∃

∀ X [ ∃ Y [¬p(X,Y) ∧ ∀ Z [ q(Y,Z) ] ] ]

∃-dominiertnicht-dominiert∃

Variablen, die in der Negation-innermost Form nicht -dominiert sind,∃können spezialisiert werden!

Page 25: Effiziente Integritätsprüfung für SQL-Constraints

25

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Bsp.:

Phase 3: ∃X‘[ inserted_pkw(X‘,_) ¬ ∧ ∀X [ ¬pkw(X,_) ¬lkw(∨ X,_) ] ]

Phase 4: ∃X [ inserted_pkw(X,_) ¬ ( ¬pkw(∧ X,_) ∨¬lkw(X,_) ) ]

Phase 4Phase 4Phase 4Phase 4

Wann ist die Integr.-Bedingung verletzt?

(Formel für atom. Prädikat mit neg. Polarität)

Phase 3:

∃x1‘,...,xn‘ [inserted_t(x1‘,...,xn‘,k1,...,km) ¬IC ]∧

nicht-dominiert∃

∃-dominiert

Spezialisierte IC ohne oder vor ∃ ∀

den x1,...,xs

Constraint

Spezialisierte Constraint

Phase 4:

∃x1,...,xs [ ∃xs+1‘,...,xn‘ [inserted_t(x1,...,xs,xs+1‘,...,xn‘,k1,...,km) ] ¬∧ ICS ]

Page 26: Effiziente Integritätsprüfung für SQL-Constraints

26

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 4Phase 4Phase 4Phase 4

∃X [ inserted_pkw(X,_) ( ∧ pkw(X,_) ∧ lkw(X,_) ) ]

... EXISTS (SELECT * FROM inserted_pkw, pkw, lkwWHERE inserted_pkw.kennzeichen = pkw.kennzeichenAND inserted_pkw.kennzeichen = lkw.kennzeichen)

... EXISTS (SELECT * FROM inserted_pkw, pkw, lkwWHERE inserted_pkw.kennzeichen = pkw.kennzeichenAND inserted_pkw.kennzeichen = lkw.kennzeichen)

Überprüfung in der Praxis:

Lies Belegungen für Xaus inserted_pkw …

… und prüfe, ob sie in pkw und lkw vorkommen

Page 27: Effiziente Integritätsprüfung für SQL-Constraints

27

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Phase 5Phase 5Phase 5Phase 5

∃X [ inserted_pkw(X,_) ∧ pkw(X,_) lkw(X,_) ]∧

... EXISTS (SELECT * FROM inserted_pkw, pkw, lkwWHERE inserted_pkw.kennzeichen = pkw.kennzeichenAND inserted_pkw.kennzeichen = lkw.kennzeichen)

... EXISTS (SELECT * FROM inserted_pkw, pkw, lkwWHERE inserted_pkw.kennzeichen = pkw.kennzeichenAND inserted_pkw.kennzeichen = lkw.kennzeichen)

Phase 5: Spezialisierte Integr.-Bedingungen optimieren

∃X [ inserted_pkw(X,_) lkw(X,_) ) ]∧

... EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen)

... EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen)

nach Einfügen:inserted_pkw pkw

Abfrage von pkw ist überflüssig

Page 28: Effiziente Integritätsprüfung für SQL-Constraints

28

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Umwandlung in TriggerUmwandlung in TriggerUmwandlung in TriggerUmwandlung in Trigger

Constraint ist verletzt wenn...:

∃X [ inserted_pkw(X,_) lkw(X,_) ]∧

∃X [ inserted_lkw(X,_) pkw(X,_) ]∧

EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen)

EXISTS (SELECT * FROM inserted_lkw, pkwWHERE inserted_lkw.kennzeichen = pkw.kennzeichen)

SQL

Page 29: Effiziente Integritätsprüfung für SQL-Constraints

29

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

Umwandlung in TriggerUmwandlung in TriggerUmwandlung in TriggerUmwandlung in Trigger

CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS inserted

WHEN (EXISTS (SELECT * FROM lkwWHERE inserted.kennzeichen = lkw.kennzeichen))

BEGIN ROLLBACK END;

CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw

WHERE inserted.kennzeichen = pkw.kennzeichen))BEGIN ROLLBACK END;

CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS inserted

WHEN (EXISTS (SELECT * FROM lkwWHERE inserted.kennzeichen = lkw.kennzeichen))

BEGIN ROLLBACK END;

CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw

WHERE inserted.kennzeichen = pkw.kennzeichen))BEGIN ROLLBACK END;

inserted_pkw

EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen)

EXISTS (SELECT * FROM inserted_lkw, pkwWHERE inserted_lkw.kennzeichen = pkw.kennzeichen)

Page 30: Effiziente Integritätsprüfung für SQL-Constraints

30

Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints

ZusammenfassungZusammenfassungZusammenfassungZusammenfassung

Hoher Optimierungsbedarf bei Überprüfung von

CHECK-Constraints

Constraints können durch Trigger simuliert werden

Soundcheck-Verfahren wandelt beliebige Constraints

in effiziente Trigger um

Optimierungsmöglichkeiten (z.B.):

Bestimmung der Relevanz von Änderungen

Spezialisierung von Anfragen in der Constraint