SAMENVATTING: In dit artikel worden triggers in PostgreSQL besproken. Het beschrijft de verschillende soorten triggers en geeft voorbeelden voor elk:
1. Types Triggers
2. Een Trigger maken
1. INSERT event trigger
2. 2. UPDATE gebeurtenis-trigger
3. DELETE gebeurtenis-trigger
4. Een Trigger verwijderen
5. Gebruik van Triggers
6. Belangrijke punten om te onthouden
Een “trigger” wordt gedefinieerd als elke gebeurtenis die een actie in gang zet.
In PostgreSQL, als u actie wilt ondernemen op specifieke database gebeurtenissen, zoals INSERT, UPDATE, DELETE, of TRUNCATE, dan kan trigger functionaliteit nuttig zijn omdat het de vereiste functie zal aanroepen op gedefinieerde gebeurtenissen.
De trigger wordt geassocieerd met de gespecificeerde tabel, view, of foreign tabel en zal de gespecificeerde functie uitvoeren wanneer bepaalde operaties op die tabel worden uitgevoerd. Afhankelijk van het vereiste kunnen wij trigger VOOR, NA of IN VOORKEUR van de gebeurtenissen/bewerkingen maken.
Types van Triggers
1. Trigger op rijniveau: Als de trigger is gemarkeerd FOR EACH ROW dan zal de trigger functie worden aangeroepen voor elke rij die wordt gewijzigd door de gebeurtenis.
Voorbeeld: Als we 100 rijen in de tabel UPDATE, zal de UPDATE trigger functie 100 keer worden aangeroepen, eenmaal voor elke bijgewerkte rij.
2. Statement Level Trigger: De FOR EACH STATEMENT optie zal de trigger functie slechts eenmaal aanroepen voor elk statement, ongeacht het aantal rijen dat gewijzigd wordt.
Een Trigger maken
Het SQL commando CREATE TRIGGER creëert een trigger op het gespecificeerde object.
De syntaxis van het CREATE TRIGGER is als volgt:
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
Voor een meer gedetailleerde beschrijving en beschikbare opties, zie de PostgreSQL documentatie op https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. INSERT event Trigger
De INSERT event trigger wordt aangeroepen wanneer een nieuw record aan een tabel wordt toegevoegd met het INSERT statement.
Example
Laten we eens kijken naar een voorbeeld van het maken van een nieuwe trigger. In dit voorbeeld maken we een nieuwe tabel met de naam “Werknemer” als volgt:
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,);
We gaan een trigger maken die een entry kan toevoegen aan de tabel “Employee_Audit” als een nieuw werknemersrecord wordt ingevoegd in de tabel “Werknemer”. We gaan de details van de gebruikersnaam loggen, die het record in de “Werknemer” tabel gaat toevoegen.
Een trigger functie en CREATE TRIGGER commando toevoegen:
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();
Als we eenmaal de bovenstaande INSERT trigger op de tabel hebben gemaakt, zal het een nieuw item toevoegen aan de “Werknemer_Audit” tabel met deze details:
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 event trigger
De UPDATE event trigger wordt aangeroepen op het moment dat een UPDATE statement wordt uitgevoerd.
Example
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETE event trigger
Dit is de DELETE event trigger, die kan worden toegevoegd aan transacties die records DELETE.
Example
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Dropping a Trigger
DROP TRIGGER wordt gebruikt om een trigger te verwijderen. De syntaxis is zeer eenvoudig.
drop trigger employee_insert_trigger on "Employee" ;
Toepassingen van Triggers
1. Auditing: U kunt triggers gebruiken om de tabel transacties te volgen door het loggen van de event details.
2. Forcing Check Constraint: U kunt een trigger maken waarmee u de constraints kunt controleren voordat u de transactie op de tabel toepast.
3. Automatische Populatie: Door het gebruik van triggers kunt u ook automatisch bevolken tabellen velden door nieuwe transacties records manipulatie.
Belangrijke punten om te onthouden
1. Om een trigger op een tabel te maken, moet de gebruiker de TRIGGER privilege op de tabel en EXECUTE privilege op de trigger functie hebben.
2. U kunt systeem catalogus “pg_trigger” voor de bestaande trigger informatie in de database controleren.
3. Als u meerdere triggers op hetzelfde object voor dezelfde gebeurtenis maakt, zullen deze triggers in alfabetische volgorde op naam worden afgevuurd.