PostgreSQL Triggers: Create, List & Drop with Example
V ฤem je Trigger in PostgreSQL?
A PostgreSQL spouลกลฅ je funkce, kterรก se spouลกtรญ automaticky, kdyลพ na databรกzovรฉm objektu dojde k databรกzovรฉ udรกlosti. Napลรญklad stลฏl. Pลรญklady databรกzovรฝch udรกlostรญ, kterรฉ mohou aktivovat spouลกtฤฤ, zahrnujรญ INSERT, UPDATE, DELETE atd. Navรญc, kdyลพ vytvoลรญte spouลกtฤฤ pro tabulku, bude spouลกtฤฤ automaticky zruลกen, kdyลพ je tato tabulka odstranฤna.
Jak se Trigger pouลพรญvรก v PostgreSQL?
Spouลกtฤฤ lze oznaฤit operรกtorem FOR EACH ROW pลi jeho vytvรกลenรญ. Takovรฝ trigger bude volรกn jednou pro kaลพdรฝ ลรกdek upravenรฝ operacรญ. Spouลกtฤฤ lze takรฉ oznaฤit operรกtorem FOR EACH STATEMENT pลi jeho vytvรกลenรญ. Tento trigger 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 svรกzat s naลกรญ tabulkou cen. Spouลกtฤฤi dรกme nรกzev price_trigger. Pลed vytvoลenรญm novรฉho zรกznamu bude automaticky vyvolรกna spouลกtฤcรญ funkce pro zaznamenรกnรญ zmฤn. 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 Cena, mฤl by bรฝt zรกznam vloลพen takรฉ do tabulky Price_Audit. Bude to dลฏsledkem spouลกtฤฤe, kterรฝ jsme vytvoลili v tabulce cen. Zkontrolujeme toto:
SELECT * FROM Price_Audits;
Tรญm se vrรกtรญ nรกsledujรญcรญ:
Spouลกลฅ fungovala รบspฤลกnฤ.
Spouลกtฤฤ seznamu Postgres
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.
Postgres Drop Trigger
Upustit a 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 odstranit spouลกtฤฤ s nรกzvem example_trigger v tabulce Cena, spustรญme nรกsledujรญcรญ pลรญkaz:
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 byly provedeny vลกechny tลi akce pomocรญ pgAdmin.
Jak vytvoลit spouลกtฤฤ v PostgreSQL pomocรญ pgAdmin
Zde je nรกvod, jak mลฏลพete vytvoลit spouลกtฤฤ v Postgres 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 dotaz v editoru:
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
Zkontrolujeme 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
Shrnutรญ
- A PostgreSQL trigger odkazuje na funkci, kterรก se spouลกtรญ automaticky, kdyลพ na databรกzovรฉm objektu, jako je tabulka, dojde k databรกzovรฉ udรกlosti.
- Pลรญklady takovรฝch databรกzovรฝch udรกlostรญ zahrnujรญ INSERT, UPDATE, DELETE atd.
- Spouลกtฤฤ existuje pouze po dobu ลพivotnosti databรกzovรฉho objektu, pro kterรฝ byl vytvoลen.
- Pokud je databรกzovรฝ objekt odstranฤn, bude smazรกn takรฉ spouลกtฤฤ.
- PostgreSQL spouลกtฤฤe se vytvรกลejรญ pomocรญ pลรญkazu CREATE TRIGGER.
- Kaลพdรฝ spouลกtฤฤ je spojen s funkcรญ, kterรก uvรกdรญ, co spouลกtฤฤ udฤlรก, kdyลพ je vyvolรกn.







