PostgreSQL-Trigger auf Anweisungsebene
Trigger in PostgreSQL sind spezielle Prozeduren, die automatisch ausgeführt oder abgefeuert werden, wenn bestimmte Ereignisse in einer Datenbanktabelle auftreten. Trigger auf Anweisungsebene werden einmal pro SQL-Anweisung ausgeführt, unabhängig von der Anzahl der Zeilen, die von der Anweisung betroffen sind.
Verwendung
Trigger auf Anweisungsebene werden verwendet, um Geschäftsregeln durchzusetzen, Eingaben zu überprüfen oder Prüfprotokolle zu führen, wenn eine Anweisung eine beliebige Anzahl von Zeilen betrifft. Sie sind so definiert, dass sie vor oder nach den Operationen `INSERT`, `UPDATE` oder `DELETE` in einer Tabelle wirken.
sql
CREATE TRIGGER trigger_name
{ BEFORE | AFTER } { INSERT | UPDATE | DELETE }
ON table_name
FOR EACH STATEMENT
EXECUTE PROCEDURE function_name();
In dieser Syntax gibt `FOR EACH STATEMENT` an, dass der Trigger einmal pro Anweisung ausgelöst werden soll, und `EXECUTE PROCEDURE` definiert die Funktion, die aufgerufen werden soll. Beachte, dass Trigger auf Anweisungsebene keinen Zugriff auf die Zeilenwerte `OLD` und `NEW` haben, da sie nicht zeilenspezifisch sind.
Beispiele
1. Grundlegender Auslöser auf Anweisungsebene
sql
-- This function logs an entry into audit_log whenever an INSERT, UPDATE, or DELETE operation is performed on the employees table.
CREATE FUNCTION log_total_changes() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_log(event_type, event_time)
VALUES (TG_OP, now());
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER audit_changes
AFTER INSERT OR UPDATE OR DELETE
ON employees
FOR EACH STATEMENT
EXECUTE PROCEDURE log_total_changes();
2. Auslöser für Einfügevorgänge
sql
-- This function logs every INSERT operation on the employees table into the insert_log table with the current timestamp.
CREATE FUNCTION log_inserts() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO insert_log(table_name, insert_time)
VALUES (TG_TABLE_NAME, now());
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER log_employee_inserts
AFTER INSERT
ON employees
FOR EACH STATEMENT
EXECUTE PROCEDURE log_inserts();
3. Bedingte Trigger-Ausführung
sql
-- This function conditionally calls a notification function only when a DELETE operation is performed on the orders table.
CREATE FUNCTION notify_admin() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
PERFORM notify_admin_function();
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER admin_notification
AFTER DELETE
ON orders
FOR EACH STATEMENT
EXECUTE PROCEDURE notify_admin();
In diesen Beispielen bezieht sich `TG_OP` auf die Art der Operation (`INSERT`, `UPDATE` oder `DELETE`) und `TG_TABLE_NAME` auf den Namen der Tabelle, für die der Trigger definiert ist.
Tipps und bewährte Praktiken
- Begrenze die Komplexität der Auslöser. Halte die Triggerlogik einfach, um unbeabsichtigte Nebeneffekte zu vermeiden und die Leistung zu erhalten.
- Verwende Auslöser sparsam. Eine übermäßige Nutzung kann zu Wartungsproblemen führen und die Fehlersuche erschweren.
- Dokumentiere die Auslöser klar und deutlich. Dokumentiere immer den Zweck und die Funktion von Triggern in deiner Datenbank.
- Teste gründlich. Stelle sicher, dass die Auslöser gründlich getestet werden, um ihr Verhalten in verschiedenen Szenarien zu überprüfen.
- Berücksichtige die Auswirkungen auf die Leistung. Sei dir bewusst, dass Trigger die Leistung beeinträchtigen können, besonders in Umgebungen mit vielen Transaktionen.
- Erwäge die Verwendung von Triggern auf Zeilenebene für zeilenspezifische Logik. Trigger auf Anweisungsebene sind nicht für zeilenspezifische Vorgänge geeignet, daher solltest du bei Bedarf Trigger auf Zeilenebene verwenden.
- Verstehe die Unterschiede zwischen den Auslösern. Trigger auf Anweisungsebene werden einmal pro Anweisung ohne zeilenspezifischen Zugriff ausgeführt, während Trigger auf Zeilenebene für jede betroffene Zeile ausgeführt werden und auf die Werte der "alten" und "neuen" Zeile zugreifen können.