PostgreSQL Triggers: Create, List & Drop with Example
โก Chytrรฉ shrnutรญ
PostgreSQL Triggery jsou funkce, kterรฉ se spouลกtฤjรญ automaticky, kdyลพ se u tabulky spustรญ udรกlost INSERT, UPDATE nebo DELETE, coลพ umoลพลuje databรกzi vynucovat pravidla, protokolovat zmฤny a auditovat data bez nutnosti dalลกรญho aplikaฤnรญho kรณdu.

V ฤem je Trigger in PostgreSQL?
A PostgreSQL spouลกลฅ je funkce, kterรก se spustรญ automaticky, kdyลพ dojde k udรกlosti v databรกzi na databรกzovรฉm objektu, napลรญklad v tabulce. Mezi pลรญklady databรกzovรฝch udรกlostรญ, kterรฉ mohou aktivovat spouลกtฤฤ, patลรญ INSERT, UPDATE, DELETE atd. Navรญc, kdyลพ vytvoลรญte spouลกtฤฤ pro tabulku, spouลกtฤฤ se automaticky zruลกรญ, kdyลพ je tato tabulka smazรกna.
Jak se Trigger pouลพรญvรก v PostgreSQL?
Spouลกtฤฤ lze bฤhem jeho vytvรกลenรญ oznaฤit operรกtorem FOR EACH ROW. Takovรฝ spouลกtฤฤ bude volรกn jednou pro kaลพdรฝ ลรกdek upravenรฝ operacรญ. Spouลกtฤฤ lze takรฉ bฤhem jeho vytvรกลenรญ oznaฤit operรกtorem FOR EACH STATEMENT. Tento spouลกtฤฤ bude proveden pouze jednou pro konkrรฉtnรญ operaci.
PostgreSQL Vytvoลenรญ spouลกtฤฤe
Pro vytvoลenรญ triggeru pouลพijeme funkci CREATE TRIGGER. Zde je syntaxe funkce:
CREATE TRIGGER trigger-name [BEFORE|AFTER|INSTEAD OF] event-name ON table-name [ -- Trigger logic ];
Trigger-name je nรกzev triggeru.
Klรญฤovรก slova BEFORE, AFTER a MรSTO jsou klรญฤovรก slova, kterรก urฤujรญ, kdy bude spouลกtฤฤ vyvolรกn.
Nรกzev-udรกlosti je nรกzev udรกlosti, kterรก zpลฏsobรญ vyvolรกnรญ spouลกtฤฤe. To mลฏลพe bรฝt INSERT, UPDATE, DELETE atd.
Nรกzev-tabulky je nรกzev tabulky, ve kterรฉ mรก bรฝt vytvoลen spouลกtฤฤ.
Pokud mรก bรฝt trigger vytvoลen pro operaci INSERT, musรญme pลidat parametr ON column-name.
Demonstruje to nรกsledujรญcรญ syntaxe:
CREATE TRIGGER trigger-name AFTER INSERT ON column-name ON table-name [ -- Trigger logic ];
PostgreSQL Vytvoลit pลรญklad spouลกtฤnรญ
Pouลพijeme nรญลพe uvedenou cenovou tabulku:
Cena:
Vytvoลme dalลกรญ tabulku Price_Audits, kde zaznamenรกme zmฤny provedenรฉ v tabulce cen:
CREATE TABLE Price_Audits ( book_id INT NOT NULL, entry_date text NOT NULL );
Nynรญ mลฏลพeme definovat novou funkci s nรกzvem auditfunc:
CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$ BEGIN INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp); RETURN NEW; END; $my_table$ LANGUAGE plpgsql;
Vรฝลกe uvedenรก funkce vloลพรญ zรกznam do tabulky Price_Audits vฤetnฤ novรฉho id ลรกdku a ฤasu vytvoลenรญ zรกznamu.
Nynรญ, kdyลพ mรกme spouลกtฤcรญ funkci, mฤli bychom ji navรกzat na naลกi tabulku Price. Spouลกtฤฤi dรกme nรกzev price_trigger. Pลed vytvoลenรญm novรฉho zรกznamu se spouลกtฤcรญ funkce automaticky vyvolรก, aby zaznamenala zmฤny. Zde je spouลกtฤฤ:
CREATE TRIGGER price_trigger AFTER INSERT ON Price FOR EACH ROW EXECUTE PROCEDURE auditfunc();
Vloลพรญme novรฝ zรกznam do cenovรฉ tabulky:
INSERT INTO Price VALUES (3, 400);
Nynรญ, kdyลพ jsme vloลพili zรกznam do tabulky Price, mฤl by bรฝt zรกznam vloลพen takรฉ do tabulky Price_Audits kvลฏli nรกmi vytvoลenรฉmu triggeru. Zkontrolujme to:
SELECT * FROM Price_Audits;
Tรญm se vrรกtรญ nรกsledujรญcรญ:
Spouลกลฅ fungovala รบspฤลกnฤ.
PostgreSQL Seznam spouลกtฤฤลฏ
Vลกechny spouลกtฤฤe, kterรฉ vytvoลรญte PostgreSQL jsou uloลพeny v tabulce pg_trigger. Chcete-li zobrazit seznam spouลกtฤฤลฏ, kterรฉ mรกte na databรกze, dotazujte se na tabulku spuลกtฤnรญm pลรญkazu SELECT, jak je uvedeno nรญลพe:
SELECT tgname FROM pg_trigger;
To vrรกtรญ nรกsledujรญcรญ:
Sloupec tgname tabulky pg_trigger oznaฤuje nรกzev spouลกtฤฤe.
PostgreSQL Spuลกtฤnรญ spouลกtฤ
Kdyลพ jiลพ spouลกtฤฤ nepotลebujete, mลฏลพete ho stejnฤ snadno odstranit. Chcete-li spustit PostgreSQL trigger, pouลพรญvรกme pลรญkaz DROP TRIGGER s nรกsledujรญcรญ syntaxรญ:
DROP TRIGGER [IF EXISTS] trigger-name
ON table-name [ CASCADE | RESTRICT ];
Parametr nรกzev-spouลกtฤฤe oznaฤuje nรกzev spouลกtฤฤe, kterรฝ mรก bรฝt vymazรกn.
Nรกzev tabulky oznaฤuje nรกzev tabulky, ze kterรฉ mรก bรฝt spouลกtฤฤ odstranฤn.
Klauzule IF EXISTS se pokusรญ odstranit spouลกtฤฤ, kterรฝ existuje. Pokud se pokusรญte odstranit spouลกtฤฤ, kterรฝ neexistuje bez pouลพitรญ klauzule IF EXISTS, zobrazรญ se chyba.
Moลพnost CASCADE vรกm pomลฏลพe automaticky zahodit vลกechny objekty zรกvislรฉ na spouลกtฤฤi.
Pokud pouลพijete moลพnost RESTRICT, spouลกtฤฤ nebude odstranฤn, pokud jsou na nฤm objekty zรกvislรฉ.
Pro pลรญklad:
Chcete-li zruลกit spouลกtฤฤ s nรกzvem example_trigger v tabulce Spoleฤnost, spusลฅte nรกsledujรญcรญ pลรญkaz:
DROP TRIGGER example_trigger IF EXISTS
ON Company;
Pomocรญ pgAdmin
Nynรญ se podรญvejme, jak se vลกechny tลi akce provรกdฤjรญ pomocรญ pgAdmin.
Jak vytvoลit spouลกtฤฤ v PostgreSQL pomocรญ pgAdmin
Zde je nรกvod, jak si mลฏลพete vytvoลit spouลกtฤฤ v PostgreSQL pomocรญ pgAdmin:
Krok 1) Pลihlaste se ke svรฉmu รบฤtu pgAdmin
Otevลete pgAdmin a pลihlaste se ke svรฉmu รบฤtu pomocรญ svรฝch pลihlaลกovacรญch รบdajลฏ.
Krok 2) Vytvoลte demo databรกzi
- Na navigaฤnรญ liลกtฤ vlevo kliknฤte na Databรกze.
- Klepnฤte na tlaฤรญtko Demo.
Krok 3) Zadejte dotaz
Chcete-li vytvoลit tabulku Price_Audits, zadejte do editoru dotaz:
CREATE TABLE Price_Audits ( book_id INT NOT NULL, entry_date text NOT NULL )
Krok 4) Proveฤte dotaz
Klepnฤte na tlaฤรญtko Spustit.
Krok 5) Spusลฅte Code pro auditnรญ funkci
Spuลกtฤnรญm nรกsledujรญcรญho kรณdu definujte funkci auditfunc:
CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$ BEGIN INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp); RETURN NEW; END; $my_table$ LANGUAGE plpgsql
Krok 6) Spusลฅte Code vytvoลit spouลกtฤฤ
Spuลกtฤnรญm nรกsledujรญcรญho kรณdu vytvoลte spouลกtฤฤ price_trigger:
CREATE TRIGGER price_trigger AFTER INSERT ON Price FOR EACH ROW EXECUTE PROCEDURE auditfunc()
Krok 7) Vloลพte novรฝ zรกznam
- Spusลฅte nรกsledujรญcรญ pลรญkaz pro vloลพenรญ novรฉho zรกznamu do cenovรฉ tabulky:
INSERT INTO Price VALUES (3, 400)
- Spuลกtฤnรญm nรกsledujรญcรญho pลรญkazu zkontrolujte, zda byl zรกznam vloลพen do tabulky Price_Audits:
SELECT * FROM Price_Audits
To by mฤlo vrรกtit nรกsledujรญcรญ:
Krok 8) Zkontrolujte obsah tabulky
Podรญvejme se na obsah tabulky Price_Audits.
Vรฝpis spouลกtฤฤลฏ pomocรญ pgAdmin
Krok 1) Chcete-li zkontrolovat spouลกtฤฤe ve vaลกรญ databรกzi, spusลฅte nรกsledujรญcรญ pลรญkaz:
SELECT tgname FROM pg_trigger
To vrรกtรญ nรกsledujรญcรญ:
Poklesping Triggery pomocรญ pgAdmin
Chcete-li zruลกit spouลกtฤฤ s nรกzvem example_trigger v tabulce Spoleฤnost, spusลฅte nรกsledujรญcรญ pลรญkaz:
DROP TRIGGER example_trigger IF EXISTS
ON Company
Stรกhnฤte si databรกzi pouลพitou v tomto kurzu







