Összefoglaló: Ez a cikk a PostgreSQL-ben található triggereket tárgyalta. Leírja a különböző típusú triggereket, és példákat ad mindegyikre:
1. Triggerek típusai
2. Trigger létrehozása
1. INSERT esemény trigger
2. INSERT esemény trigger
. UPDATE esemény trigger
3. DELETE esemény trigger
4. Trigger elhagyása
5. Trigger elhagyása
. A triggerek felhasználása
6. Fontos tudnivalók
A “trigger” definíció szerint minden olyan esemény, amely mozgásba hoz egy cselekvést.
A PostgreSQL-ben, ha meghatározott adatbázis eseményekre, például INSERT, UPDATE, DELETE vagy TRUNCATE eseményekre szeretnénk lépéseket tenni, akkor a trigger funkció hasznos lehet, mivel a meghatározott eseményekre meghívja a kívánt funkciót.
A trigger a megadott táblához, nézethez vagy idegen táblához kapcsolódik, és akkor hajtja végre a megadott függvényt, amikor az adott táblán bizonyos műveleteket végeznek. A követelményektől függően létrehozhatunk triggereket az események/műveletek ELŐTT, UTÁN vagy UTÁN.
A triggerek típusai
1. Sor szintű kiváltó:
Például: Ha a kiváltó funkciót FOR EACH ROW (Minden sorra) jelöljük, akkor a kiváltó funkciót minden olyan sorra meghívjuk, amelyet az esemény módosít.
Például: Ha a táblázatban 100 sort UPDATE-zunk, akkor az UPDATE trigger függvény 100-szor lesz meghívva, minden egyes frissített sorhoz egyszer.
2. Kijelentés szintű trigger: A FOR EACH STATEMENT opció minden egyes utasításhoz csak egyszer hívja meg a triggerfüggvényt, függetlenül a módosítandó sorok számától.
Trigger létrehozása
A CREATE TRIGGER SQL-parancs létrehoz egy triggert a megadott objektumon.
A CREATE TRIGGER szintaxisa a következő:
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
A részletesebb leírásért és a rendelkezésre álló opciókért nézze meg a PostgreSQL dokumentációját a https://www.postgresql.org/docs/12/sql-createtrigger.html címen.
1. INSERT eseménytrigger
Az INSERT eseménytrigger akkor hívódik meg, amikor az INSERT utasítással új rekordot adunk hozzá egy táblához.
Példa
Nézzünk egy példát egy új trigger létrehozására. Ebben a példában létrehozunk egy új, “Alkalmazott” nevű táblát a következőképpen:
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,);
Egy olyan trigger-t fogunk létrehozni, amely képes egy bejegyzést hozzáadni az “Alkalmazott_Audit” táblához, ha egy új alkalmazotti rekord kerül beillesztésre az “Alkalmazott” táblába. Naplózni fogjuk a felhasználónév adatait, amely hozzáadja a rekordot az “Alkalmazott” táblához.
Adjunk hozzá egy trigger függvényt és CREATE TRIGGER parancsot:
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();
Mihelyt létrehozzuk a fenti INSERT trigger-t a táblán, az egy új bejegyzést fog hozzáadni az “Alkalmazott_Audit” táblához a következő adatokkal:
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 esemény trigger
A UPDATE esemény trigger az UPDATE utasítás végrehajtásakor kerül meghívásra.
Példa
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETE esemény trigger
Ez a DELETE esemény trigger, amely a rekordokat TÖRLŐ tranzakciókhoz adható hozzá.
Példa
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Dropping a Trigger
DROP TRIGGER egy trigger eltávolítására szolgál. A szintaxis nagyon egyszerű.
drop trigger employee_insert_trigger on "Employee" ;
A triggerek felhasználása
1. Ellenőrzés: A triggerek segítségével nyomon követheti a táblázat tranzakcióit az esemény részleteinek naplózásával.
2. Ellenőrző kényszerítés: Létrehozhat olyan triggereket, amelyekkel ellenőrizheti a korlátozásokat, mielőtt a tranzakciót a táblára alkalmazná.
3. Automatikus népességszámlálás: A triggerek használatával automatikusan feltölthetjük a táblák mezőit az új tranzakciók rekordjainak manipulálásával.
Fontos megjegyzendő pontok
1. Ahhoz, hogy egy trigger-t hozzon létre egy táblán, a felhasználónak TRIGGER jogosultsággal kell rendelkeznie a táblán és EXECUTE jogosultsággal a trigger függvényen.
2. A “pg_trigger” rendszerkatalógusban ellenőrizheti az adatbázisban meglévő trigger információkat.
3. Ha több trigger-t hoz létre ugyanazon objektumon ugyanazon eseményre, akkor ezek a trigger-ek a név szerinti betűrendben fognak elsülni.
3.