Trigger in PostgreSQL sind Datenbank-Callback-Funktionen, die automatisch ausgeführt werden, wenn ein bestimmtes Datenbankereignis eintritt, wie z.B. eine `INSERT`-, `UPDATE`- oder `DELETE`-Operation. Sie werden eingesetzt, um Geschäftsregeln durchzusetzen, Eingabedaten zu validieren und die Datenintegrität zu gewährleisten.
Verwendung
Trigger automatisieren Aufgaben und setzen Regeln auf Datenbankebene durch, um sicherzustellen, dass bestimmte Vorgänge als Reaktion auf Änderungen in den Daten erfolgen. Sie bestehen aus einem Auslöseereignis, einem Timing und der dazugehörigen Funktion, die ausgeführt werden soll.
CREATETRIGGER trigger_name
{BEFORE|AFTER|INSTEADOF}{INSERT|UPDATE|DELETE}ON table_name
FOREACHROWEXECUTEFUNCTIONfunction_name();Bereitgestellt von
In dieser Syntax definiert `CREATE TRIGGER` einen neuen Trigger und gibt an, wann er ausgelöst werden soll (`BEFORE`, `AFTER` oder `INSTEAD OF` eines Ereignisses) und welche Funktion er ausführen soll. BEFORE"-Trigger werden in der Regel verwendet, um Daten zu ändern, bevor sie in die Datenbank geschrieben werden, `AFTER"-Trigger werden für Aktionen verwendet, die nach der Übertragung der Daten erfolgen sollen, und `INSTEAD OF"-Trigger werden häufig für Views verwendet, um die erforderlichen Änderungen an den zugrunde liegenden Tabellen vorzunehmen.
FOR EACH ROW gibt an, dass die Triggerfunktion für jede Zeile, die von dem auslösenden Ereignis betroffen ist, einmal ausgeführt wird. Im Gegensatz dazu kann FOR EACH STATEMENT verwendet werden, um die Triggerfunktion einmal pro SQL-Anweisung auszuführen, unabhängig von der Anzahl der betroffenen Zeilen.
NEW und OLD sind spezielle Datensatzvariablen innerhalb von Triggern: NEW enthält die neuen Zeilendaten für die Operationen INSERT oder UPDATE und OLD enthält die bestehenden Zeilendaten für die Operationen UPDATE oder DELETE.
Beispiele
1. Basic Insert Trigger
CREATEFUNCTIONlog_insert()RETURNSTRIGGERAS $$
BEGIN-- Log every insert operation into log_table
INSERTINTOlog_table(action, timestamp)VALUES('Insert',now());RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER before_insert
BEFOREINSERTON main_table
FOREACHROWEXECUTEFUNCTIONlog_insert();Bereitgestellt von
In diesem Beispiel wird ein Trigger erstellt, der jede Einfügeoperation in der "main_table" in einer "log_table" protokolliert.
2. Auslöser mit Bedingung aktualisieren
CREATEFUNCTIONupdate_timestamp()RETURNSTRIGGERAS $$
BEGIN-- Update the updated_at timestamp field when a row is modified
NEW.updated_at :=now();RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER update_time
BEFOREUPDATEON main_table
FOREACHROWWHEN(OLD.*ISDISTINCTFROMNEW.*)EXECUTEFUNCTIONupdate_timestamp();Bereitgestellt von
Dieser Trigger aktualisiert das Zeitstempelfeld `updated_at` in `main_table`, wenn eine Zeile geändert wird.
3. Komplexer Auslöser für Auditing
CREATEFUNCTIONaudit_changes()RETURNSTRIGGERAS $$
BEGINIF(TG_OP='DELETE')THEN-- Log DELETE operations into audit_log
INSERTINTOaudit_log(action, old_data, timestamp)VALUES('DELETE',OLD,now());ELSIF(TG_OP='UPDATE')THEN-- Log UPDATE operations with both old and newdataINSERTINTOaudit_log(action, old_data, new_data, timestamp)VALUES('UPDATE',OLD,NEW,now());ENDIF;RETURNNULL;END;
$$ LANGUAGE plpgsql;CREATETRIGGER audit_trigger
AFTERINSERTORUPDATEORDELETEON main_table
FOREACHROWEXECUTEFUNCTIONaudit_changes();Bereitgestellt von
Dieser Trigger protokolliert Änderungen an `main_table` in einem `audit_log`. Dabei werden sowohl die alten als auch die neuen Daten für `UPDATE`-Operationen erfasst.
Tipps und bewährte Praktiken
Optimiere für die Leistung. Trigger können den Datenbankbetrieb unnötig belasten, daher solltest du sicherstellen, dass sie effizient sind.
Verwende Auslöser sparsam. Vermeide die übermäßige Verwendung von Triggern, um Komplexität und mögliche Leistungsprobleme zu vermeiden.
Achte auf Atomarität. Achte darauf, dass die Triggerfunktionen atomar sind und Ausnahmen behandeln, um die Datenintegrität zu wahren.
Teste gründlich. Teste die Trigger gründlich in einer Entwicklungsumgebung, bevor du sie in der Produktion einsetzt, um unbeabsichtigte Nebeneffekte zu vermeiden.
Ziehe Alternativen in Betracht. Prüfe, ob Stored Procedures oder Anwendungslogik für bestimmte Vorgänge besser geeignet sind, um Klarheit und Wartbarkeit zu gewährleisten.
Trigger in PostgreSQL sind Datenbank-Callback-Funktionen, die automatisch ausgeführt werden, wenn ein bestimmtes Datenbankereignis eintritt, wie z.B. eine `INSERT`-, `UPDATE`- oder `DELETE`-Operation. Sie werden eingesetzt, um Geschäftsregeln durchzusetzen, Eingabedaten zu validieren und die Datenintegrität zu gewährleisten.
Verwendung
Trigger automatisieren Aufgaben und setzen Regeln auf Datenbankebene durch, um sicherzustellen, dass bestimmte Vorgänge als Reaktion auf Änderungen in den Daten erfolgen. Sie bestehen aus einem Auslöseereignis, einem Timing und der dazugehörigen Funktion, die ausgeführt werden soll.
In dieser Syntax definiert `CREATE TRIGGER` einen neuen Trigger und gibt an, wann er ausgelöst werden soll (`BEFORE`, `AFTER` oder `INSTEAD OF` eines Ereignisses) und welche Funktion er ausführen soll. BEFORE"-Trigger werden in der Regel verwendet, um Daten zu ändern, bevor sie in die Datenbank geschrieben werden, `AFTER"-Trigger werden für Aktionen verwendet, die nach der Übertragung der Daten erfolgen sollen, und `INSTEAD OF"-Trigger werden häufig für Views verwendet, um die erforderlichen Änderungen an den zugrunde liegenden Tabellen vorzunehmen.
FOR EACH ROWgibt an, dass die Triggerfunktion für jede Zeile, die von dem auslösenden Ereignis betroffen ist, einmal ausgeführt wird. Im Gegensatz dazu kannFOR EACH STATEMENTverwendet werden, um die Triggerfunktion einmal pro SQL-Anweisung auszuführen, unabhängig von der Anzahl der betroffenen Zeilen.NEWundOLDsind spezielle Datensatzvariablen innerhalb von Triggern:NEWenthält die neuen Zeilendaten für die OperationenINSERToderUPDATEundOLDenthält die bestehenden Zeilendaten für die OperationenUPDATEoderDELETE.Beispiele
1. Basic Insert Trigger
In diesem Beispiel wird ein Trigger erstellt, der jede Einfügeoperation in der "main_table" in einer "log_table" protokolliert.
2. Auslöser mit Bedingung aktualisieren
Dieser Trigger aktualisiert das Zeitstempelfeld `updated_at` in `main_table`, wenn eine Zeile geändert wird.
3. Komplexer Auslöser für Auditing
Dieser Trigger protokolliert Änderungen an `main_table` in einem `audit_log`. Dabei werden sowohl die alten als auch die neuen Daten für `UPDATE`-Operationen erfasst.
Tipps und bewährte Praktiken