Kursinhalt
Fortgeschrittene Techniken in SQL
Fortgeschrittene Techniken in SQL
Trigger
Trigger in Datenbanken sind spezielle Arten von gespeicherten Prozeduren, die automatisch ausgeführt oder ausgelöst werden, als Reaktion auf bestimmte Ereignisse oder Aktionen, die in der Datenbank auftreten.
Diese Ereignisse können Einfügungen, Aktualisierungen oder Löschungen von Daten in Tabellen und Änderungen an Datenbankschemaobjekten wie Tabellen oder Ansichten umfassen.
Hinweis
Trigger können nicht explizit von Benutzern aufgerufen werden. Stattdessen werden sie automatisch als Reaktion auf die Operationen ausgeführt, mit denen sie verknüpft sind.
DML-Trigger
Ein DML-Trigger, auch bekannt als Data Manipulation Language Trigger, ist ein Datenbankobjekt, das automatisch eine bestimmte Aktion ausführt, wenn ein bestimmtes Ereignis auf einer Tabelle oder Ansicht auftritt.
DML-Trigger werden häufig verwendet, um Geschäftsregeln durchzusetzen, die Datenintegrität zu wahren oder Prüfungsaufgaben 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 Ihnen, 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 untersucht, bei dem eine Transaktion verwendet wurde, um Werte in die BankAccounts
-Tabelle und die UserLogs
-Tabelle als eine einzige logische Einheit im ersten Abschnitt dieses Kurses hinzuzufügen.
Jetzt können wir anstelle einer Transaktion dies erreichen, indem wir einen AFTER
-Trigger für die INSERT
-Operation innerhalb der BankAccounts
-Tabelle erstellen.
Als Ergebnis können wir nur neue Konten einfügen, und der entsprechende Protokollwert wird automatisch durch den Trigger hinzugefügt.
-- 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();
Hinweis
In PostgreSQL-Triggern ist
NEW
eine spezielle Datensatzvariable, die die neue Zeile darstellt, die in die Tabelle eingefügt oder aktualisiert wird. Sie ermöglicht den Zugriff auf die Werte der Spalten in der neuen Zeile innerhalb der Triggerfunktion.
Wenn wir mit gelöschten Zeilen arbeiten, müssen wir dieOLD
-Datensatzvariable anstelle vonNEW
verwenden.
Beispiel für einen Vor-Trigger
Angenommen, wir möchten das Hinzufügen von Werten mit einem negativen Kontostand verhindern. Wir können einen BEFORE
-Trigger erstellen, um dies zu erreichen. Dieser Trigger überprüft den Kontostand vor der Operation, und wenn er negativ ist, wird die Operation nicht durchgeführt.
-- 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();
Muster zur Triggererstellung
Wir können das typische Muster zur Erstellung von Triggern beobachten: Zunächst definieren wir eine Funktion, um spezifische Logik vor oder nach einer Operation auszuführen. Anschließend verknüpfen wir diese Funktion als Trigger mit einer bestimmten Tabelle und Aktion.
Bitte beachten Sie, dass in der Anweisung:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
wir die Flexibilität haben, UPDATE
oder DELETE
anstelle der INSERT
-Operation zu verwenden.
Aber achten Sie darauf, dass wir keine SELECT
-Trigger erstellen können, da die SELECT
-Anweisung keine Zeilen in der Tabelle ändert!
Danke für Ihr Feedback!