Trigger in PostgreSQL sind spezielle Prozeduren, die automatisch ausgeführt oder ausgelöst werden, wenn bestimmte Ereignisse in einer Datenbanktabelle auftreten. Sie werden eingesetzt, um die Integrität der Daten zu wahren, Geschäftsregeln durchzusetzen und komplexe Prüfungen oder Transformationen zu automatisieren.
Verwendung
Trigger werden eingesetzt, um automatisch auf Ereignisse wie `INSERT`-, `UPDATE`- oder `DELETE`-Operationen in einer Tabelle zu reagieren. Sie können so eingestellt werden, dass sie `VOR`, `NACH` oder `NACH` dem Ereignis ausgeführt werden und können optional davon abhängig gemacht werden, ob das Ereignis erfolgreich ist. Trigger können auf Zeilenebene definiert werden, d.h. sie werden für jede betroffene Zeile ausgeführt, oder auf Anweisungsebene, d.h. sie werden einmal pro SQL-Anweisung ausgeführt.
CREATETRIGGER trigger_name
{BEFORE|AFTER|INSTEADOF}{INSERT|UPDATE|DELETE}ON table_name
FOREACH{ROW|STATEMENT}EXECUTEFUNCTIONfunction_name();Bereitgestellt von
In dieser Syntax definiert `CREATE TRIGGER` einen neuen Trigger mit dem Namen `trigger_name`, der eine bestimmte Funktion `function_name` entweder vor, nach oder anstelle eines datenverändernden Ereignisses auf `table_name` aufruft.
Trigger interagieren mit Transaktionssteuerungsbefehlen wie `COMMIT` und `ROLLBACK`. Wenn ein Trigger einen Fehler verursacht, wird in der Regel die gesamte Transaktion zurückgerollt, es sei denn, sie wird explizit behandelt.
Beispiele
1. Grundlegender Auslöser für Auditing
CREATETABLEaudit_log(
id SERIALPRIMARYKEY,
operation VARCHAR(10),
operation_time TIMESTAMPDEFAULTCURRENT_TIMESTAMP);CREATEORREPLACEFUNCTIONlog_insert()RETURNSTRIGGERAS $$
BEGININSERTINTOaudit_log(operation)VALUES('INSERT');RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER insert_audit
AFTERINSERTON target_table
FOREACHROWEXECUTEFUNCTIONlog_insert();Bereitgestellt von
Dieses einfache Beispiel protokolliert jede `INSERT`-Operation auf `target_table` in der Tabelle `audit_log`.
2. Auslösen mit bedingter Logik
CREATEORREPLACEFUNCTIONcheck_salary()RETURNSTRIGGERAS $$
BEGINIFNEW.salary <OLD.salary THENRAISEEXCEPTION'Salary cannot be decreased!';ENDIF;RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER salary_check
BEFOREUPDATEON employees
FOREACHROWEXECUTEFUNCTIONcheck_salary();Bereitgestellt von
Dieser Auslöser stellt sicher, dass das Gehalt eines Mitarbeiters während eines Aktualisierungsvorgangs nicht verringert werden kann.
3. Kaskadenauslöser
CREATEORREPLACEFUNCTIONdelete_cascade()RETURNSTRIGGERAS $$
BEGINDELETEFROM orders WHERE customer_id =OLD.id;RETURNOLD;END;
$$ LANGUAGE plpgsql;CREATETRIGGER cascade_delete
AFTERDELETEON customers
FOREACHROWEXECUTEFUNCTIONdelete_cascade();Bereitgestellt von
In diesem Beispiel werden alle mit einem Kunden verbundenen Bestellungen automatisch gelöscht, wenn der Kunde entfernt wird.
Auslöser verwalten
Um einen Trigger zu deaktivieren oder fallen zu lassen, wenn er nicht mehr benötigt wird, kannst du die folgenden Befehle verwenden:
ALTERTABLE table_name DISABLETRIGGER trigger_name;DROPTRIGGER trigger_name ON table_name;Bereitgestellt von
Um vorhandene Trigger in einer Datenbank zu sehen, kannst du den Systemkatalog `pg_trigger` abfragen.
Tipps und bewährte Praktiken
Halte die Auslöser einfach. Komplexe Logik kann zu Leistungsengpässen und Wartungsproblemen führen.
Teste gründlich. Stelle sicher, dass deine Auslöser wie erwartet funktionieren, indem du sie in verschiedenen Szenarien testest.
Dokumentauslöser. Dokumentiere klar den Zweck und die Funktionsweise jedes Triggers, um zukünftigen Entwicklern zu helfen.
Berücksichtige Erlaubnisse. Stelle sicher, dass die Benutzer, die die Ereignisse auslösen, die entsprechenden Berechtigungen haben, um die zugehörigen Funktionen auszuführen.
Überwache die Auswirkungen auf die Leistung. Sei dir darüber im Klaren, dass die umfangreiche Verwendung von Triggern die Leistung beeinträchtigen kann, insbesondere bei Tabellen mit vielen Transaktionen.
Vermeide rekursive Auslöser. Rekursive Auslöser können zu Endlosschleifen führen und sollten mit Vorsicht behandelt werden.
Trigger in PostgreSQL sind spezielle Prozeduren, die automatisch ausgeführt oder ausgelöst werden, wenn bestimmte Ereignisse in einer Datenbanktabelle auftreten. Sie werden eingesetzt, um die Integrität der Daten zu wahren, Geschäftsregeln durchzusetzen und komplexe Prüfungen oder Transformationen zu automatisieren.
Verwendung
Trigger werden eingesetzt, um automatisch auf Ereignisse wie `INSERT`-, `UPDATE`- oder `DELETE`-Operationen in einer Tabelle zu reagieren. Sie können so eingestellt werden, dass sie `VOR`, `NACH` oder `NACH` dem Ereignis ausgeführt werden und können optional davon abhängig gemacht werden, ob das Ereignis erfolgreich ist. Trigger können auf Zeilenebene definiert werden, d.h. sie werden für jede betroffene Zeile ausgeführt, oder auf Anweisungsebene, d.h. sie werden einmal pro SQL-Anweisung ausgeführt.
In dieser Syntax definiert `CREATE TRIGGER` einen neuen Trigger mit dem Namen `trigger_name`, der eine bestimmte Funktion `function_name` entweder vor, nach oder anstelle eines datenverändernden Ereignisses auf `table_name` aufruft.
Trigger interagieren mit Transaktionssteuerungsbefehlen wie `COMMIT` und `ROLLBACK`. Wenn ein Trigger einen Fehler verursacht, wird in der Regel die gesamte Transaktion zurückgerollt, es sei denn, sie wird explizit behandelt.
Beispiele
1. Grundlegender Auslöser für Auditing
Dieses einfache Beispiel protokolliert jede `INSERT`-Operation auf `target_table` in der Tabelle `audit_log`.
2. Auslösen mit bedingter Logik
Dieser Auslöser stellt sicher, dass das Gehalt eines Mitarbeiters während eines Aktualisierungsvorgangs nicht verringert werden kann.
3. Kaskadenauslöser
In diesem Beispiel werden alle mit einem Kunden verbundenen Bestellungen automatisch gelöscht, wenn der Kunde entfernt wird.
Auslöser verwalten
Um einen Trigger zu deaktivieren oder fallen zu lassen, wenn er nicht mehr benötigt wird, kannst du die folgenden Befehle verwenden:
Um vorhandene Trigger in einer Datenbank zu sehen, kannst du den Systemkatalog `pg_trigger` abfragen.
Tipps und bewährte Praktiken