SAMMANFATTNING: Den här artikeln handlar om triggers i PostgreSQL. Den beskriver de olika typerna av triggers och ger exempel för var och en:
1. Typer av triggers
2. Skapa en trigger
1. INSERT event trigger
2. UPDATE-händelseutlösare
3. DELETE-händelseutlösare
4. Upphävande av en utlösare
5. Användning av triggers
6. Viktiga punkter att komma ihåg
En ”trigger” definieras som en händelse som sätter en handling i rörelse.
I PostgreSQL, om du vill vidta åtgärder vid specifika databashändelser, t.ex. INSERT, UPDATE, DELETE eller TRUNCATE, kan triggerfunktionalitet vara användbar eftersom den anropar den nödvändiga funktionen vid definierade händelser.
Triggern kommer att associeras med den angivna tabellen, vyn eller främmande tabellen och kommer att utföra den angivna funktionen när vissa operationer utförs på den tabellen. Beroende på kravet kan vi skapa en trigger före, efter eller före händelserna/operationerna.
Typer av triggers
1. Trigger på radnivå: Om utlösaren är markerad FOR EACH ROW (för varje rad) kommer utlösarfunktionen att anropas för varje rad som ändras av händelsen.
Till exempel: Om vi UPDATE 100 rader i tabellen, kommer utlösarfunktionen UPDATE att anropas 100 gånger, en gång för varje uppdaterad rad.
2: Om vi använder alternativet FOR EACH STATEMENT anropas utlösarfunktionen endast en gång för varje uttalande, oavsett hur många rader som ändras.
Skapa en utlösare
SQL-kommandot CREATE TRIGGER skapar en utlösare på det angivna objektet.
Syntaxen för CREATE TRIGGER är följande:
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 en mer detaljerad beskrivning och tillgängliga alternativ, se PostgreSQL-dokumentationen på https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. INSERT-händelseutlösare
Händelseutlösaren INSERT anropas när en ny post läggs till i en tabell med hjälp av INSERT-anvisningen.
Exempel
Vi tar en titt på ett exempel på hur man skapar en ny utlösare. I det här exemplet skapar vi en ny tabell som heter ”Employee” enligt följande:
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 ska skapa en trigger som kan lägga till en post i tabellen ”Employee_Audit” om en ny anställd post läggs in i tabellen ”Employee”. Vi kommer att logga användarnamnet, vilket kommer att lägga till posten i tabellen ”Employee”.
Lägg till en triggerfunktion och kommandot CREATE TRIGGER:
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 har skapat ovanstående INSERT-trigger i tabellen kommer den att lägga till en ny post i tabellen ”Employee_Audit” med dessa uppgifter:
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ändelseutlösare
UPDATE-händelseutlösaren anropas när UPDATE-anvisningen utförs.
Exempel
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETE-händelseutlösare
Den här DELETE-händelseutlösaren kan läggas till vid transaktioner som DELETE-poster.
Exempel
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Hoppa en utlösare
DROP TRIGGER används för att ta bort en utlösare. Syntaxen är mycket enkel.
drop trigger employee_insert_trigger on "Employee" ;
Användningsområden för utlösare
1. Granskning: Du kan använda triggers för att spåra tabelltransaktioner genom att logga händelsedetaljerna.
2: Du kan skapa en utlösare med vilken du kan kontrollera begränsningarna innan du tillämpar transaktionen på tabellen.
3. Automatisk population: Du kan skapa en utlösare med vilken du kan kontrollera begränsningarna innan du tillämpar transaktionen på tabellen.
3: Genom att använda triggers kan du också automatiskt fylla tabellernas fält med nya transaktionsposter.
Viktiga punkter att komma ihåg
1. För att skapa en trigger på en tabell måste användaren ha TRIGGER-privilegiet på tabellen och EXECUTE-privilegiet på triggerfunktionen.
2. Du kan kontrollera systemkatalogen ”pg_trigger” för att se om det finns information om triggers i databasen.
3. Om du skapar flera triggers på samma objekt för samma händelse, kommer dessa triggers att avfyras i alfabetisk ordning efter namn.