Direkt zum Inhalt
Urkunden
JSON-FunktionenTabellen & Schema ManagementMathe-FunktionenDatenbankenString-FunktionenAuslöserIndizesDatum FunktionenBasic Syntax

PostgreSQL BEFORE-Trigger

Trigger in PostgreSQL sind Funktionen, die automatisch als Reaktion auf bestimmte Ereignisse in einer Tabelle ausgeführt werden, wie z.B. INSERT, UPDATE oder DELETE. Ein "BEFORE"-Trigger wird ausgelöst, bevor das Ereignis eintritt. So kannst du die Daten ändern oder Einschränkungen erzwingen, bevor die Datenänderungen übertragen werden.

Verwendung
`BEFORE`-Trigger werden verwendet, um Daten zu überprüfen oder zu ändern, bevor sie in einer Tabelle eingefügt, aktualisiert oder gelöscht werden. Sie werden häufig eingesetzt, um Geschäftsregeln durchzusetzen, die Datenintegrität zu überprüfen oder Felder automatisch zu aktualisieren.

sql
CREATE TRIGGER trigger_name
BEFORE INSERT OR UPDATE OR DELETE
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();

In dieser Syntax gibt das Schlüsselwort "BEFORE" an, dass der Trigger aktiviert werden soll, bevor das/die angegebene(n) Ereignis(e) eintreten. Die `BEFORE`-Trigger unterscheiden sich von den `AFTER`-Triggern, da die `BEFORE`-Trigger vor dem Ereignis ausgeführt werden und eine Datenmanipulation vor dem Abschluss der Transaktion ermöglichen.

Beispiele

1. Grundlegender BEFORE INSERT-Auslöser

sql
CREATE OR REPLACE FUNCTION check_positive_salary()
RETURNS TRIGGER AS $$
BEGIN
  IF NEW.salary < 0 THEN
    RAISE EXCEPTION 'Salary cannot be negative';
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER check_salary_trigger
BEFORE INSERT
ON employees
FOR EACH ROW
EXECUTE FUNCTION check_positive_salary();

In diesem Beispiel wird ein Trigger erstellt, der prüft, ob das "Gehalt" positiv ist, bevor eine neue Zeile in die Tabelle "Mitarbeiter" eingefügt wird.

2. BEFORE UPDATE Auslöser zum Protokollieren von Änderungen

sql
CREATE OR REPLACE FUNCTION log_update()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO employees_audit(employee_id, old_salary, new_salary, changed_on)
  VALUES(OLD.id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER log_update_trigger
BEFORE UPDATE
ON employees
FOR EACH ROW
EXECUTE FUNCTION log_update();

Hier protokolliert ein Trigger Änderungen am Feld "Gehalt" in der Tabelle "Mitarbeiter_Audit", bevor eine Aktualisierung erfolgt.

3. BEFORE DELETE Auslöser für Kaskaden-Aktionen

sql
CREATE OR REPLACE FUNCTION prevent_deletion()
RETURNS TRIGGER AS $$
BEGIN
  IF EXISTS (SELECT 1 FROM orders WHERE orders.employee_id = OLD.id) THEN
    RAISE EXCEPTION 'Employee cannot be deleted, related orders exist';
  END IF;
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER prevent_deletion_trigger
BEFORE DELETE
ON employees
FOR EACH ROW
EXECUTE FUNCTION prevent_deletion();

Dieser Trigger verhindert, dass ein Mitarbeiter gelöscht wird, wenn es in der Tabelle "Aufträge" zugehörige Bestellungen gibt.

Tipps und bewährte Praktiken

  • Verwende beschreibende Trigger-Namen. Das verbessert die Lesbarkeit und die Wartung und macht deutlich, wofür jeder Auslöser gedacht ist.
  • Halte die Auslösefunktionen einfach. Komplexe Logik kann zu Leistungsproblemen führen und ist schwieriger zu debuggen.
  • Teste gründlich. Stelle sicher, dass sich die Auslöser in allen Szenarien wie erwartet verhalten, um Probleme mit der Datenintegrität zu vermeiden.
  • Dokumentauslöser. Dokumentiere den Zweck und die Logik jedes Auslösers klar und deutlich, damit du später darauf zurückgreifen und im Team zusammenarbeiten kannst.
  • Berücksichtige die Auswirkungen auf die Leistung. Trigger können die Leistung beeinträchtigen; verwende sie mit Bedacht, besonders bei großen Tabellen oder häufigen Operationen.
  • Verstehe das Transaktionsverhalten. BEFORE"-Trigger werden innerhalb der Transaktion ausgeführt, die sie ausgelöst hat, und Änderungen können zurückgenommen werden, wenn die Transaktion fehlschlägt.
  • Gib die richtige Zeile zurück. Gib immer entsprechend `NEW` oder `OLD` zurück, um sicherzustellen, dass der Trigger richtig funktioniert.
  • Auslöser vorübergehend deaktivieren. Du kannst Trigger bei Massenoperationen oder Wartungsaufgaben mit `ALTER TABLE table_name DISABLE TRIGGER trigger_name;` deaktivieren und mit `ALTER TABLE table_name ENABLE TRIGGER trigger_name;` wieder aktivieren.