Trigger (databáze)
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
[editovat | editovat zdroj]- 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é.
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.
[editovat | editovat zdroj]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 | editovat zdroj]- 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 | editovat zdroj]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 | editovat zdroj]- SQL – jak na triggery
- Aktivní databáze, triggery. Tomáš Hejl & Jiří Kunčar – vysvětlení pojmů a porovnání nejvýznamnějších implementací triggerů (Starburst DB, Oracle, DB2, Chimera, SQL Server)
- Mysql (46) – Triggery