Trigger (databáze)

v databázích, automatizovaná událost vyvolaná definovanou akcí nad tabulkou

Trigger (česky spouštěč) v databázi definuje činnosti, které se mají provést v případě definované události nad databázovou tabulkou. Definovanou událostí může být například vložení nebo smazání dat. Jednoduchá spoušť, která se má provést před vložením nového záznamu do tabulky může mít v SQL zápis:

 CREATE TRIGGER jmeno_triggeru BEFORE INSERT
     ON jmeno_tabulky
 BEGIN
     -- samotný kód spouště
 END;

Tato spoušť před vložením dat do jmeno_tabulky provede příkazy vložené mezi BEGINEND. Kód triggerů lze spouštět i v jiných okamžicích (viz dále). Pokud je spouštěný příkaz jen jeden, mohou být klíčová slova BEGIN a END vynechána.

Parametry syntaxe editovat

  • Klíčové slovo INSERT indikuje, že trigger se spustí při vkládání do databáze. Místo něj může být též UPDATE nebo DELETE.
  • Klíčové slovo BEFORE indikuje, že se trigger spustí před vkládáním, úpravou nebo mazáním záznamu. Pokud by bylo místo něj AFTER, spustil by se trigger poté.
Kdy se spustí který trigger
BEFORE AFTER
INSERT Před vložením nového řádku. Po vložení nového řádku.
V příkazu INSERT a druhé části příkazu REPLACE.
UPDATE Před úpravou existujícího řádku. Po úpravě existujícího řádku.
V příkazu UPDATE nebo v druhé části příkazu INSERT … ON DUPLICATE KEY UPDATE.
DELETE Před smazáním řádku. Po smazání řádku.
V příkazu DELETE nebo první části příkazu REPLACE, kdy je nalezen záznam se stejným primárním klíčem, jejž REPLACE maže.
Příkazy DROP TABLE ani TRUNCATE TABLE trigger nespouštějí, protože nedochází k doslovnému mazání jednotlivých záznamů.

OLD.NEW. editovat

Uvnitř kódu triggeru lze použít dva speciální prefixy, platící jenom v něm a nikde jinde. Jsou to:

  • OLD. symbolizující „staré“ hodnoty měněného řádku (před přepsáním). Například OLD.nazev tak zpřístupňuje původní hodnotu sloupce nazev před úpravou.
  • NEW. symbolizující „nové“ hodnoty měněného řádku (po přepsání – výsledek dané úpravy). Díky tomu lze tvořit elegantní konstrukce jako např.: NEW.pocet_pristupu = OLD.pocet_pristupu + 1 apod. Časté je též získání právě vytvořeného unikátního klíče záznamu a manipulace se záznamem prostřednictvím jej. Databázové systémy nově vytvořený unikátní klíč většinou zpřístupňují přes klíčové slovo LAST_INSERT_ID, ale například pro vkládání více záznamů (zřetězené seznamy hodnot za klauzulí VALUES) to není možné a trigger je tak jediným prostředkem, který může kýženou manipulaci realizovat.

Manipulace s triggery editovat

  • Chceme-li trigger smazat, použijeme příkaz: DROP TRIGGER jmeno_triggeru;
  • Pokud již trigger daného jména existuje a chceme jeho kód změnit, místo CREATE použijeme REPLACE. Některé databázové systémy nicméně nemusejí REPLACE podporovat, a tak je místo toho potřeba trigger smazat a následně ho vytvořit.

Sémantika triggerů editovat

Triggery jako takové jsou definovány ve většině moderních databázových systémů, ovšem mírně se liší v sémantice svého provedení. Klíčové rozdíly jsou zejména v tom, …

  • kdy přesně se trigger spustí
  • jak proběhne, resp. co ho může přerušit
  • jakým způsobem se řeší vzájemné volání triggerů
  • jak (a jestli vůbec) jsou ošetřeny nekonečné zacyklování vzájemně se volajících triggerů

Externí Odkazy editovat