Zusammenfassung: Dieser Artikel behandelt Trigger in PostgreSQL. Er beschreibt die verschiedenen Typen von Triggern und liefert Beispiele für jeden:
1. Typen von Triggern
2. Erstellen eines Triggers
1. INSERT Event Trigger
2. UPDATE-Ereignis-Trigger
3. DELETE-Ereignis-Trigger
4. Fallenlassen eines Triggers
5. Verwendung von Triggern
6. Wichtige Punkte zur Erinnerung
Ein „Trigger“ ist definiert als ein Ereignis, das eine Aktion in Gang setzt.
Wenn Sie in PostgreSQL auf bestimmte Datenbankereignisse wie INSERT, UPDATE, DELETE oder TRUNCATE reagieren wollen, kann die Trigger-Funktionalität nützlich sein, da sie bei definierten Ereignissen die erforderliche Funktion aufruft.
Der Trigger wird mit der angegebenen Tabelle, Ansicht oder Fremdtabelle verknüpft und führt die angegebene Funktion aus, wenn bestimmte Operationen in dieser Tabelle ausgeführt werden. Je nach Anforderung können wir Trigger VOR, NACH oder NACH den Ereignissen/Operationen erstellen.
Typen von Triggern
1. Row Level Trigger: Wenn der Trigger mit FOR EACH ROW markiert ist, wird die Triggerfunktion für jede Zeile aufgerufen, die durch das Ereignis geändert wird.
Zum Beispiel: Wenn wir 100 Zeilen in der Tabelle aktualisieren, wird die UPDATE-Triggerfunktion 100 Mal aufgerufen, einmal für jede aktualisierte Zeile.
2. Anweisungsebene Trigger: Mit der Option FOR EACH STATEMENT wird die Triggerfunktion nur einmal für jede Anweisung aufgerufen, unabhängig von der Anzahl der geänderten Zeilen.
Erstellen eines Triggers
Der SQL-Befehl CREATE TRIGGER erstellt einen Trigger für das angegebene Objekt.
Die Syntax von CREATE TRIGGER ist wie folgt:
CREATE TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event }ON table_name ] transition_relation_name } ] { ROW | STATEMENT } ]EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments ) where event can be one of: INSERTUPDATE ]DELETETRUNCATE
Für eine detailliertere Beschreibung und verfügbare Optionen, lesen Sie die PostgreSQL Dokumentation unter https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. INSERT-Ereignis-Trigger
Der INSERT-Ereignis-Trigger wird aufgerufen, wenn ein neuer Datensatz mit der INSERT-Anweisung zu einer Tabelle hinzugefügt wird.
Beispiel
Schauen wir uns ein Beispiel zur Erstellung eines neuen Triggers an. In diesem Beispiel erstellen wir eine neue Tabelle mit dem Namen „Employee“ wie folgt:
CREATE TABLE "Employee"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"Title" VARCHAR(30),"ReportsTo" INT,"BirthDate" TIMESTAMP,"HireDate" TIMESTAMP,"Address" VARCHAR(70),"City" VARCHAR(40),"State" VARCHAR(40),"Country" VARCHAR(40),"PostalCode" VARCHAR(10),"Phone" VARCHAR(24),"Fax" VARCHAR(24),"Email" VARCHAR(60),CONSTRAINT "PK_Employee" PRIMARY KEY ("EmployeeId"));CREATE TABLE "Employee_Audit"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"UserName" VARCHAR(20) NOT NULL,"EmpAdditionTime" VARCHAR(20) NOT NULL,);
Wir werden einen Trigger erstellen, der einen Eintrag in der Tabelle „Employee_Audit“ hinzufügen kann, wenn ein neuer Mitarbeiterdatensatz in die Tabelle „Employee“ eingefügt wird. Wir werden die Details des Benutzernamens protokollieren, der den Datensatz in der Tabelle „Employee“ hinzufügen wird.
Fügen Sie eine Triggerfunktion und den Befehl CREATE TRIGGER hinzu:
CREATE OR REPLACE FUNCTION employee_insert_trigger_fnc() RETURNS trigger AS$$BEGIN INSERT INTO "Employee_Audit" ( "EmployeeId", "LastName", "FirstName","UserName" ,"EmpAdditionTime") VALUES(NEW."EmployeeId",NEW."LastName",NEW."FirstName",current_user,current_date);RETURN NEW;END;$$LANGUAGE 'plpgsql';CREATE TRIGGER employee_insert_trigger AFTER INSERT ON "Employee" FOR EACH ROW EXECUTE PROCEDURE employee_insert_trigger_fnc();
Wenn wir den oben genannten INSERT-Trigger in der Tabelle erstellen, wird er einen neuen Eintrag in der Tabelle „Employee_Audit“ mit diesen Details hinzufügen:
trigger_demo=# INSERT INTO "Employee" VALUES(10,' Adams','Andrew','Manager',1,'1962-02-18 00:00:00','2010-08-14 00:00:00','11120 Jasper Ave NW','Edmonton','AB','Canada','T5K 2N1','+1 780 428-9482','+1 780 428-3457','[email protected]');INSERT 0 1trigger_demo=# select * from "Employee" where "EmployeeId" =10;--------------------EmployeeId | 10LastName | AdamsFirstName | AndrewTitle | ManagerReportsTo | 1BirthDate | 1962-02-18 00:00:00HireDate | 2010-08-14 00:00:00Address | 11120 Jasper Ave NWCity | EdmontonState | ABCountry | CanadaPostalCode | T5K 2N1Phone | +1 780 428-9482Fax | +1 780 428-3457Email | [email protected]_demo=#trigger_demo=# select * from "Employee_Audit" ;----+-----------EmployeeId | 10LastName | AdamsFirstName | AndrewUserName | postgresEmpAdditionTime | 2019-11-10
2. UPDATE-Ereignis-Trigger
Der UPDATE-Ereignis-Trigger wird zum Zeitpunkt der Ausführung der UPDATE-Anweisung aufgerufen.
Beispiel
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETE-Ereignis-Trigger
Dieser DELETE-Ereignis-Trigger kann zu Transaktionen hinzugefügt werden, die Datensätze löschen.
Beispiel
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Entfernen eines Triggers
DROP TRIGGER wird verwendet, um einen Trigger zu entfernen. Die Syntax ist sehr einfach.
drop trigger employee_insert_trigger on "Employee" ;
Verwendung von Triggern
1. Auditing: Sie können Trigger verwenden, um die Tabellentransaktionen zu verfolgen, indem Sie die Ereignisdetails protokollieren.
2. Erzwingen von Prüfeinschränkungen: Sie können einen Trigger erstellen, mit dem Sie die Beschränkungen überprüfen können, bevor Sie die Transaktion auf die Tabelle anwenden.
3. Automatische Population: Durch die Verwendung von Triggern können Sie auch automatisch Tabellenfelder durch die Bearbeitung neuer Transaktionsdatensätze auffüllen.
Wichtige Punkte, die Sie beachten sollten
1. Um einen Trigger für eine Tabelle zu erstellen, muss der Benutzer das TRIGGER-Recht für die Tabelle und das EXECUTE-Recht für die Trigger-Funktion haben.
2. Sie können den Systemkatalog „pg_trigger“ auf die vorhandenen Trigger-Informationen in der Datenbank überprüfen.
3. Wenn Sie mehrere Trigger für dasselbe Objekt für dasselbe Ereignis erstellen, werden diese Trigger in alphabetischer Reihenfolge nach Namen abgefeuert.