11. Integrität und Trigger Grundlagen und Begriffe Transaktion

Werbung
11. Integrität und Trigger
■
Grundlagen und Begriffe
■
Transaktionen
■
Integritätsbedingungen
■
Integritätsregeln in SQL
■
Trigger
VL Datenbanken I – 11–1
Grundlagen und Begriffe
Integritätsbedingung (IB) = Bedingung für die „Zulässigkeit“
(„Korrektheit“) betreffend
■
(einzelne) Datenbankzustände σ ,
■
Zustandsübergänge hσalt , σneu i oder auch
■
langfristige Datenbankentwicklungen
Bezeichnungen:
Bedingungsklasse
zeitlicher Kontext
statisch
Datenbankzustand
dynamisch transitional Zustandsübergang
temporal
Zustandsfolge
VL Datenbanken I – 11–2
Transaktion
Eine Transaktion ist eine Folge von Operationen (Aktionen), die die Datenbank von einem konsistenten
Zustand in einen konsistenten, eventuell veränderten, Zustand überführt, wobei das ACID-Prinzip eingehalten werden muß.
Aspekte:
■
Semantische Integrität: Korrekter (konsistenter)
DB-Zustand nach Ende der Transaktion
■
Ablaufintegrität: Fehler durch „gleichzeitigen“ Zugriff
mehrerer Benutzer auf dieselben Daten vermeiden
VL Datenbanken I – 11–3
ACID-Eigenschaften
■
Atomicity (Atomarität):
Transaktion wird entweder ganz oder gar nicht
ausgeführt
■
Consistency (Konsistenz oder auch Integritätserhaltung):
Datenbank ist vor Beginn und nach Beendigung einer
Transaktion jeweils in einem konsistenten Zustand
■
Isolation (Isolation):
Nutzer, der mit einer Datenbank arbeitet, sollte den
Eindruck haben, daß er mit dieser Datenbank alleine
arbeitet
■
Durability (Dauerhaftigkeit / Persistenz):
nach erfolgreichem Abschluß einer Transaktion muß das
Ergebnis dieser Transaktion „dauerhaft“ in der
Datenbank gespeichert werden
VL Datenbanken I – 11–4
Kommandos einer Transaktionssprache
■
Beginn einer Transaktion:
Begin-of-Transaction-Kommando BOT (in SQL implizit!)
■
commit: die Transaktion soll erfolgreich beendet werden
■
abort: die Transaktion soll abgebrochen werden
VL Datenbanken I – 11–5
Transaktion: Integritätsverletzung
■
Beispiel:
Übertragung eines Betrages B von einem
Haushaltsposten K1 auf einen anderen Posten K2
◆ Bedingung: Summe der Kontostände der
Haushaltsposten bleibt konstant
◆
■
vereinfachte Notation
Transfer = < K1:=K1-B; K2:=K2+B >;
■
Realisierung in SQL: als Sequenz zweier elementarer
Änderungen ; Bedingung ist zwischen den einzelnen
Änderungsschritten nicht unbedingt erfüllt!
VL Datenbanken I – 11–6
Architekturen zur Integritätssicherung
Anwendung 1
Anwendung n
DBMS
Datenbank
Vereinfachte Datenbank-Anwendungsarchitektur
VL Datenbanken I – 11–7
Integritätssicherung durch Anwendung
Anwendung 1
Routinen
Anwendung n
Routinen
DBMS
Datenbank
VL Datenbanken I – 11–8
Integritätsmonitor
Anwendung 1
Anwendung n
DBMS
Monitor
Datenbank
VL Datenbanken I – 11–9
Einkapselung
Anwendung 1
Anwendung n
Kapselung
DBMS
Datenbank
VL Datenbanken I – 11–10
Inhärente Integritätsbedingungen im RM
1. Typintegrität:
■ SQL erlaubt Angabe von Wertebereichen zu
Attributen
■ Erlauben oder Verbieten von Nullwerten
2. Schlüsselintegrität:
■ Angabe eines Schlüssels für eine Relation
3. Referentielle Integrität:
■ die Angabe von Fremdschlüsseln
VL Datenbanken I – 11–11
Integritätsbedingungen in SQL-DDL
■
not null: Nullwerte verboten
■
default: Angabe von Default-Werten
■
check ( search-condition ): Attributspezifische
Bedingung
(in der Regel Ein-Tupel-Integritätsbedingung)
■
primary key: Angabe eines Primärschlüssel
■
foreign key ( Attribut(e))
references Tabelle( Attribut(e) ):
Angabe der referentiellen Integrität
VL Datenbanken I – 11–12
Erhaltung der referentiellen Integrität
■
Überprüfung der Fremdschlüsselbedingungen nach
Datenbankänderungen
■
für πA (r1 ) ⊆ πK (r2 ),
z.B. πVerlagsname (Bücher) ⊆ πVerlagsname (Verlage)
◆ Tupel t wird eingefügt in r1 ⇒ überprüfen, ob t0 ∈ r2
existiert mit: t0 (K) = t(A), d.h. t(A) ∈ πK (r2 )
falls nicht ⇒ abweisen
◆ Tupel t0 wird aus r2 gelöscht ⇒ überprüfen, ob
σA=t0 (K) (r1 ) = {}, d.h. kein Tupel aus r1 refernziert t0
falls nicht leer ⇒ abweisen oder Tupel aus r1 , die t0
referenzieren, löschen (bei kaskadierendem Löschen)
VL Datenbanken I – 11–13
Überprüfungsmodi von Bedingungen
■
on update | delete
Angabe eines Auslöseereignisses, das die Überprüfung
der Bedingung anstößt
■
cascade | set null | set default | no action
Kaskadierung: Behandlung einiger
Integritätsverletzungen pflanzt sich über mehrere Stufen
fort, z.B. Löschen als Reaktion auf Verletzung der
referentieller Integrität
■
deferred | immediate legt Überprüfungszeitpunkt für
eine Bedingung fest
◆ deferred: Zurückstellen an das Ende der Transaktion
◆ immediate: sofortige Prüfung bei jeder relevanten
Datenbankänderung
VL Datenbanken I – 11–14
Überprüfungsmodi: Beispiel
Kaskadierendes Löschen
create table Bücher (
ISBN char(10) not null,
Titel varchar(200),
Verlagsname varchar(30),
primary key (ISBN),
foreign key (Verlagsname)
references Verlage (Verlagsname)
on delete cascade
)
VL Datenbanken I – 11–15
Die assertion-Klausel
■
Assertion: Prädikat, das eine Bedingung ausdrückt, die
von der Datenbank immer erfüllt sein muß
■
Syntax (SQL:1999)
create assertion name check ( prädikat )
■
Beispiele:
create assertion Preise check
( ( select sum (Preis)
from Buch) < 10000 )
create assertion Preise2 check
( not exists (
select Preis from Buch ) > 200 )
VL Datenbanken I – 11–16
Beispiele für Integritätsbedingungen
1. Das Konto von Weiß darf nicht überzogen werden.
2. Kein Kundenkonto darf unter -100 absinken.
3. Kunden sind durch ihre Namen identifiziert, d.h., kein
Kundenname darf mehrfach vorkommen.
4. Der Durchschnittspreis für Karotten muß unter dem für
Spargel liegen.
5. Nur solche Waren dürfen bestellt werden, für die es
mindestens einen Lieferanten gibt.
VL Datenbanken I – 11–17
Beispiele für Integritätsbedingungen (II)
6. Der Brotpreis darf nicht erhöht werden.
7. Kunden dürfen nur gelöscht werden, wenn sie keine
Waren mehr bestellt haben.
8. Der Preis eines Grundnahrungsmittels darf innerhalb
von drei Jahren höchstens um 15% steigen.
9. Kunden müssen gelöscht werden, wenn sie keine
Waren mehr bestellt haben.
VL Datenbanken I – 11–18
Mögliche Klassifikationen
Kriterium
Klassen
Granularität
Attribut
Tupel
Relation
Datenbank
Ausdrucksfähigkeit elementare Prädikate
Relationale Algebra
SQL
SQL + transitive Hülle
berechnungsvollständig
VL Datenbanken I – 11–19
Mögliche Klassifikationen (II)
Kriterium
Klassen
zeitlicher Kontext
statisch
transitional
temporal
Überprüfungszeitpunkt Einzeländerung
Operationsende
Transaktionsende
Reaktion
Zurückweisung (reject)
Korrektur (repair)
VL Datenbanken I – 11–20
Integritätsregeln
IR = hB, O, A, Ri
B
O
A
R
Integritätsbedingung
Menge von Datenbankobjekten, auf
die sich B bezieht
Auslöser, wann B zu überprüfen ist
Reaktionen, falls B verletzt ist
VL Datenbanken I – 11–21
Integritätsregeln (II)
■
im usprünglichen SQL-Sprachvorschlag
assert <Regelname>
[immediate | deferred] [ on <Op> ]
[for <Rel>] :
<Bedingung wie in where-Klausel>
[else ( <Folge von SQL-Anweisungen> )]
wobei
(A)
(O )
(O, B )
(R )
◆ <Op> ::= { insertion | deletion } of <Rel> |
update of <Rel> [ (<Attribut>)]
◆ <Rel> ::= <Relationsname> [ <Variablenname> ]
VL Datenbanken I – 11–22
Integritätsregeln in SQL: Beispiel I
Kunden sind durch ihre Namen eindeutig identifiziert:
assert IR1
for KUNDE K1, KUNDE K2:
not( K1.KName = K2.KName ) or
(K1.KAdr = K2.KAdr and K1.Kto = K2.Kto)
VL Datenbanken I – 11–23
Integritätsregeln in SQL: Beispiel II
Kein Kundenkonto darf unter -100 absinken:
assert IR2 for KUNDE : Kto >= -100
bzw. inklusive Angabe von Operationen:
assert IR2’
on insertion of KUNDE, update of KUNDE
for KUNDE : Kto >= -100
VL Datenbanken I – 11–24
Integritätsregeln in SQL: Beispiel III
Das Konto von Weiß darf nicht überzogen werden:
assert IR3 for KUNDE :
not KName = ’Weiß’ or Kto >= 0
VL Datenbanken I – 11–25
Integritätsregeln in SQL: Beispiel IV
Der Durchschnittspreis für Karotten muß unter dem für
Spargel liegen:
assert IR4 deferred
( select avg (Preis) from LIEFERANT
where Ware = ’Karotten’)
<= (select avg (Preis) from LIEFERANT
where Ware = ’Spargel’)
VL Datenbanken I – 11–26
Integritätsregeln in SQL: Beispiel V
Nur solche Waren dürfen bestellt werden, für die es
mindestens einen Lieferanten gibt:
assert IR5 for AUFTRAG A:
exists (select * from LIEFERANT
where Ware = A.Ware)
VL Datenbanken I – 11–27
Integritätsregeln in SQL: Beispiel VI
Der Brotpreis darf nicht erhöht werden:
assert IR6 (on update of LIEFERANT (Preis))
for LIEFERANT:
not Ware = ’Brot’ or
new Preis <= old Preis
VL Datenbanken I – 11–28
Integritätsregeln in SQL: Beispiel VII
Kunden dürfen nur gelöscht werden, wenn sie keine Waren
mehr bestellt haben:
assert IR7 deferred on deletion of KUNDE
for KUNDE K:
not exists (select * from AUFTRAG
where KName = old K.KName)
VL Datenbanken I – 11–29
Integritätsregeln in SQL: Beispiel VIII
Der Preis eines Grundnahrungsmittels darf innerhalb von
drei Jahren höchstens um 15% steigen.
⇒ kann in diesem Sprachvorschlag nicht ausgedrückt
werden!
VL Datenbanken I – 11–30
Integritätsregeln in SQL: Beispiel IX
Kunden müssen gelöscht werden, wenn sie keine Waren
mehr bestellt haben:
assert IR9 on deletion of AUFTRAG
for AUFTRAG A1:
exists (select * from AUFTRAG A2
where A2.KName = old A1.KName)
else (
delete KUNDE K
where K.KName = old A1.KName );
VL Datenbanken I – 11–31
Trigger
■
Trigger: Anweisung/Prozedur, die bei Eintreten eines
bestimmten Ereignisses automatisch vom DBMS
ausgeführt wird
■
Anwendung:
◆ Erzwingen von Integritätsbedingungen
(„Implementierung“ von Integritätsregeln)
◆ Auditing von DB-Aktionen
◆
Propagierung von DB-Änderungen
VL Datenbanken I – 11–32
Trigger (II)
create trigger ...
after <Operation>
<Anweisungen>
entspricht einer speziellen Integritätsregel:
assert ...on <Operation> :
false else ( <Anweisungen> )
VL Datenbanken I – 11–33
Trigger: Entwurf und Implementierung
■
Spezifikation von
◆ Ereignis und Bedingung für Aktivierung des Triggers
◆ Aktion(en) zur Ausführung
■
Syntax in SQL:1999 festgelegt
■
verfügbar in den meisten kommerziellen Systemen (aber
mit anderer Syntax)
VL Datenbanken I – 11–34
SQL:1999-Trigger
■
Syntax:
create trigger <Name>
after | before <Ereignis>
on <Relation>
[ when <Bedingung> ]
begin atomic < SQL-Anweisungen > end
■
Ereignis:
◆ insert
◆ update [ of <Liste von Attributen> ]
◆ delete
VL Datenbanken I – 11–35
Weitere Angaben bei Triggern
■
for each row bzw. for each statement: Aktivierung des
Triggers für jede Einzeländerungen einer
mengenwertigen Änderung oder nur einmal für die
gesamte Änderung
■
before bzw. after: Aktivierung vor oder nach der
Änderung
■
referencing new as bzw. referencing old as: Binden
einer Tupelvariable an die neu eingefügten bzw. gerade
gelöschten („alten’“) Tupel einer Relation
; Tupel der Differenzrelationen
VL Datenbanken I – 11–36
Beispiel für Trigger (I)
Kein Kundenkonto darf unter -100 absinken:
create trigger bad_account
after update of Kto on KUNDE
referencing new as INSERTED
when (exists
(select * from INSERTED where Kto < -100)
)
begin atomic
rollback;
end
; ähnlicher Trigger für insert
VL Datenbanken I – 11–37
Beispiel für Trigger (II)
Nur solche Waren dürfen bestellt werden, für die es
mindestens einen Lieferanten gibt:
create trigger bad_order
after insert on AUFTRAG
referencing new as INSERTED
when (exists (
select * from INSERTED I
where not exists (
select * from LIEFERANT
where Ware = I.Ware))
begin atomic
rollback;
end
VL Datenbanken I – 11–38
Beispiel für Trigger (III)
Kunden müssen gelöscht werden, wenn sie keine Waren
mehr bestellt haben:
create trigger bad_customer
delete on AUFTRAG
referencing old as O
for each row
when (not exists
(select * from AUFTRAG A
where A.KName = O.KName))
begin atomic
delete from KUNDE where KName = O.KName;
end
VL Datenbanken I – 11–39
Methoden der Integritätssicherung
■
■
Integritätssicherung durch Änderungstransformationen
◆
transformiert Änderungsanweisungen in einer
Hochsprache wie SQL so, daß das Ergebnis der
Transformation integritätsrespektierend ist
◆
Integritätsbedingungen werden in Änderungen
„hineinkompiliert“
Generierung von Triggern bzw. ECA-Regeln aus
deskriptiven Integritätsbedingungen
VL Datenbanken I – 11–40
Integritätssicherung durch Trigger
1. Bestimme Objekt oi , für das die Bedingung φ überwacht
werden soll
■ i.d.R. mehrere oi betrachten, wenn Bedingung
relationsübergreifend ist
■ Kandidaten für oi sind Tupel der Relationsnamen, die
in φ auftauchen
2. Bestimme die elementaren Datenbankänderungen u ij
auf Objekten oi , die φ verletzen können
■ Regeln: z.B. Existenzforderungen beim Löschen und
Ändern prüfen, jedoch nicht beim Einfügen etc.
VL Datenbanken I – 11–41
Integritätssicherung durch Trigger (II)
4. Bestimme je nach Anwendung die Reaktion ri auf
Integritätsverletzung
■ Rücksetzen der Transaktion (rollback)
■ korrigierende Datenbankänderungen
5. Formuliere folgende Trigger:
create trigger t-phi-ij after uij on oi
when ¬φ
begin ri end
6. Wenn möglich, vereinfache entstandenen Trigger
VL Datenbanken I – 11–42
Herunterladen