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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.