SUMMARY: Tento článek pojednává o spouštěčích v PostgreSQL. Popisuje různé typy triggerů a uvádí příklady pro každý z nich:
1. Typy spouštěčů
2. Vytvoření spouštěče
1. Spouštěč události INSERT
2. Vytvoření spouštěče události INSERT
3. Vytvoření spouštěče události INSERT
. 3. Spouštěč události UPDATE
3. Spouštěč události DELETE
4. Zrušení spouštěče
5. Spouštění událostí. Použití spouštěčů
6. Důležité body k zapamatování
„Spouštěč“ je definován jako jakákoli událost, která uvede do pohybu určitou akci.
Pokud chcete v PostgreSQL provést akci při určitých událostech v databázi, například INSERT, UPDATE, DELETE nebo TRUNCATE, může být užitečná funkce spouštěče, která při definovaných událostech vyvolá požadovanou funkci.
Trigger bude spojen se zadanou tabulkou, pohledem nebo cizí tabulkou a při provedení určitých operací v této tabulce spustí zadanou funkci. V závislosti na požadavku můžeme vytvořit spouštěč PŘED, PO nebo PŘED událostmi/operacemi.
Typy spouštěčů
1. Spouštěč na úrovni řádku:
Příklad: Pokud je spouštěč označen PRO KAŽDÝ ŘÁDEK, pak bude funkce spouštěče volána pro každý řádek, který se událostí mění:
2. Spouštěč na úrovni příkazu: Pokud aktualizujeme 100 řádků v tabulce, bude spouštěcí funkce UPDATE zavolána 100krát, jednou pro každý aktualizovaný řádek:
Vytvoření triggeru
Příkaz SQL CREATE TRIGGER vytvoří trigger na zadaném objektu.
Syntaxe příkazu CREATE TRIGGER je následující:
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
Podrobnější popis a dostupné možnosti najdete v dokumentaci PostgreSQL na adrese https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. Spouštěč události INSERT
Spouštěč události INSERT se vyvolá, když je do tabulky přidán nový záznam pomocí příkazu INSERT.
Příklad
Podívejme se na příklad vytvoření nového spouštěče. V tomto příkladu vytvoříme novou tabulku s názvem „Zaměstnanec“ takto:
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,);
Vytvoříme spouštěč, který může přidat záznam do tabulky „Zaměstnanec_Audit“, pokud se do tabulky „Zaměstnanec“ vloží nový záznam zaměstnance. Budeme zaznamenávat údaje o uživatelském jménu, které přidá záznam do tabulky „Zaměstnanec“.
Přidáme funkci spouštěče a příkaz 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();
Jakmile vytvoříme výše uvedený spouštěč INSERT v tabulce, přidá do tabulky „Zaměstnanec_Audit“ jeden nový záznam s těmito údaji:
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. V tabulce „Zaměstnanec_Audit“ bude přidán jeden nový záznam. Spouštěč události UPDATE
Spouštěč události UPDATE se vyvolá v okamžiku provedení příkazu UPDATE.
Příklad
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. Spouštěč události DELETE
Tento spouštěč události DELETE, který lze přidat u transakcí, při nichž dochází k MAZÁNÍ záznamů.
Příklad
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Spuštění spouštěče
DROP TRIGGER slouží k odstranění spouštěče. Syntaxe je velmi jednoduchá.
drop trigger employee_insert_trigger on "Employee" ;
Použití spouštěčů
1. Auditování: Pomocí triggerů můžete sledovat transakce v tabulce zaznamenáváním podrobností o událostech.
2. Vynucení kontrolního omezení: Můžete vytvořit spouštěč, pomocí kterého můžete před použitím transakce na tabulku zkontrolovat omezení.
3. Automatické zalistování: Pomocí spouštěčů můžete také automaticky naplnit pole tabulky manipulací se záznamy nových transakcí.
Důležité body k zapamatování
1. Pro vytvoření spouštěče na tabulce musí mít uživatel oprávnění TRIGGER na tabulce a oprávnění EXECUTE na funkci spouštěče.
2. Informace o existujících spouštěčích v databázi najdete v systémovém katalogu „pg_trigger“.
3. Pokud vytvoříte více spouštěčů na stejném objektu pro stejnou událost, budou tyto spouštěče spuštěny v abecedním pořadí podle názvu.