Das Kefk Network Wiki befindet sich im Testbetrieb.
Datenbanktrigger
Aus Kefk.
Ein Datenbanktrigger, meist nur Trigger genannt, ist eine Funktionalität von diversen Datenbankmanagementsystemen, insbesondere von großen relationalen Datenbankmanagementsystemen.
Bei einer bestimmten Art der Änderungen (z. B. INSERT, UPDATE, DELETE bei SQL) von Daten in einer Tabelle wird ein gespeichertes Programm aufgerufen, das diese Änderung erlaubt, verhindert und/oder weitere Tätigkeiten vornimmt.
Inhaltsverzeichnis |
Eigenschaften
Trigger werden u. a. zur Wahrung der Datenkonsistenz (Integritätschecks) und zum Einfügen, Löschen oder Ändern von Referenzdaten eingesetzt. Der Trigger wird ausgeführt („gefeuert“ in der Informatikfachsprache), wahlweise bevor die Änderung an der referenzierten Tabelle vorgenommen wird oder danach. Einige RDBMS bieten auch einen 'instead of INSERT' Trigger an, der es erlaubt, anstelle der INSERT-Operation andere SQL-Statements auszuführen.
Man muss festlegen, ob der Trigger pro verändertem Datensatz oder pro Statement-Aufruf ausgelöst werden soll. Beispiel: Wenn ein Update-Statement 100 Sätze verändert, dann wird im ersten Fall der Trigger 100 mal aktiviert und im zweiten Fall nur ein mal.
Da Trigger selber Datensätze einfügen, ändern und löschen können, kann ein Trigger durch seine Ausführung weitere Trigger auslösen. So kann eine ganze Kette von Verarbeitungen angestoßen werden.
Zur Erstellung von Triggern stellen die verschiedenen RDBMS spezielle Programmiersprachen wie PL/SQL (von Oracle) oder SQL PL (von DB2) zur Verfügung. Bei einigen RDBMS können innerhalb der Trigger-Verarbeitung auch Stored Procedures aufgerufen werden. Dadurch ist der Aufruf eines in einer anderen Programmiersprache (C, COBOL, Java) geschriebenen Programms möglich.
Trigger können die Ursache für Performanceprobleme in großen Datenbanken sein, da manchmal eine kleine Änderung an einer Tabelle eine lange Reaktion, ausgelöst durch Trigger, hervorrufen kann.
Trigger werden von einigen Programmierern und Administratoren gemieden, weil ein schnelles Ändern von ein paar Datensätzen 'unkalkulierbare' Auswirkungen haben kann. Auch das Debuggen von Programmen, die auf Tabellen mit Triggern zugreifen, kann schwerer sein, weil der Programm-Debugger nur die SQL-Statements anzeigt, die das Programm ausführt, nicht aber die SQL-Statements, die durch die Trigger ausgeführt werden.
Siehe auch
Trigger PL/SQL Syntax
CREATE [OR REPLACE] TRIGGER <trigger_name>
{BEFORE|AFTER} {INSERT|DELETE|UPDATE}
ON <table_name>
[REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]]
[FOR EACH ROW [WHEN (<trigger_condition>)]]
<trigger_body>
PL/SQL Code Beispiel
CREATE TRIGGER mitarbeiter_trig_gehalt_biu
BEFORE INSERT OR UPDATE OF gehalt ON mitarbeiter
FOR EACH ROW
-- Triggername mitarbeiter_trig_gehalt_biu
-- (_biu steht für B-efore I-nsert U-pdate )
-- Tabelle: MITARBEITER
-- Trigger soll nur ziehen,
-- wenn Gehalt kleiner 5000 ist oder Neues Gehalt kleiner altem Gehalt
-- in der folgenden WHEN erfolgt der Zugriff auf :old und :new OHNE vorangestellte :
WHEN (new.gehalt <= 5000 or new.gehalt < old.gehalt)
DECLARE
v_mitarbeiter_name VARCHAR2(255):=null;
-- Cursor holt "Name, Vorname" von Mitarbeitertabelle
-- Explizite Definition des Cursors hat
-- Performance-Vorteile gegen "select into <variable>" im Trigger-Body
cursor c_name is :select name||', '||vorname
from mitarbeiter
where mitarbeiternummer = :NEW.MITARBEITERNR;
BEGIN
-- Mitarbeiter-Name ermitteln und in Variable v_mitarbeiter_name speichern
open c_name;
fetch c_name into v_mitarbeiter_name;
close c_name;
-- Bei Gehalt kleiner 5000 Exception auslösen
--> Fehler wird in der Regel bis zur Anwendung hochgereicht
-- Exception-Nr -20000 - -29999 können selbst definiert werden
IF :NEW.GEHALT <= 5000 THEN
RAISE_APPLICATION_ERROR(
-20901,
'Managergehalt für Mitarbeiter '||v_mitarbeiter_name||' zu klein!'
);
END IF;
IF :NEW.GEHALT < :OLD_GEHALT THEN
RAISE_APPLICATION_ERROR(
-20902,
'Gehaltskürzung für Mitarbeiter '||v_mitarbeiter_name||' nicht erlaubt!'
);
END IF;
END;
/
Literatur
- Klaus R. Dittrich, Angelika M. Kotz, Jutta A. Mülle: An event/trigger mechanism to enforce complex consistency constraints in design databases. In: ACM SIGMOD. 15/3/1986, ACM Press, New York, S. 22–36, ISSN 0163-5808
Weblinks
| Dieses Dokument entstammt in seiner ersten oder einer späteren Version der deutschsprachigen Wikipedia. Es ist dort zu finden unter dem Stichwort Datenbanktrigger, die Liste der bisherigen Autoren befindet sich in der Versionsliste; die Originalfassung kann dort auch bearbeitet werden. Alle Texte der Wikipedia und ihre Derivate stehen unter der GNU-Lizenz für freie Dokumentation. |
