6. Trigger

Werbung
6. Trigger
Charakterisierung von Triggern
6. Trigger
• Trigger definieren automatische Reaktionen auf Ereignisse, die durch Datenmanupilationen 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 muß.
A Action: auszuführende Aktion
• Beispiele für Anwendungsszenarien von Triggern:
– Ünterstützung der Konsistenz: automatische Anpassung von Relationen
– Überprüfung komplexer Integritätsbedingungen
– Protokollierungen
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
287
6. 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
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
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
288
6. Trigger
Triggerdefinition
Einschränkung: before-Trigger dürfen keine direkten oder indirekten Änderungsoperationen enthalten
• Aktivierungsereignis: insert-, update- oder delete-Trigger
• 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.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
289
6. 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
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
290
6. Trigger
Triggerdefinition
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
referencing old as alt new as neu
for each row
when (alt.gehalt > neu.gehalt )
begin atomic
signal sqlstate ’75001’;
set message_text = ’Gehalt darf nicht fallen’;
end;
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
291
6. Trigger
Triggerdefinition
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
referencing old as alt new as neu
for each row
when ( exists( select *
from mitarbeiter
where vorgesetzter = alt.id ))
begin atomic
update mitarbeiter
set vorgesetzter = neu.id
where vorgesetzter = alt.id;
end;
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
292
6. Trigger
Triggerdefinition
Besonderheiten der Triggerdefinition in DB2:
• no cascade before statt before
Dient als Erinnerung, daß ein before-Trigger niemals einen anderen beforeTrigger aktiviert.
• before-Trigger müssen stets Zeilentrigger sein.
• before-Trigger können eine Zuweisungsanweisung enthalten, die zur Konditionierung der zu setzenden Werte dienen kann.
• for each {row | statement} mode db2sql
Repräsentiert den in DB2 implementierten Triggerausführungsmodus. Soll sicherstellen, daß existierende Anwendungen nicht von zukünftigen alternativen
Ausführungsmodi betroffen sind.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
293
6. 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. Überprüfe FK mit restrict (→ Fehler).
5. Überprüfe FK mit cascade, set null, set default (→ Fehler).
6. Überprüfe FK mit no action und allen übrigen Bedingungen (→ Fehler).
7. Führe after-Trigger aus (→ Fehler).
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
294
6. Trigger
Triggerdefinition
Beispiel einer Aktivierungsreihenfolge von Triggern:
Orginal SQL−Anweisung
Trigger 1, Statement 1
Trigger A
Trigger B
Trigger 1, Statement 2
Trigger 2
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
295
6. 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
NO CASCADE BEFORE INSERT ON ang
REFERENCING NEW AS neuezeile
FOR EACH ROW MODE DB2SQL
SET (gehalt, bonus) =
(SELECT gehalt, bonus
FROM anfangsgehalt
WHERE jobcode = neuezeile.jobcode);
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
296
6. Trigger
Beispiele
Konsistensbedingung auf Basis von Änderungen und automatische Anpassung:
CREATE TRIGGER ang_trig2
NO CASCADE BEFORE UPDATE OF gehalt ON ang
REFERENCING OLD AS altezeile NEW AS neuezeile
FOR EACH ROW MODE DB2SQL
WHEN ( neuezeile.gehalt > 1.5 * altezeile.gehalt )
SET neuezeile.gehalt = 1.5 * altezeile.gehalt;
Beliebig komplexe Integritätsbedingungen durch den Aufruf benutzerdefinierter Funktionen:
CREATE TRIGGER ang_trig3
NO CASCADE BEFORE DELETE ON ang
REFERENCING OLD AS altezeile
FOR EACH ROW MODE DB2SQL
WHEN ( wichtigkeit(altezeile.jobcode, altezeile.projekt) > 20 )
SIGNAL SQLSTATE ’70010’ ( ’Wir brauchen diese Person’ );
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
297
6. Trigger
Beispiele
After-Trigger
TEMPS
Ort Temp
Ort
MaxTemp
EXTREMWERTE
MaxDatum MinTemp
MinDatum
CREATE TRIGGER temps_trig1
AFTER update ON temps
REFERENCING NEW AS neuezeile
FOR EACH ROW MODE DB2SQL
WHEN ( neuezeile.temp > (SELECT maxtemp
FROM extremwerte
WHERE ort = neuezeile.ort)
OR (SELECT maxtemp
FROM extremwerte
WHERE ort = neuezeile.ort) IS NULL )
UPDATE extremwerte
SET maxtemp = neuezeile.temp,
maxdate = CURRENT DATE
WHERE ort = neuezeile.ort;
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
298
6. Trigger
Beispiele
Und wenn in TEMPS neue Orte eingefügt werden?
CREATE TRIGGER temps_trig3
AFTER INSERT ON temps
REFERENCING NEW AS neuezeile
FOR EACH ROW MODE DB2SQL
INSERT INTO extremwerte (ort, maxtemp, maxdate, mintemp, mindate )
VALUES( neuezeile.ort, neuezeile.temp, CURRENT DATE,
neuezeile.temp, CURRENT DATE );
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
299
Herunterladen