Přednáška 9 Triggery
Triggery Pojmenovaný databázový objekt, vždy spojený s jednou tabulkou. Řadí se mezi uložené procedury spouštěné z MySQL. Triggery nejsou spouštěny přímo, ale na základě akce prováděné na přidružené tabulce. Triggery tak slouží pro automatické volání příkazů SQL nebo uložených procedur. Podle akce, která trigger implicitně spouští je dělíme na: Trigger vkládání. Trigger aktualizace. Trigger odstraňování.
Triggery Trigger je tedy definován v závislosti na své úloze spustit se při provedení příkazu INSERT, UPDATE nebo DELETE na přidružené tabulce. Trigger může být definován na spuštění buď před (BEFORE), nebo po (AFTER) provedení jednoho z výše uvedených příkazů. Například, trigger bude aktivován před vložením každého řádku na přidružené tabulce nebo po aktualizaci tohoto řádku. Každá tabulka může mít vždy pouze jeden trigger pro kombinaci události spuštění a doby spuštění.
Vytvoření triggeru Základní syntaxe CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body Trigger_name = vámi zvolené jméno triggeru Trigger_time = BEFORE nebo AFTER Trigger_event = INSERT, UPDATE nebo DELETE Tbl_name = název přidružené tabulky Trigger_body = blok příkazů těla triggeru
Trigger vkládání Tento trigger čeká na jakýkoliv příkaz INSERT, který chce vložit data do přidružené tabulky. Jakmile k tomu dojde, trigger provede příkazy, které má definovány ve svém těle. Příklad: CREATE TRIGGER after_insert_knihy AFTER INSERT ON knihy FOR EACH ROW BEGIN INSERT INTO stav VALUES(NEW.id, 0); END; Viz studijní opora Trigger je vhodné pojmenovat podle jeho funkce. Bude-li v těle triggeru více příkazů, je potřeba je uzavřít do bloku BEGIN/END. V těle triggeru můžeme přistupovat k hodnotám sloupců přidružené tabulky, jež byly měněny příkazem. NEW – nové hodnoty, OLD – staré hodnoty
Trigger vkládání Činnost triggeru: Akce triggeru Trigger je přidružen k tabulce knihy. Čeká až na této tabulce bude proveden příkaz INSERT. INSERT INTO knihy (id, id_autor, nazev, isbn) VALUES (NULL*, 1, 'Vánoce Hercula Poirota', '978-80-242-2255-4'); Akce triggeru Trigger příkaz INSERT zaznamená, přebere hodnotu nového id knihy NEW.id a po vložení dat do tabulky knihy vykoná příkaz definovaný ve svém těle. Otázka: Proč byl trigger definován jako AFTER a ne BEFORE? * V případě, že na poli PK je definována možnost Auto_Increment, nahradím hodnotu slovem NULL, MySQL doplní hodnotu PK samo
Trigger aktualizace Tento trigger čeká na jakýkoliv příkaz UPDATE, který chce editovat data v přidružené tabulce. Jakmile k tomu dojde, trigger provede příkazy, které má definovány ve svém těle. Úloha č. 1: Využijeme nyní doplňkový materiál k této přednášce, který obsahuje vám již známé tabulky. Vaším úkolem je vytvořit trigger, který při úpravě dat v tabulce motory, zkopíruje (vloží) původní data do tabulky motory_zaloha.
Řešení CREATE TRIGGER zalohuj_verzi_motoru BEFORE UPDATE ON motory FOR EACH ROW BEGIN INSERT INTO motory_zaloha VALUES(NULL, OLD.motor_id, OLD.typ, OLD.obsah, NOW()); END; Jelikož potřebujeme uložit původní data o motoru, musí být trigger spuštěn ještě před editací záznamu (BEFORE) a na původní hodnoty se můžeme odkázat aliasy OLD.
Trigger odstraňování Tento trigger čeká na jakýkoliv příkaz DELETE, který chce odstranit data v přidružené tabulce. Jakmile k tomu dojde, trigger provede příkazy, které má definovány ve svém těle. Úloha č. 2: Vaším úkolem je vytvořit trigger, který při odstranění automobilky, odstraní související data v tabulce auta a auto_motor.
Řešení CREATE TRIGGER odstran_referencni_data BEFORE DELETE ON automobilky FOR EACH ROW BEGIN DELETE FROM auto_motor WHERE au_id IN (SELECT au_id FROM auta WHERE auta.am_id = OLD.am_id); DELETE FROM auta WHERE am_id = OLD.am_id; END; Trigger je spuštěn jako BEFORE. Nejprve musíme odstranit data z tabulky auto_motor, protože potřebujeme id aut, kterých se to týká. Použili jsme pro to vnořený dotaz, kterým jsme id aut získali. V druhém kroku jsme odstranili i samotné vozy v tabulce auta. Pořadí musí být dodrženo, protože pokud bychom dříve odstranili auta, neměli bychom k dispozici jejich id pro odstranění v auto_motor. Vnořený dotaz
Použití a specifika triggerů Kontrola referenční integrity Přenesení zátěže na server (výhoda i nevýhoda zároveň) Triggery by neměly být poslední linie obrany v ověřování dat. Na webhostinzích bývají většinou zakázané . Nepodporují transakce. V jejich těle se mohou používat součástí PL/SQL (proměnné, podmínky, cykly, …) Trigger nevrací žádnou hodnotu, jako např. UP funkce.
Samostatně Procvičte si: Vytvořte POHLED, který bude vracet všechny automobily s benzínovými motory. Vytvořte TRIGGER, který při odstranění vozu z tabulky auta, odstraní záznam o tomto vozu z vazební tabulky auto_motor.
Zapamatujte si Co je to Trigger Typy Triggerů v MySQL Vazba na přidruženou tabulku Doba spuštění triggeru Aliasy OLD a NEW. Specifika použití triggerů.