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:

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

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

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

Spouลกtฤ›ฤ seznamu Postgres

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

  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 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

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)
  2. 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

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

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

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.

Stรกhnฤ›te si databรกzi pouลพitou v tomto kurzu

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