Trigger in PostgreSQL sind Prozeduren, die als Reaktion auf bestimmte Ereignisse in einer bestimmten Tabelle oder Ansicht automatisch ausgeführt werden. Trigger auf Zeilenebene werden speziell für jede Zeile ausgeführt, die von einem Ereignis wie `INSERT`, `UPDATE` oder `DELETE` betroffen ist.
Verwendung
Trigger auf Zeilenebene werden verwendet, um Geschäftsregeln durchzusetzen, Daten zu validieren oder eine benutzerdefinierte Protokollierung auf Zeilenebene durchzuführen. Sie sind so definiert, dass sie bestimmte Aktionen ausführen, wenn eine Zeile auf eine bestimmte Weise geändert wird.
sql
CREATETRIGGER trigger_name
AFTER|BEFOREINSERT|UPDATE|DELETEON table_name
FOREACHROWEXECUTEFUNCTIONfunction_name();Bereitgestellt von
In dieser Syntax gibt `FOR EACH ROW` an, dass der Trigger für jede betroffene Zeile ausgelöst wird, und `EXECUTE FUNCTION` ruft die Funktion auf, die die auszuführende Logik enthält.
Beispiele
1. Basic Insert Trigger
sql
CREATEORREPLACEFUNCTIONlog_new_inserts()RETURNSTRIGGERAS $$
BEGININSERTINTOaudit_log(table_name, operation, timestamp)VALUES(TG_TABLE_NAME,'INSERT',now());RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER log_insert
AFTERINSERTON employees
FOREACHROWEXECUTEFUNCTIONlog_new_inserts();Bereitgestellt von
In diesem Beispiel wird ein Trigger erstellt, der jede neue `INSERT`-Operation in der Tabelle `Mitarbeiter` in einer `audit_log`-Tabelle protokolliert.
2. Auslöser mit Bedingung aktualisieren
sql
CREATEORREPLACEFUNCTIONcheck_salary_update()RETURNSTRIGGERAS $$
BEGINIFNEW.salary <OLD.salary THENRAISEEXCEPTION'Salary cannot be decreased!';ENDIF;RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER salary_check
BEFOREUPDATEON employees
FOREACHROWEXECUTEFUNCTIONcheck_salary_update();Bereitgestellt von
Hier verhindert ein Auslöser Gehaltskürzungen, indem er eine Ausnahme auslöst, wenn das neue Gehalt während eines `UPDATE` niedriger ist als das alte.
3. Auslöser mit Protokollierung löschen
sql
CREATEORREPLACEFUNCTIONlog_delete()RETURNSTRIGGERAS $$
BEGININSERTINTOdelete_log(table_name, deleted_row_id, timestamp)VALUES(TG_TABLE_NAME,OLD.id,now());RETURNOLD;END;
$$ LANGUAGE plpgsql;CREATETRIGGER log_delete
AFTERDELETEON orders
FOREACHROWEXECUTEFUNCTIONlog_delete();Bereitgestellt von
In diesem Beispiel werden die Details der gelöschten Zeilen aus der Tabelle "Bestellungen" zu Prüfzwecken in einem "delete_log" protokolliert. Er geht davon aus, dass `OLD.id` dem Primärschlüssel oder einem eindeutigen Bezeichner der Zeile entspricht.
Tipps und bewährte Praktiken
Setze die Auslöser mit Bedacht ein. Die übermäßige Verwendung von Triggern kann zu komplexen und schwer zu debuggenden Systemen führen.
Achte auf Atomarität. Die Triggerfunktion sollte atomar und idempotent sein, um die Datenintegrität zu wahren.
Berücksichtige die Auswirkungen auf die Leistung. Trigger verursachen zusätzlichen Overhead und werden synchron mit der auslösenden Operation ausgeführt; stelle sicher, dass sie für die Leistung optimiert sind, damit sie die Datenbankoperationen nicht verlangsamen.
Teste die Auslöser gründlich. Sorge für umfassende Tests, um sicherzustellen, dass sich die Auslöser in allen Szenarien korrekt verhalten.
Dokumentiere die Auslöselogik. Dokumentiere den Zweck und die Logik jedes Auslösers klar und deutlich, damit du ihn später nachschlagen und pflegen kannst.
Zusätzliche Informationen
Besondere Variablen: PostgreSQL-Trigger verwenden spezielle Variablen wie `TG_TABLE_NAME`, `NEW` und `OLD`, um Kontext bereitzustellen. TG_TABLE_NAME" bezieht sich auf den Namen der Tabelle, mit der der Trigger verknüpft ist, "NEW" enthält die neuen Zeilendaten für "INSERT"- oder "UPDATE"-Operationen und "OLD" enthält die vorhandenen Zeilendaten für "UPDATE"- oder "DELETE"-Operationen.
Trigger in PostgreSQL sind Prozeduren, die als Reaktion auf bestimmte Ereignisse in einer bestimmten Tabelle oder Ansicht automatisch ausgeführt werden. Trigger auf Zeilenebene werden speziell für jede Zeile ausgeführt, die von einem Ereignis wie `INSERT`, `UPDATE` oder `DELETE` betroffen ist.
Verwendung
Trigger auf Zeilenebene werden verwendet, um Geschäftsregeln durchzusetzen, Daten zu validieren oder eine benutzerdefinierte Protokollierung auf Zeilenebene durchzuführen. Sie sind so definiert, dass sie bestimmte Aktionen ausführen, wenn eine Zeile auf eine bestimmte Weise geändert wird.
In dieser Syntax gibt `FOR EACH ROW` an, dass der Trigger für jede betroffene Zeile ausgelöst wird, und `EXECUTE FUNCTION` ruft die Funktion auf, die die auszuführende Logik enthält.
Beispiele
1. Basic Insert Trigger
In diesem Beispiel wird ein Trigger erstellt, der jede neue `INSERT`-Operation in der Tabelle `Mitarbeiter` in einer `audit_log`-Tabelle protokolliert.
2. Auslöser mit Bedingung aktualisieren
Hier verhindert ein Auslöser Gehaltskürzungen, indem er eine Ausnahme auslöst, wenn das neue Gehalt während eines `UPDATE` niedriger ist als das alte.
3. Auslöser mit Protokollierung löschen
In diesem Beispiel werden die Details der gelöschten Zeilen aus der Tabelle "Bestellungen" zu Prüfzwecken in einem "delete_log" protokolliert. Er geht davon aus, dass `OLD.id` dem Primärschlüssel oder einem eindeutigen Bezeichner der Zeile entspricht.
Tipps und bewährte Praktiken
Zusätzliche Informationen
Besondere Variablen: PostgreSQL-Trigger verwenden spezielle Variablen wie `TG_TABLE_NAME`, `NEW` und `OLD`, um Kontext bereitzustellen. TG_TABLE_NAME" bezieht sich auf den Namen der Tabelle, mit der der Trigger verknüpft ist, "NEW" enthält die neuen Zeilendaten für "INSERT"- oder "UPDATE"-Operationen und "OLD" enthält die vorhandenen Zeilendaten für "UPDATE"- oder "DELETE"-Operationen.