Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Trigger | Einige Zusätzliche Themen
SQL-Optimierung und Abfragefunktionen

Trigger

Swipe um das Menü anzuzeigen

Trigger in Datenbanken sind spezielle Arten von gespeicherten Prozeduren, die automatisch ausgeführt oder ausgelöst werden, wenn bestimmte Ereignisse oder Aktionen in der Datenbank auftreten.
Diese Ereignisse können das Einfügen, Aktualisieren oder Löschen von Daten in Tabellen sowie Änderungen an Datenbankschema-Objekten wie Tabellen oder Sichten umfassen.

DML-Trigger

Ein DML-Trigger (Data Manipulation Language Trigger) ist ein Datenbankobjekt, das automatisch eine festgelegte Aktion ausführt, wenn ein bestimmtes Ereignis auf einer Tabelle oder Sicht eintritt.
DML-Trigger werden häufig verwendet, um Geschäftsregeln durchzusetzen, die Datenintegrität zu wahren oder Prüfaufgaben durchzuführen.

DML-Trigger-Typen

  • After Trigger: Diese Trigger werden nach der auslösenden Aktion (Einfügen, Aktualisieren, Löschen) auf der Tabelle ausgeführt;
  • Before Trigger: Diese Trigger werden vor der auslösenden Aktion ausgeführt. Sie ermöglichen es, die ursprüngliche Aktion abzufangen und benutzerdefinierte Logik auszuführen, bevor entschieden wird, ob die ursprüngliche Aktion fortgesetzt werden soll.

Beispiel für einen After Trigger

Wir haben zuvor ein Beispiel betrachtet, bei dem eine Transaktion verwendet wurde, um Werte sowohl in die Tabelle BankAccounts als auch in die Tabelle UserLogs als eine logische Einheit einzufügen.
Nun können wir dies anstelle einer Transaktion erreichen, indem wir einen AFTER-Trigger für die INSERT-Operation in der Tabelle BankAccounts erstellen.
Dadurch können wir nur neue Konten einfügen, und der entsprechende Log-Eintrag wird automatisch durch den Trigger hinzugefügt.

12345678910111213141516
-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
Abfragebeschreibung
expand arrow
  • After-Insert-Trigger für user_logs erstellen:

    • Eine Funktion mit dem Namen afterinserttriggerfunction() erstellen.
    • Die Funktion ist so definiert, dass sie einen Trigger zurückgibt.
    • Der Funktionskörper beginnt mit einem BEGIN-Block.
    • Innerhalb des BEGIN-Blocks wird eine Aktion ausgeführt, nämlich das Einfügen eines Datensatzes in die Tabelle userlogs.
    • Der eingefügte Datensatz enthält Werte aus der NEW-Zeile des auslösenden Ereignisses.
    • Die eingefügten Werte umfassen accountnumber und einen zusammengefügten String, der die Aktion beschreibt.
    • Die Funktion gibt die NEW-Zeile zurück.
    • Die Funktion ist in der Sprache plpgsql geschrieben.
  • Den Trigger an die Tabelle bankaccounts anhängen:

    • Ein Trigger mit dem Namen afterinserttrigger wird erstellt.
    • Der Trigger wird so konfiguriert, dass er nach einer INSERT-Operation auf der Tabelle bankaccounts ausgeführt wird.
    • Der Trigger ist so eingestellt, dass er die Funktion afterinserttriggerfunction für jede betroffene Zeile ausführt.
Note
Hinweis

In PostgreSQL-Triggern ist NEW eine spezielle Datensatzvariable, die die neu in die Tabelle eingefügte oder aktualisierte Zeile repräsentiert. Sie ermöglicht den Zugriff auf die Werte der Spalten in der neuen Zeile innerhalb der Triggerfunktion.
Wenn mit gelöschten Zeilen gearbeitet wird, muss stattdessen die Datensatzvariable OLD anstelle von NEW verwendet werden.

Beispiel für einen Before-Trigger

Angenommen, wir möchten verhindern, dass Werte mit einem negativen Kontostand hinzugefügt werden. Wir können einen BEFORE-Trigger dafür erstellen. Dieser Trigger prüft den Kontostand vor der Operation, und wenn dieser negativ ist, wird die Operation nicht ausgeführt.

12345678910111213141516171819202122232425
-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
Abfragebeschreibung
expand arrow
  • Erstellen der Trigger-Funktion:

    • Erstellen oder ersetzen einer Funktion mit dem Namen before_insert_userlogs().
    • Die Funktion ist so definiert, dass sie einen Trigger zurückgibt.
    • Der Funktionskörper beginnt mit einem BEGIN-Block.
    • Innerhalb des BEGIN-Blocks prüft eine Bedingung, ob das Kontoguthaben kleiner als 0 ist.
    • Ist das Guthaben kleiner als 0, wird eine Notiz ausgegeben und keine Aktion protokolliert. Die Funktion gibt NULL zurück, um das Einfügen zu verhindern.
    • Ist das Guthaben größer oder gleich 0, wird eine Notiz ausgegeben, dass die Aktion protokolliert wird.
    • Die Funktion fügt dann einen Datensatz in die Tabelle userlogs ein, der Werte aus der NEW-Zeile enthält.
    • Die eingefügten Werte umfassen accountnumber und einen zusammengefügten String, der die Aktion angibt.
    • Die Funktion gibt NEW zurück, um das Einfügen zu ermöglichen.
    • Die Funktion ist in der Sprache plpgsql geschrieben.
  • Erstellen des Triggers:

    • Ein Trigger mit dem Namen before_insert_userlogs_trigger wird erstellt.
    • Der Trigger wird so eingestellt, dass er vor einer INSERT-Operation auf der Tabelle bankaccounts ausgeführt wird.
    • Der Trigger ist so eingestellt, dass er die Funktion before_insert_userlogs() für jede betroffene Zeile ausführt.

Trigger-Erstellungsmuster

Typisches Muster zur Erstellung von Triggern: Zunächst wird eine Funktion definiert, die spezifische Logik vor oder nach einer Operation ausführt. Anschließend wird diese Funktion als Trigger einer bestimmten Tabelle und Aktion zugeordnet.

Beachte, dass in der Anweisung:

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

kann anstelle der UPDATE-Operation auch DELETE oder INSERT verwendet werden.
Aber beachte, dass keine SELECT-Trigger erstellt werden können, da die SELECT-Anweisung keine Zeilen in der Tabelle verändert!

question mark

Was ist der Hauptzweck der Verwendung von Triggern in einer Datenbank?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 3. Kapitel 1

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Trigger

Trigger in Datenbanken sind spezielle Arten von gespeicherten Prozeduren, die automatisch ausgeführt oder ausgelöst werden, wenn bestimmte Ereignisse oder Aktionen in der Datenbank auftreten.
Diese Ereignisse können das Einfügen, Aktualisieren oder Löschen von Daten in Tabellen sowie Änderungen an Datenbankschema-Objekten wie Tabellen oder Sichten umfassen.

DML-Trigger

Ein DML-Trigger (Data Manipulation Language Trigger) ist ein Datenbankobjekt, das automatisch eine festgelegte Aktion ausführt, wenn ein bestimmtes Ereignis auf einer Tabelle oder Sicht eintritt.
DML-Trigger werden häufig verwendet, um Geschäftsregeln durchzusetzen, die Datenintegrität zu wahren oder Prüfaufgaben durchzuführen.

DML-Trigger-Typen

  • After Trigger: Diese Trigger werden nach der auslösenden Aktion (Einfügen, Aktualisieren, Löschen) auf der Tabelle ausgeführt;
  • Before Trigger: Diese Trigger werden vor der auslösenden Aktion ausgeführt. Sie ermöglichen es, die ursprüngliche Aktion abzufangen und benutzerdefinierte Logik auszuführen, bevor entschieden wird, ob die ursprüngliche Aktion fortgesetzt werden soll.

Beispiel für einen After Trigger

Wir haben zuvor ein Beispiel betrachtet, bei dem eine Transaktion verwendet wurde, um Werte sowohl in die Tabelle BankAccounts als auch in die Tabelle UserLogs als eine logische Einheit einzufügen.
Nun können wir dies anstelle einer Transaktion erreichen, indem wir einen AFTER-Trigger für die INSERT-Operation in der Tabelle BankAccounts erstellen.
Dadurch können wir nur neue Konten einfügen, und der entsprechende Log-Eintrag wird automatisch durch den Trigger hinzugefügt.

12345678910111213141516
-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
Abfragebeschreibung
expand arrow
  • After-Insert-Trigger für user_logs erstellen:

    • Eine Funktion mit dem Namen afterinserttriggerfunction() erstellen.
    • Die Funktion ist so definiert, dass sie einen Trigger zurückgibt.
    • Der Funktionskörper beginnt mit einem BEGIN-Block.
    • Innerhalb des BEGIN-Blocks wird eine Aktion ausgeführt, nämlich das Einfügen eines Datensatzes in die Tabelle userlogs.
    • Der eingefügte Datensatz enthält Werte aus der NEW-Zeile des auslösenden Ereignisses.
    • Die eingefügten Werte umfassen accountnumber und einen zusammengefügten String, der die Aktion beschreibt.
    • Die Funktion gibt die NEW-Zeile zurück.
    • Die Funktion ist in der Sprache plpgsql geschrieben.
  • Den Trigger an die Tabelle bankaccounts anhängen:

    • Ein Trigger mit dem Namen afterinserttrigger wird erstellt.
    • Der Trigger wird so konfiguriert, dass er nach einer INSERT-Operation auf der Tabelle bankaccounts ausgeführt wird.
    • Der Trigger ist so eingestellt, dass er die Funktion afterinserttriggerfunction für jede betroffene Zeile ausführt.
Note
Hinweis

In PostgreSQL-Triggern ist NEW eine spezielle Datensatzvariable, die die neu in die Tabelle eingefügte oder aktualisierte Zeile repräsentiert. Sie ermöglicht den Zugriff auf die Werte der Spalten in der neuen Zeile innerhalb der Triggerfunktion.
Wenn mit gelöschten Zeilen gearbeitet wird, muss stattdessen die Datensatzvariable OLD anstelle von NEW verwendet werden.

Beispiel für einen Before-Trigger

Angenommen, wir möchten verhindern, dass Werte mit einem negativen Kontostand hinzugefügt werden. Wir können einen BEFORE-Trigger dafür erstellen. Dieser Trigger prüft den Kontostand vor der Operation, und wenn dieser negativ ist, wird die Operation nicht ausgeführt.

12345678910111213141516171819202122232425
-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
Abfragebeschreibung
expand arrow
  • Erstellen der Trigger-Funktion:

    • Erstellen oder ersetzen einer Funktion mit dem Namen before_insert_userlogs().
    • Die Funktion ist so definiert, dass sie einen Trigger zurückgibt.
    • Der Funktionskörper beginnt mit einem BEGIN-Block.
    • Innerhalb des BEGIN-Blocks prüft eine Bedingung, ob das Kontoguthaben kleiner als 0 ist.
    • Ist das Guthaben kleiner als 0, wird eine Notiz ausgegeben und keine Aktion protokolliert. Die Funktion gibt NULL zurück, um das Einfügen zu verhindern.
    • Ist das Guthaben größer oder gleich 0, wird eine Notiz ausgegeben, dass die Aktion protokolliert wird.
    • Die Funktion fügt dann einen Datensatz in die Tabelle userlogs ein, der Werte aus der NEW-Zeile enthält.
    • Die eingefügten Werte umfassen accountnumber und einen zusammengefügten String, der die Aktion angibt.
    • Die Funktion gibt NEW zurück, um das Einfügen zu ermöglichen.
    • Die Funktion ist in der Sprache plpgsql geschrieben.
  • Erstellen des Triggers:

    • Ein Trigger mit dem Namen before_insert_userlogs_trigger wird erstellt.
    • Der Trigger wird so eingestellt, dass er vor einer INSERT-Operation auf der Tabelle bankaccounts ausgeführt wird.
    • Der Trigger ist so eingestellt, dass er die Funktion before_insert_userlogs() für jede betroffene Zeile ausführt.

Trigger-Erstellungsmuster

Typisches Muster zur Erstellung von Triggern: Zunächst wird eine Funktion definiert, die spezifische Logik vor oder nach einer Operation ausführt. Anschließend wird diese Funktion als Trigger einer bestimmten Tabelle und Aktion zugeordnet.

Beachte, dass in der Anweisung:

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

kann anstelle der UPDATE-Operation auch DELETE oder INSERT verwendet werden.
Aber beachte, dass keine SELECT-Trigger erstellt werden können, da die SELECT-Anweisung keine Zeilen in der Tabelle verändert!

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 3. Kapitel 1
some-alt