Trigger in PostgreSQL sind Datenbank-Callback-Funktionen, die automatisch ausgeführt oder ausgelöst werden, wenn ein bestimmtes Datenbankereignis eintritt, wie z.B. eine `INSERT`-, `UPDATE`-, `DELETE`- oder sogar `TRUNCATE`-Operation. Sie werden verwendet, um Geschäftsregeln durchzusetzen, Daten zu validieren und die Datenintegrität innerhalb der Datenbank zu wahren.
Verwendung
Trigger werden verwendet, um Aufgaben zu automatisieren, die beim Eintreten bestimmter Datenbankereignisse ausgeführt werden sollen, sodass weniger manuelle Eingriffe oder anwendungsseitige Logik erforderlich sind. Sie werden mit der Anweisung `CREATE TRIGGER` definiert, die das Ereignis und die zu ergreifende Aktion angibt.
sql
CREATETRIGGER trigger_name
{BEFORE|AFTER|INSTEADOF}{INSERT|UPDATE|DELETE|TRUNCATE}ON table_name
[FOREACHROW|FOREACHSTATEMENT]EXECUTEPROCEDUREfunction_name();Bereitgestellt von
In dieser Syntax definiert `CREATE TRIGGER` einen neuen Trigger mit dem Namen `Triggername`, der eine angegebene Funktion (`Funktionsname`) entweder vor, nach oder anstelle des angegebenen Ereignisses auf `Tabelle_name` ausführt. Die Klausel "FÜR JEDE ZEILE" gibt an, dass der Trigger einmal für jede vom Ereignis betroffene Zeile ausgeführt wird, während "FÜR JEDES STATEMENT" einmal pro auslösender Anweisung ausgeführt wird, unabhängig davon, wie viele Zeilen betroffen sind.
Beispiele
1. Basic Insert Trigger
sql
CREATEFUNCTIONlog_insert()RETURNSTRIGGERAS $$
BEGININSERTINTOaudit_log(table_name, operation)VALUES('employees','INSERT');RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER log_employee_inserts
AFTERINSERTON employees
FOREACHROWEXECUTEPROCEDURElog_insert();Bereitgestellt von
In diesem Beispiel wird ein Trigger erstellt, der jede Einfügeoperation in der Tabelle "Mitarbeiter" in einer Tabelle "audit_log" protokolliert.
2. Auslöser mit Bedingung aktualisieren
sql
CREATEFUNCTIONcheck_salary_update()RETURNSTRIGGERAS $$
BEGINIFNEW.salary <OLD.salary THENRAISEEXCEPTION'Salary cannot be decreased';ENDIF;RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER prevent_salary_decrease
BEFOREUPDATEON employees
FOREACHROWEXECUTEPROCEDUREcheck_salary_update();Bereitgestellt von
Dieser Auslöser verhindert, dass die Gehälter der Beschäftigten sinken und stellt sicher, dass die Gehaltsaktualisierungen nur steigen oder gleich bleiben können. Hier stehen "NEU" und "ALT" für den neuen bzw. alten Zustand der Zeile, die bearbeitet wird.
3. Auslöser für Kaskadenlöschung
sql
CREATEFUNCTIONdelete_related_records()RETURNSTRIGGERAS $$
BEGINDELETEFROM orders WHERE customer_id =OLD.customer_id;RETURNOLD;END;
$$ LANGUAGE plpgsql;CREATETRIGGER cascade_delete_orders
AFTERDELETEON customers
FOREACHROWEXECUTEPROCEDUREdelete_related_records();Bereitgestellt von
In diesem Beispiel wird ein Trigger eingerichtet, der automatisch alle mit einem Kunden verbundenen Bestellungen löscht, wenn dieser Kunde gelöscht wird.
4. INSTEAD OF Trigger Beispiel
INSTEAD OF-Trigger werden in der Regel mit Ansichten verwendet, um Aktionen anstelle der Standardoperation durchzuführen.
sql
CREATEFUNCTIONlog_view_update()RETURNSTRIGGERAS $$
BEGININSERTINTOaudit_log(table_name, operation)VALUES('view_name','UPDATE');RETURNNULL;END;
$$ LANGUAGE plpgsql;CREATETRIGGER log_view_updates
INSTEADOFUPDATEON my_view
FOREACHROWEXECUTEPROCEDURElog_view_update();Bereitgestellt von
Dieser Trigger protokolliert Versuche, eine Ansicht zu aktualisieren, anstatt die Aktualisierung durchzuführen.
Tipps und bewährte Praktiken
Lege die Auslösebedingungen klar fest. Stelle sicher, dass die Bedingungen, unter denen Auslöser ausgelöst werden, genau definiert sind, um unerwartetes Verhalten zu vermeiden.
Verwende Auslöser sparsam. Die übermäßige Verwendung von Triggern kann zu komplexen Abhängigkeiten führen und die Fehlersuche erschweren.
Dokumentiere die Auslöser gründlich. Dokumentiere klar und deutlich, was die einzelnen Auslöser bewirken und warum sie verwendet werden, damit du sie später nachschlagen kannst.
Teste gründlich. Teste die Trigger immer in einer Entwicklungsumgebung, um sicherzustellen, dass sie wie vorgesehen und ohne Leistungseinbußen funktionieren.
Berücksichtige die Auswirkungen auf die Leistung. Komplexe Trigger können sich auf die Leistung auswirken; überprüfe und optimiere sie, wenn nötig.
Verhindern Sie rekursive Aufrufe. Verwende Befehle wie `ALTER TABLE ... ENABLE TRIGGER ...`, um die Aktivierung des Triggers zu kontrollieren und mögliche rekursive Aufrufschleifen zu verhindern.
Trigger in PostgreSQL sind Datenbank-Callback-Funktionen, die automatisch ausgeführt oder ausgelöst werden, wenn ein bestimmtes Datenbankereignis eintritt, wie z.B. eine `INSERT`-, `UPDATE`-, `DELETE`- oder sogar `TRUNCATE`-Operation. Sie werden verwendet, um Geschäftsregeln durchzusetzen, Daten zu validieren und die Datenintegrität innerhalb der Datenbank zu wahren.
Verwendung
Trigger werden verwendet, um Aufgaben zu automatisieren, die beim Eintreten bestimmter Datenbankereignisse ausgeführt werden sollen, sodass weniger manuelle Eingriffe oder anwendungsseitige Logik erforderlich sind. Sie werden mit der Anweisung `CREATE TRIGGER` definiert, die das Ereignis und die zu ergreifende Aktion angibt.
In dieser Syntax definiert `CREATE TRIGGER` einen neuen Trigger mit dem Namen `Triggername`, der eine angegebene Funktion (`Funktionsname`) entweder vor, nach oder anstelle des angegebenen Ereignisses auf `Tabelle_name` ausführt. Die Klausel "FÜR JEDE ZEILE" gibt an, dass der Trigger einmal für jede vom Ereignis betroffene Zeile ausgeführt wird, während "FÜR JEDES STATEMENT" einmal pro auslösender Anweisung ausgeführt wird, unabhängig davon, wie viele Zeilen betroffen sind.
Beispiele
1. Basic Insert Trigger
In diesem Beispiel wird ein Trigger erstellt, der jede Einfügeoperation in der Tabelle "Mitarbeiter" in einer Tabelle "audit_log" protokolliert.
2. Auslöser mit Bedingung aktualisieren
Dieser Auslöser verhindert, dass die Gehälter der Beschäftigten sinken und stellt sicher, dass die Gehaltsaktualisierungen nur steigen oder gleich bleiben können. Hier stehen "NEU" und "ALT" für den neuen bzw. alten Zustand der Zeile, die bearbeitet wird.
3. Auslöser für Kaskadenlöschung
In diesem Beispiel wird ein Trigger eingerichtet, der automatisch alle mit einem Kunden verbundenen Bestellungen löscht, wenn dieser Kunde gelöscht wird.
4. INSTEAD OF Trigger Beispiel
INSTEAD OF-Trigger werden in der Regel mit Ansichten verwendet, um Aktionen anstelle der Standardoperation durchzuführen.
Dieser Trigger protokolliert Versuche, eine Ansicht zu aktualisieren, anstatt die Aktualisierung durchzuführen.
Tipps und bewährte Praktiken