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 BEGIN a END. 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
- 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. a NEW.
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
- 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ů
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