CodeGym /Kurse /SQL SELF /Erstellen eines einfachen Triggers zum Aktualisieren von ...

Erstellen eines einfachen Triggers zum Aktualisieren von Daten: AFTER INSERT

SQL SELF
Level 57 , Lektion 3
Verfügbar

Stell dir vor, wir haben eine Tabelle, in der Daten über Studierende gespeichert werden. In dieser Tabelle müssen wir das Feld last_modified (Datum der letzten Änderung des Eintrags) jedes Mal automatisch aktualisieren, wenn ein neuer Student hinzugefügt wird. Dieses Feld ist wichtig, um Änderungen zu verfolgen und die Daten zu verwalten.

Das Szenario läuft so ab:

  1. Wenn ein neuer Eintrag in die Tabelle eingefügt wird, bekommt das Feld last_modified automatisch das aktuelle Datum und die aktuelle Uhrzeit.
  2. Wir nutzen einen AFTER INSERT Trigger, der nach dem erfolgreichen Einfügen der Daten ausgelöst wird.

Erstellen der Funktion für den Trigger

Zuerst müssen wir eine Funktion in PL/pgSQL schreiben. Diese Funktion wird das Feld last_modified in unserer Tabelle aktualisieren. Die Funktion ist ein Muss für den Trigger, weil der Trigger selbst nur sagt, was gemacht werden soll, aber die ganze Logik steckt in der Funktion.

Also, fangen wir mit dem Erstellen der Tabelle an:

-- Tabelle students erstellen
CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    age INT NOT NULL,
    last_modified TIMESTAMP
);

Jetzt erstellen wir die Funktion, die das Feld last_modified aktualisiert:

-- Funktion zum Aktualisieren von last_modified
CREATE OR REPLACE FUNCTION update_last_modified()
RETURNS TRIGGER AS $$
BEGIN
    -- Setze die aktuelle Zeit ins Feld last_modified
    NEW.last_modified := NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Schauen wir uns an, was diese Funktion macht:

  • CREATE OR REPLACE FUNCTION update_last_modified() — wir erstellen eine Funktion mit dem Namen update_last_modified. Falls es die Funktion schon gibt, wird sie ersetzt.
  • RETURNS TRIGGER — wir geben an, dass die Funktion für einen Trigger gedacht ist.
  • NEW.last_modified := NOW(); — wir aktualisieren das Feld last_modified mit der Funktion NOW(), die das aktuelle Datum und die aktuelle Uhrzeit zurückgibt.
  • RETURN NEW; — wir geben den aktualisierten Datensatz zurück. Das ist ein Muss für einen AFTER Trigger.

Trigger erstellen

Nachdem die Funktion steht, können wir den Trigger selbst erstellen und ihn mit der Tabelle students verbinden. So geht das:

-- Trigger nach dem Einfügen eines Eintrags erstellen
CREATE TRIGGER set_last_modified
AFTER INSERT ON students
FOR EACH ROW
EXECUTE FUNCTION update_last_modified();

Was passiert hier:

  • CREATE TRIGGER set_last_modified — wir erstellen einen Trigger mit dem Namen set_last_modified.
  • AFTER INSERT — der Trigger wird nach dem erfolgreichen Einfügen einer Zeile in die Tabelle ausgelöst.
  • ON students — der Trigger ist an die Tabelle students gebunden.
  • FOR EACH ROW — der Trigger wird für jede neue Zeile ausgeführt, die in die Tabelle eingefügt wird.
  • EXECUTE FUNCTION update_last_modified(); — Aufruf der Funktion, die wir vorher erstellt haben.

Hinweis: Der Name des Triggers (set_last_modified) und der Funktion (update_last_modified) ist frei wählbar, aber es ist sinnvoll, sich an Namenskonventionen zu halten, damit der Code verständlich bleibt.

Trigger testen

Testen wir, wie unser Trigger funktioniert. Zuerst fügen wir ein paar Einträge in die Tabelle students ein:

-- Daten in die Tabelle einfügen
INSERT INTO students (name, age) VALUES ('Ivan Ivanov', 20);
INSERT INTO students (name, age) VALUES ('Anna Petrova', 22);

Jetzt schauen wir uns an, was in der Tabelle steht:

-- Daten in der Tabelle anzeigen
SELECT * FROM students;

Das erwartete Ergebnis könnte ungefähr so aussehen:

id name age last_modified
1 Otto Min 20 2023-10-10 14:30:45
2 Anna Song 22 2023-10-10 14:31:12

Du siehst, dass das Feld last_modified für jeden Eintrag automatisch mit dem aktuellen Datum und der aktuellen Uhrzeit gefüllt wurde.

Fehler, die auftreten können

  1. Fehler: "relation does not exist" beim Erstellen des Triggers. Dieser Fehler tritt auf, wenn die Tabelle students nicht existiert. Stell sicher, dass du die Tabelle vor dem Trigger erstellt hast.
  2. Zugriffsfehler. Wenn der Datenbank-User keine Rechte zum Erstellen von Funktionen oder Triggern hat, wird der Trigger nicht erstellt. Prüfe die Rechte des Users.
  3. Fehlender Funktionsaufruf im Trigger. Wenn du vergisst, EXECUTE FUNCTION update_last_modified() anzugeben, kann der Trigger die gewünschte Aktion nicht ausführen.

Trigger verbessern: Bedingungen hinzufügen

In echten Projekten ist es manchmal sinnvoll, die Ausführung des Triggers an Bedingungen zu knüpfen. Zum Beispiel: Wenn das Feld age kleiner als 18 ist, wollen wir last_modified nicht aktualisieren. Das geht mit der WHEN-Bedingung:

-- Trigger mit Bedingung erstellen
CREATE TRIGGER set_last_modified
AFTER INSERT ON students
FOR EACH ROW
WHEN (NEW.age >= 18)
EXECUTE FUNCTION update_last_modified();

Jetzt wird das Feld last_modified nur für Studierende aktualisiert, deren Alter >= 18 ist.

Praktische Anwendung

Solche Trigger werden oft in echten Projekten eingesetzt. Hier ein paar Beispiele:

  • Automatisches Aktualisieren des Zeitpunkts der letzten Änderung eines Eintrags (wie wir es gemacht haben).
  • Überwachen von Änderungen in der Datenbank und das Schreiben dieser Änderungen in eine Log-Tabelle.
  • Sicherstellen der Datenintegrität, zum Beispiel das Prüfen von verknüpften Tabellen vor einer Operation.
  • Daten-Audit für rechtliche oder unternehmensinterne Vorgaben.

Diese Skills sind besonders nützlich, wenn du mit Systemen arbeitest, bei denen Genauigkeit und Zuverlässigkeit der Daten wichtig sind, zum Beispiel in Banksystemen, Lagerverwaltung oder CRM.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION