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

PostgreSQL AFTER-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 AFTER-Trigger wird ausgeführt, nachdem das auslösende Ereignis abgeschlossen ist, so dass er auf den endgültigen Zustand der Daten zugreifen kann.

Verwendung

AFTER-Trigger werden verwendet, wenn du Aktionen nach einem Datenänderungsereignis durchführen musst, um sicherzustellen, dass alle abhängigen Operationen erst nach dem erfolgreichen Abschluss des ursprünglichen Ereignisses erfolgen. Sie werden mit der Anweisung CREATE TRIGGER definiert.


CREATE TRIGGER trigger_name
AFTER event [OR event ...]
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();

In dieser Syntax gibt AFTER event das Ereignis (INSERT, UPDATE, DELETE) an, das den Trigger auslöst, und function_name() ist die Funktion, die nach dem Ereignis ausgeführt wird.

Beispiele

1. Grundlegender AFTER INSERT-Auslöser


CREATE OR REPLACE FUNCTION log_new_user()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO user_logs(user_id, action, log_time)
  VALUES (NEW.id, 'User Created', NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION log_new_user();

In diesem Beispiel wird der Eintrag eines neuen Benutzers in user_logs protokolliert, nachdem er in die Tabelle users eingefügt wurde.

2. AFTER UPDATE Auslöser


CREATE OR REPLACE FUNCTION update_inventory_log()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO inventory_logs(product_id, change, log_time)
  VALUES (NEW.product_id, NEW.quantity - OLD.quantity, NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_inventory_update
AFTER UPDATE ON inventory
FOR EACH ROW
EXECUTE FUNCTION update_inventory_log();

Dieser Trigger protokolliert die Mengenänderung eines Produkts auf inventory_logs, nachdem die Tabelle inventory aktualisiert wurde.

3. AFTER DELETE Auslöser mit bedingter Logik


CREATE OR REPLACE FUNCTION log_deleted_order()
RETURNS TRIGGER AS $$
BEGIN
  IF OLD.status = 'completed' THEN
    INSERT INTO order_logs(order_id, action, log_time)
    VALUES (OLD.id, 'Completed Order Deleted', NOW());
  END IF;
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_order_delete
AFTER DELETE ON orders
FOR EACH ROW
EXECUTE FUNCTION log_deleted_order();

In diesem Beispiel wird das Löschen von abgeschlossenen Aufträgen aus der Tabelle orders nur dann protokolliert, wenn der Status des Auftrags "abgeschlossen" war.

Tipps und bewährte Praktiken

  • Verwende AFTER-Trigger für abhängige Vorgänge. Wende sie an, wenn nachfolgende Aktionen vom Abschluss des ursprünglichen Vorgangs abhängen.
  • Halte die Auslösefunktionen effizient. Stelle sicher, dass die Funktion, die der Trigger ausführt, optimiert ist, um eine Verlangsamung der Transaktionen zu verhindern.
  • Vermeide komplexe Logik. Vereinfache die Logik in den Triggern, um die Übersichtlichkeit und Wartungsfreundlichkeit zu wahren.
  • Teste die Auslöser gründlich. Stelle sicher, dass die Auslöser nicht unbeabsichtigt die Anwendungslogik beeinflussen, indem du sie umfassend testest.
  • Dokumentiere das Auslöseverhalten. Dokumentiere genau, wofür die einzelnen Auslöser gedacht sind, vor allem bei größeren Anwendungen.
  • Überwache die Auswirkungen auf die Leistung. Verwende Lernpfade oder Monitoring-Tools, um die Auswirkungen von Triggern auf die Leistung von Produktionsdatenbanken zu verfolgen.
  • Verstehe die Wechselwirkungen von Transaktionen. AFTER-Trigger sind Teil der Transaktion; wenn in der Triggerfunktion ein Fehler auftritt, kann die gesamte Transaktion zurückgerollt werden.
  • Berücksichtige Einschränkungen. Achte bei der Verwendung von AFTER-Triggern auf mögliche Konflikte mit Fremdschlüssel-Beschränkungen oder kaskadierenden Aktionen.
  • Verwalte den Lebenszyklus von Triggern. Du weißt, wie du einen Auslöser deaktivieren oder fallen lassen kannst, wenn er nicht mehr benötigt wird: ALTER TABLE oder DROP TRIGGER.