SUMMARY: Denne artikel omhandler triggers i PostgreSQL. Den beskriver de forskellige typer triggere og giver eksempler for hver enkelt:
1. Typer af triggere
2. Oprettelse af en trigger
1. INSERT-hændelsesudløser
2. 2. UPDATE-hændelsesudløser
3. DELETE-hændelsesudløser
4. Annullering af en udløser
5. Anvendelse af triggere
6. Vigtige punkter at huske
En “trigger” er defineret som enhver begivenhed, der sætter en handling i gang.
I PostgreSQL, hvis du ønsker at handle på specifikke databasehændelser, såsom INSERT, UPDATE, DELETE eller TRUNCATE, kan triggerfunktionaliteten være nyttig, da den vil påkalde den nødvendige funktion på definerede begivenheder.
Triggeren vil være tilknyttet den angivne tabel, visning eller fremmedtabel og vil udføre den angivne funktion, når der udføres bestemte operationer på den pågældende tabel. Afhængigt af kravet kan vi oprette en trigger FØR, EFTER eller INDEN begivenhederne/operationerne.
Typer af triggere
1. Trigger på række-niveau: Hvis udløseren er markeret FOR EACH ROW, vil udløserfunktionen blive kaldt for hver række, der bliver ændret af hændelsen.
Til eksempel: Hvis vi UPDATE 100 rækker i tabellen, vil UPDATE-triggerfunktionen blive kaldt 100 gange, én gang for hver opdateret række.
2. Statement Level Trigger: Trigger på Statement-niveau: Det er ikke muligt at oprette en triggerfunktion på det angivne objekt, hvis du vælger FOR EACH STATEMENT.
Skabelse af en trigger
SQL-kommandoen CREATE TRIGGER opretter en trigger på det angivne objekt.
Syntaksen for CREATE TRIGGER er som følger:
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
For en mere detaljeret beskrivelse og tilgængelige indstillinger kan du se PostgreSQL-dokumentationen på https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. INSERT-hændelsestrigger
Hændelsestriggeren INSERT bliver kaldt, når der tilføjes en ny post til en tabel ved hjælp af INSERT-anvisningen.
Eksempel
Lad os se på et eksempel på oprettelse af en ny trigger. I dette eksempel opretter vi en ny tabel med navnet “Employee” som følger:
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,);
Vi vil oprette en trigger, der kan tilføje en post i tabellen “Employee_Audit”, hvis en ny medarbejderpost bliver indsat i tabellen “Employee”. Vi vil logge brugernavnets detaljer, som vil tilføje posten i tabellen “Employee”.
Føj en triggerfunktion og CREATE TRIGGER-kommandoen:
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();
Når vi opretter ovenstående INSERT-trigger på tabellen, vil den tilføje en ny post i tabellen “Employee_Audit” med disse detaljer:
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-hændelsestrigger
Den UPDATE-hændelsestrigger bliver kaldt på tidspunktet for udførelse af UPDATE-erklæringen.
Eksempel
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETE-hændelsesudløser
Dette er DELETE-hændelsesudløseren, som kan tilføjes på transaktioner, der DELETE-poster.
Eksempel
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Dropping a Trigger
DROP TRIGGER bruges til at fjerne en udløser. Syntaksen er meget enkel.
drop trigger employee_insert_trigger on "Employee" ;
Anvendelse af udløsere
1. Revision: Du kan bruge triggers til at spore tabeltransaktioner ved at logge hændelsesdetaljerne.
2. Forcing Check Constraint: Du kan bruge triggers til at spore tabeltransaktioner ved at logge hændelsesdetaljerne.
2: Du kan oprette en udløser, hvormed du kan kontrollere begrænsningerne, før du anvender transaktionen på tabellen.
3. Automatisk population: Du kan oprette en udløser, hvormed du kan kontrollere begrænsningerne, før du anvender transaktionen på tabellen: Ved at bruge triggers kan du også automatisk udfylde felter i tabeller ved manipulation af nye transaktionsposter.
Vigtige punkter at huske
1. For at oprette en trigger på en tabel skal brugeren have TRIGGER-rettighederne på tabellen og EXECUTE-rettighederne på triggerfunktionen.
2. Du kan tjekke systemkataloget “pg_trigger” for eksisterende triggeroplysninger i databasen.
3. Hvis du opretter flere triggere på det samme objekt for den samme begivenhed, vil disse triggere blive affyret i alfabetisk rækkefølge efter navn.