11. Integrität und Trigger

Werbung
11. Integrität und Trigger
Grundlagen und Begriffe
■
Grundlagen und Begriffe
Integritätsbedingung (IB) = Bedingung für die „Zulässigkeit“
(„Korrektheit“) betreffend
■
Integritätsbedingungen
■
Integritätsregeln in SQL
■
(einzelne) Datenbankzustände σ ,
■
Trigger
■
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–1
Architekturen zur Integritätssicherung
Anwendung 1
VL Datenbanken I – 11–2
Integritätssicherung durch Anwendung
Anwendung 1
Routinen
Anwendung n
Anwendung n
Routinen
DBMS
DBMS
Datenbank
Datenbank
Vereinfachte Datenbank-Anwendungsarchitektur
VL Datenbanken I – 11–3
VL Datenbanken I – 11–4
Integritätsmonitor
Einkapselung
Anwendung 1
Anwendung 1
Anwendung n
Anwendung n
Kapselung
DBMS
Monitor
DBMS
Datenbank
Datenbank
VL Datenbanken I – 11–5
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–7
VL Datenbanken I – 11–6
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–8
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 referenziert t0
falls nicht leer ⇒ abweisen oder Tupel aus r1 , die t0
referenzieren, löschen (bei kaskadierendem Löschen)
Ü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–9
VL Datenbanken I – 11–10
Die assertion-Klausel
Ü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–11
■
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–12
Beispiele für Integritätsbedingungen
Beispiele für Integritätsbedingungen (II)
1. Das Konto von Weiß darf nicht überzogen werden.
6. Der Brotpreis darf nicht erhöht werden.
2. Kein Kundenkonto darf unter -100 absinken.
7. Kunden dürfen nur gelöscht werden, wenn sie keine
Waren mehr bestellt haben.
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.
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–13
Mögliche Klassifikationen
Kriterium
VL Datenbanken I – 11–14
Mögliche Klassifikationen (II)
Klassen
Kriterium
Granularität
Attribut
Tupel
Relation
Datenbank
Ausdrucksfähigkeit elementare Prädikate
Relationale Algebra
SQL
SQL + transitive Hülle
berechnungsvollständig
Klassen
zeitlicher Kontext
statisch
transitional
temporal
Überprüfungszeitpunkt Einzeländerung
Operationsende
Transaktionsende
Reaktion
Zurückweisung (reject)
Korrektur (repair)
VL Datenbanken I – 11–15
VL Datenbanken I – 11–16
Integritätsregeln
Integritätsregeln (II)
■
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
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–17
Integritätsregeln in SQL: Beispiel I
VL Datenbanken I – 11–18
Integritätsregeln in SQL: Beispiel II
Kunden sind durch ihre Namen eindeutig identifiziert:
Kein Kundenkonto darf unter -100 absinken:
assert IR1
for KUNDE K1, KUNDE K2:
not( K1.KName = K2.KName ) or
(K1.KAdr = K2.KAdr and K1.Kto = K2.Kto)
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–19
VL Datenbanken I – 11–20
Integritätsregeln in SQL: Beispiel III
Integritätsregeln in SQL: Beispiel IV
Das Konto von Weiß darf nicht überzogen werden:
Der Durchschnittspreis für Karotten muß unter dem für
Spargel liegen:
assert IR3 for KUNDE :
not KName = ’Weiß’ or Kto >= 0
assert IR4 deferred
( select avg (Preis) from LIEFERANT
where Ware = ’Karotten’)
<= (select avg (Preis) from LIEFERANT
where Ware = ’Spargel’)
VL Datenbanken I – 11–21
VL Datenbanken I – 11–22
Integritätsregeln in SQL: Beispiel V
Integritätsregeln in SQL: Beispiel VI
Nur solche Waren dürfen bestellt werden, für die es
mindestens einen Lieferanten gibt:
Der Brotpreis darf nicht erhöht werden:
assert IR6 (on update of LIEFERANT (Preis))
for LIEFERANT:
not Ware = ’Brot’ or
new Preis <= old Preis
assert IR5 for AUFTRAG A:
exists (select * from LIEFERANT
where Ware = A.Ware)
VL Datenbanken I – 11–23
VL Datenbanken I – 11–24
Integritätsregeln in SQL: Beispiel VII
Integritätsregeln in SQL: Beispiel VIII
Kunden dürfen nur gelöscht werden, wenn sie keine Waren
mehr bestellt haben:
Der Preis eines Grundnahrungsmittels darf innerhalb von
drei Jahren höchstens um 15% steigen.
assert IR7 deferred on deletion of KUNDE
for KUNDE K:
not exists (select * from AUFTRAG
where KName = old K.KName)
⇒ kann in diesem Sprachvorschlag nicht ausgedrückt
werden!
VL Datenbanken I – 11–25
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–27
VL Datenbanken I – 11–26
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–28
Trigger (II)
Trigger: Entwurf und Implementierung
create trigger ...
after <Operation>
<Anweisungen>
entspricht einer speziellen Integritätsregel:
assert ...on <Operation> :
false else ( <Anweisungen> )
■
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–29
SQL:1999-Trigger
■
■
VL Datenbanken I – 11–30
Weitere Angaben bei Triggern
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–31
■
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–32
Beispiel für Trigger (I)
Beispiel für Trigger (II)
Kein Kundenkonto darf unter -100 absinken:
Nur solche Waren dürfen bestellt werden, für die es
mindestens einen Lieferanten gibt:
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
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
; ähnlicher Trigger für insert
VL Datenbanken I – 11–33
Beispiel für Trigger (III)
VL Datenbanken I – 11–34
Methoden der Integritätssicherung
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–35
■
■
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–36
Integritätssicherung durch Trigger
Integritätssicherung durch Trigger (II)
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.
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–37
Trigger in Oracle
VL Datenbanken I – 11–38
Trigger in Oracle (II)
■
Implementierung in PL/SQL
■
Notation
create [ or replace ] trigger trigger-name
before | after
insert or update [ of spalten ]
or delete on tabelle
[ for each row
[ when ( prädikat ) ] ]
PL/SQL-Block
VL Datenbanken I – 11–39
■
Arten:
◆ Anweisungsebene (statement level trigger ): Trigger
wird ausgelöst vor bzw. nach der DML-Anweisung
◆ Tupelebene (row level trigger ): Trigger wird vor bzw.
nach jeder einzelnen Modifikation ausgelöst (one
tuple at a time)
■
Trigger auf Tupelebene:
◆ Prädikat zur Einschränkung der Anwendung (when)
◆ Zugriff auf altes (:old.col) bzw. neues (:new.col)
Tupel
– für delete: nur (:old.col)
– für insert: nur (:new.col)
– in when-Klausel nur (new.col) bzw. (old.col)
VL Datenbanken I – 11–40
Trigger in Oracle (III)
Trigger in Oracle: Beispiel
■
Transaktionsabbruch durch
raise_application_error(code, message)
■
Unterscheidung der Art der DML-Anweisung
if deleting then ... end if;
if updating then ... end if;
if inserting then ... end if;
Kein Kundenkonto darf unter -100 absinken:
create or replace trigger bad_account
after insert or update of Kto on KUNDE
for each row
when (new.Kto < -100)
begin
raise_application_error(-20221,
’Nicht unter -10000’);
end;
VL Datenbanken I – 11–41
VL Datenbanken I – 11–42
Herunterladen