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.

  • โšก Definice: Trigger je funkce, kterรก se automaticky vyvolรกvรก pล™i udรกlosti v databรกzi, jako je INSERT, UPDATE nebo DELETE.
  • ๐Ÿ” Rozsah: Pล™รญkaz FOR EACH ROW spustรญ trigger jednou pro kaลพdรฝ dotฤenรฝ ล™รกdek, zatรญmco pล™รญkaz FOR EACH STATEMENT jej spustรญ jednou za operaci.
  • ๐Ÿ› ๏ธ Vytvoล™it: Funkce CREATE TRIGGER navรกลพe funkci na tabulku a nastavรญ ฤasovรกnรญ BEFORE, AFTER nebo INSTEAD OF.
  • ???? Seznam: Dotazujte katalog pg_trigger pomocรญ pล™รญkazu SELECT tgname, abyste vidฤ›li vลกechny triggery v databรกzi.
  • ๐Ÿ—‘๏ธ Drop: DROP TRIGGER odstranรญ spouลกtฤ›ฤ a IF EXISTS zabrรกnรญ chybฤ›, pokud chybรญ.
  • ๐Ÿค– Nรกpovฤ›da s umฤ›lou inteligencรญ: Asistenti s umฤ›lou inteligencรญ generujรญ spouลกtฤ›cรญ funkce a na zรกkladฤ› poลพadavku v jednoduchรฉm jazyce navrhujรญ ฤasovรกnรญ Pล˜ED nebo PO.

PostgreSQL Triggery

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:

PostgreSQL Vytvoล™enรญ spouลกtฤ›ฤe

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รญ:

PostgreSQL Vytvoล™enรญ spouลกtฤ›ฤe

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รญ:

PostgreSQL Seznam spouลกtฤ›ฤลฏ

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

  1. Na navigaฤnรญ liลกtฤ› vlevo kliknฤ›te na Databรกze.
  2. Klepnฤ›te na tlaฤรญtko Demo.

Vytvoล™it spouลกtฤ›ฤ v PostgreSQL pomocรญ pgAdmin

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.

Vytvoล™it spouลกtฤ›ฤ v PostgreSQL pomocรญ pgAdmin

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

  1. Spusลฅte nรกsledujรญcรญ pล™รญkaz pro vloลพenรญ novรฉho zรกznamu do cenovรฉ tabulky:
INSERT INTO Price
VALUES (3, 400)
  1. 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รญ:

Vytvoล™it spouลกtฤ›ฤ v PostgreSQL pomocรญ pgAdmin

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รญ:

Vรฝpis spouลกtฤ›ฤลฏ pomocรญ pgAdmin

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

Nejฤastฤ›jลกรญ dotazy

Spouลกtฤ›ฤ BEFORE se spustรญ pล™ed zapsรกnรญm zmฤ›ny ล™รกdku, takลพe mลฏลพe ล™รกdek upravit nebo odmรญtnout. Spouลกtฤ›ฤ AFTER se spustรญ po uloลพenรญ zmฤ›ny, coลพ je vhodnรฉ pro รบlohy protokolovรกnรญ a auditu.

Trigger INSTEAD OF je definovรกn na pohledu, nikoli na tabulce. Nahrazuje INSERT, UPDATE nebo DELETE vlastnรญ logikou, takลพe pohled urฤenรฝ pouze pro ฤtenรญ je zapisovatelnรฝ.

Spouลกtฤ›cรญ funkce se obvykle pรญลกรญ v PL/pgSQL. PostgreSQL takรฉ podporuje PL/Python, PL/Perl, PL/Tcl a C, takลพe si mลฏลพete vybrat jazyk, kterรฝ odpovรญdรก vaลกรญ logice.

Pro vypnutรญ pouลพijte pล™รญkaz ALTER TABLE nรกzev_tabulky DISABLE TRIGGER nรกzev_triggeru a pro opฤ›tovnรฉ zapnutรญ pouลพijte pล™รญkaz ENABLE TRIGGER. Tรญm se zabrรกnรญ ztrรกtฤ›.ping a znovuvytvoล™enรญ spouลกtฤ›ฤe bฤ›hem hromadnรฉho naฤรญtรกnรญ.

Ano. Kaลพdรฝ trigger pล™idรกvรก prรกci ke kaลพdรฉmu dotฤenรฉmu ล™รกdku nebo pล™รญkazu, takลพe nรกroฤnรก logika triggerลฏ mลฏลพe zpomalit zรกpis. Udrลพujte triggerovรฉ funkce krรกtkรฉ a indexujte vลกechny sloupce, na kterรฉ se dotazujรญ.

Ano. Pokud trigger zmฤ›nรญ jinou tabulku, kterรก mรก takรฉ triggery, spustรญ se i ty a vytvoล™รญ se kaskรกdovรฉ triggery. PostgreSQL omezuje hloubku vnoล™enรญ, aby se zabrรกnilo nekoneฤnรฝm smyฤkรกm.

Asistenti kรณdovรกnรญ s umฤ›lou inteligencรญ pล™emฤ›nรญ poลพadavek v jednoduchรฉm jazyce na kompletnรญ pล™รญkaz CREATE TRIGGER a spouลกtฤ›cรญ funkci, navrhnou ฤasovรกnรญ BEFORE nebo AFTER a vysvฤ›tlรญ vygenerovanรฝ PL/pgSQL pro rychlรฝ pล™ehled.

Ano. Nรกstroje jako pgai a asistenti zaloลพenรฉ na GPT pล™eklรกdajรญ popsanรฉ pravidlo do spouลกtฤ›cรญho SQL a dokรกลพรญ vytvรกล™et spouลกtฤ›ฤe INSERT, kterรฉ automaticky oznaฤujรญ nebo ovฤ›ล™ujรญ novรก data, jakmile dorazรญ.

Shrลˆte tento pล™รญspฤ›vek takto: