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

Überlegungen zur PostgreSQL-Leistung

Trigger in PostgreSQL sind Datenbank-Callback-Funktionen, die als Reaktion auf bestimmte Ereignisse in einer bestimmten Tabelle oder Ansicht automatisch aufgerufen oder ausgeführt werden. Sie werden eingesetzt, um Geschäftsregeln durchzusetzen, Eingabedaten zu validieren und die Datenintegrität zu gewährleisten.

Verwendung

Trigger werden eingesetzt, wenn du eine Funktion als Reaktion auf Ereignisse wie `INSERT`, `UPDATE` oder `DELETE` in einer Tabelle automatisch ausführen lassen willst. Sie sind so definiert, dass sie vor oder nach diesen Ereignissen handeln.

sql
CREATE TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
ON table_name
[ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE function_name(arguments);

In dieser Syntax richtet `CREATE TRIGGER` einen Trigger namens `Triggername` ein, der `Funktion_name` ausführt, wenn bestimmte Ereignisse in `Tabelle_name` auftreten.

Beispiele

1. Basic Insert Trigger

sql
CREATE OR REPLACE FUNCTION log_insert()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO audit_table(action, time) VALUES ('INSERT', NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert_audit
AFTER INSERT ON my_table
FOR EACH ROW EXECUTE PROCEDURE log_insert();

Dieser Trigger protokolliert jede Einfügeoperation in `meine_tabelle`, indem er einen Datensatz in `audit_table` hinzufügt.

2. Aktualisierungsauslöser mit bedingter Logik

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

CREATE TRIGGER check_update_trigger
BEFORE UPDATE ON transactions
FOR EACH ROW EXECUTE PROCEDURE check_update();

Dieser Trigger prüft, ob die Spalte "Betrag" in der Tabelle "Transaktionen" vor Aktualisierungsvorgängen nicht negativ ist.

3. Auslöser für kaskadierende Löschungen

sql
CREATE OR REPLACE FUNCTION cascade_delete()
RETURNS TRIGGER AS $$
BEGIN
  DELETE FROM child_table WHERE parent_id = OLD.id;
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER cascading_delete_trigger
AFTER DELETE ON parent_table
FOR EACH ROW EXECUTE PROCEDURE cascade_delete();

Dieser Trigger stellt sicher, dass beim Löschen einer Zeile aus der "parent_table" auch die zugehörigen Zeilen in der "child_table" entfernt werden.

Tipps und bewährte Praktiken

  • Auslöselogik begrenzen. Halte die Triggerfunktionen einfach, um den Leistungsaufwand zu minimieren und komplexe Geschäftslogik zu vermeiden.
  • Verwende Trigger auf Zeilenebene selektiv. Entscheide dich wenn möglich für Trigger auf Anweisungsebene, um die Anzahl der Ausführungen zu reduzieren. Trigger auf Zeilenebene sind nützlich, wenn Operationen in jeder betroffenen Zeile durchgeführt werden müssen, während Trigger auf Anweisungsebene den Overhead reduzieren können, indem sie einmal pro Operation ausgeführt werden.
  • Sei vorsichtig mit rekursiven Triggern. Stelle sicher, dass sich Trigger nicht ungewollt selbst aufrufen, was zu Endlosschleifen führt.
  • Teste gründlich. Teste die Auslöser ausgiebig in einer Entwicklungsumgebung, um ihre Auswirkungen auf die Leistung zu beurteilen.
  • Dokumentauslöser. Dokumentiere den Zweck und die Logik jedes Auslösers klar und deutlich, damit du ihn später nachschlagen und pflegen kannst.
  • Berücksichtige die Grenzen der Transaktion. Achte auf die Transaktionsgrenzen, um sicherzustellen, dass sich die Auslöser bei Transaktionen mit mehreren Anweisungen wie erwartet verhalten.
  • Überwache die Leistung. Behalte die Auswirkungen von Triggern auf die Leistung in einem Live-System im Auge und diagnostiziere eventuelle Probleme mit den Logging- und Monitoring-Tools von PostgreSQL.

Auslöser verwalten

  • Um einen Trigger vorübergehend zu deaktivieren, verwendest du den Befehl `ALTER TABLE ... DISABLE TRIGGER` Befehl.
  • Um einen Trigger dauerhaft zu entfernen, verwende den Befehl `DROP TRIGGER`.