5. Trigger

Werbung
5. Trigger
Charakterisierung von Triggern
5. Trigger
• Trigger definieren automatische Reaktionen auf Ereignisse, die durch Datenmanipulationen auf einer Relation ausgelöst werden.
• Trigger stellen eine einfache Form von ECA-Regeln dar:
E Event: auslösendes Ereignis
C Condition: Eine Bedingung, die zum Ausführen der Regelaktion erfüllt sein muss
A Action: auszuführende Aktion
• Beispiele für Anwendungsszenarien von Triggern:
– Unterstützung der Konsistenz: automatische Anpassung von Relationen
– Überprüfung komplexer Integritätsbedingungen
– Protokollierungen
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
192
5. Trigger
Triggerdefinition
Triggerdefinition in SQL99
create trigger triggername
{before | after}
{insert | delete | update [of spaltenliste ]}
on relation
[referencing transitionsvariablen/-tabellen ]
[for each {row | statement}]
[when ( praedikat )]
triggerrumpf
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
193
5. Trigger
Triggerdefinition
Bestandteiler der Triggerdefinition
Ein Trigger besteht in SQL99 aus folgenden Komponenten:
• eindeutiger Name
• Aktivierungszeitpunkt: Man unterscheidet before- und after-Trigger.
before: Aktivierung vor dem auslösenden Ereignis
after: Aktivierung nach dem auslösenden Ereignis
Einschränkung: before-Trigger dürfen keine direkten oder indirekten Änderungsoperationen enthalten
• Aktivierungsereignis: insert-, update- oder delete-Trigger
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
194
5. Trigger
Triggerdefinition
• Transitionsvariablen/-tabellen: Name für Tupel/Tabelle vor bzw. nach Änderung
old
new
old
new
[row]
[row]
table
table
[as]
[as]
[as]
[as]
transitionsvariable
transitionsvariable
transitionstabelle
transitionstabelle
Einschränkungen:
– old nicht in insert-Triggern
– new nicht in delete-Triggern
Granularität:
Zeilentrigger: Aktivierung des Triggers erfolgt für alle betroffenen Tupel einer SQLAnweisung einzeln (for each row).
Anweisungstrigger: Aktivierung erfolgt pro Anweisung (for each statement).
In Anweisungstriggern können keine Transitionsvariablen verwendet werden.
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
195
5. Trigger
Triggerdefinition
• Bedingung: Die Ausführung der Triggeraktion kann durch die Angabe einer whenKlausel an eine Bedingung geknüpft werden.
• Aktion: Der Triggerrumpf besteht aus einer einzelnen oder zusammengesetzten
SQL-Anweisung. Hier können auch prozedurale Erweiterungen von SQL genutzt
werden.
Nicht erlaubt sind: Transaktions- und Verbindungsanweisungen
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
196
5. Trigger
Triggerdefinition
Transitionale Integritätsbedingung
• Eine transitionale Integritätsbedingung ist eine Bedingung für den Zustandsübergang von einem konsistenten Zustand A in einen konsistenten Datenbankzustand
B.
• Solch eine Integritätsbedingung schränkt die möglichen Zustandsübergänge ein:
Darf es einen Übergang von A nach B geben?
• Die Konsistenz der Zustände A und B entspricht dabei einem statischen Konsistenzbegriff.
Beispiele:
• Gehälter dürfen nicht sinken.
• Eine Mieterhöhung darf nicht mehr als 10% betragen.
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
197
5. Trigger
Triggerdefinition
Implementierung transitionaler Integritätsbedingungen
Before-Trigger sind prädestiniert für die Implementierung transitionaler Integritätsbedingungen.
Beispiel: Gehälter dürfen nicht sinken:
create trigger KeineGehaltsKuerzungen
before update of gehalt on Mitarbeiter
for each row
when (old.gehalt > new.gehalt )
begin
RAISE_APPLICATION_ERROR(-20001, ’Verletzung des Tarifvertrags’);
end;
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
198
5. Trigger
Triggerdefinition
Dynamische temporale Integritätsbedingung
Dynamische temporale Integritätsbedingung beschreiben Einschränkungen an eine
Folge von konsistenten Zuständen.
• Folge von Datenbankzuständen A1, . . . , An
• statische Konsistenz: Die Zustände A1 bis An sind jeweils konsistent.
• transitionale Konsistenz: Die Zustandsübergänge Ai nach Ai+1 sind für alle 1 ≤
i < n konsistent.
• temporale Konsistenz: Die gesamte Folge A1, . . . , An der Zustände stellt eine
konsistente Zustandsfolge dar.
Beispiel:
• Eine Miete darf innerhalb von 5 Jahren nicht mehr als 20% steigen.
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
199
5. Trigger
Triggerdefinition
Bemerkungen:
• Die Prüfung dynamische temporale Integritätsbedingungen kann durch BeforeTrigger erfolgen.
• Hierfür werden Versionierungskonzepte oder Archivtabellen benötigt.
• Eine automatische Archivierung (bei Änderungen) kann durch After-Trigger erfolgen.
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
200
5. Trigger
Triggerdefinition
Ausführungsmodell für Integritätsbedingungen und Trigger
Ausführung einer SQL-Anweisung:
1. Bestimme die betroffenen Tupel.
2. Führe before-Trigger aus (→ Fehler).
3. Führe eigentliche SQL-Anweisung aus.
4. Prüfe foreign key contraints und führe damit verbundene Operationen aus (→ Fehler).
5. Prüfe sonstige Konsistenzbedingungen (→ Fehler).
6. Führe after-Trigger aus (→ Fehler).
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
201
5. Trigger
Triggerdefinition
Beispiel einer Aktivierungsreihenfolge von Triggern:
Orginal SQL−Anweisung
Trigger 1, Statement 1
Trigger A
Trigger B
Trigger 1, Statement 2
Trigger 2
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
202
5. Trigger
Beispiele
Before-Trigger
• mächtige Integritätsbedingungen
• Anpassung von zu setzenden Datenwerten
Flexibler Default-Mechanismus für Attributwerte: automatische Berechnung des Anfangsgehalts und des Bonus:
CREATE TRIGGER ang_trig1
BEFORE INSERT ON ang
FOR EACH ROW
SET (gehalt, bonus) =
(SELECT gehalt, bonus
FROM anfangsgehalt
WHERE jobcode = new.jobcode);
Konsistenzbedingung auf Basis von Änderungen und automatische Anpassung:
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
203
5. Trigger
Beispiele
CREATE TRIGGER ang_trig2
BEFORE UPDATE OF gehalt ON ang
FOR EACH ROW
WHEN ( new.gehalt > 1.5 * old.gehalt )
SET new.gehalt = 1.5 * old.gehalt;
Beliebig komplexe Integritätsbedingungen durch den Aufruf benutzerdefinierter Funktionen:
CREATE TRIGGER ang_trig3
BEFORE DELETE ON ang
FOR EACH ROW
WHEN ( wichtigkeit(old.jobcode, old.projekt) > 20 )
BEGIN
RAISE_APPLICATION_ERROR(-20002, ’Wir brauchen diesen Mitarbeiter!’ );
END;
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
204
5. Trigger
Beispiele
After-Trigger
TEMPS
Ort Temp
Ort
MaxTemp
EXTREMWERTE
MaxDatum MinTemp
MinDatum
CREATE TRIGGER temps_trig1
AFTER update ON temps
FOR EACH ROW
WHEN ( new.temp > (SELECT maxtemp
FROM extremwerte
WHERE ort = new.ort) )
BEGIN
UPDATE extremwerte
SET maxtemp = new.temp,
maxdate = SYSDATE
WHERE ort = new.ort;
END;
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
205
5. Trigger
Beispiele
Und wenn in TEMPS neue Orte eingefügt werden?
CREATE TRIGGER temps_trig3
AFTER INSERT ON temps
FOR EACH ROW
BEGIN
INSERT INTO extremwerte (ort, maxtemp, maxdate, mintemp, mindate )
VALUES( new.ort, new.temp, SYSDATE, new.temp, SYSDATE );
END;
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
206
5. Trigger
Beispiele
Ein weiteres typisches Einsatzszenario ist die Wahrung von referentiellen Integritätsbedingungen:
Beispiel: Simulation von on update cascade bei Fremdschlüsseln:
create trigger OnUpdateVorgesetzterCascade
after update of id on Mitarbeiter
for each row
when ( exists( select *
from mitarbeiter
where vorgesetzter = old.id ))
begin
update mitarbeiter
set vorgesetzter = new.id
where vorgesetzter = old.id;
end;
Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010
207
Herunterladen