"Po mém zásahu zůstane v databázi spoušť" aneb co jsou to triggery.
11.11.2005 07:00 | Petr Zajíc | přečteno 37274×
Další žádanou vymožeností, která přibyla do verze 5 databázového
stroje MySQL jsou triggery. Dnes se podíváme na to, co to přesně
triggery jsou a k čemu jsou v databázovém světě dobré. Bude to spíše
teoretické povídání s tím, že věci specifické pro MySQL budou
soustředěny do následujícího článku.
Především - existuje krásné české slovo, jímž se dá přeložit
anglické trigger - a to je spoušť. Moc se ale neujalo. Možná
proto, že zní tak nepořádně. Představte si třeba větu "po mojí úpravě
kódu zůstala v databázi pěkná spoušť". Protože tohle by asi většina
uživatelů slyšet nechtěla, budu používat spíš původní, anglické slovo
trigger.
Suchá definice pak praví, že trigger je uložená procedura, která se
spouští v souvislosti s provedením nějakého akčního dotazu na tabulce.
Pokud tuto definici trochu rozpitváme, dostaneme z ní následující
informace:
Triggery mají sice stejnou syntaxi jako uložené procedury, přesto se
od nich v lecčems liší. Tak především triggerům není možné předávat
žádné vstupní parametry. To znamená, že trigger nemá žádné informace o
tom, jak by měl být prováděn, které by se daly "zvenčí" přepínat za
chodu. Triggery navíc narozdíl od uložených procedur nemohou vracet
sadu záznamů. A navíc, databázové systémy mívají některá omezení a
příkazy, které se v triggerech nesmějí objevit. Pro MySQL platí, že se
v triggeru nesmí objevit přinejmenším tyto příkazy:
Na druhou stranu mají triggery oproti uloženým procedurám něco
navíc; mají totiž "vevnitř" přístup k datům, která se právě mění. To
například znamená, že trigger, který se spouští před aktualizací nějaké
tabulky má přístup k hodnotám těch řádků, které se snažíme změnit. Také
to znamená, že v triggeru můžete provést nějaké rozhodnutí v závislosti
na datech, která má tento trigger změnit.
Triggery se v tabulkách používají z několika důvodů. Ty mohou
souviset s konzistencí dat, s jejich správou a údržbou nebo s tím, jak
a kdy bude databáze komunikovat se svým okolím. Abyste měli určitou
představu, nastíním některé typičtější scénáře:
Typický scénář použití triggerů je tedy takový:
Poněkud kontroverzním tématem je použití triggerů jako centrálního
bodu pro vytvoření či správu aplikační logiky. Zastánci tohoto přístupu
tvrdí, že pomocí triggerů se v dnešní době ná naprogramovat prakticky
cokoliv a výsledek pak mohou používat všechny aplikace sdílející danou
databázi; odpůrci zase tvrdí, že databáze by měla sloužit jako úložiště
dat a pro správu aplikační logiky by měly sloužit aplikační servery.
Jak už to bývá, pravda je někde uprostřed. O tom, kolik toho budou
zajišťovat triggery budete muset nakonec rozhodnout ve svých aplikacích
sami.
Přestože triggery jsou ve spoustě situací velmi přínosné, měli byste vědět, že jsou s nimi spojena určitá úskalí. Především - každý trigger zabere nějakou dobu. Pokud budete mít triggerů více a/nebo pokud budou provádět časově dlouhé operace, můžete si snížit dobu odezvy databáze na akční dotazy. Rovněž triggery se obtížně ladí. Klasický akční dotaz změní data a skončí; trigger může data modifikovat, uložit jinam nebo operaci zakázat. Díky tomu bývá občas velmi obtížné zjistit, co se vlastně v databázi děje - a to je tím palčivější, čím více triggerů máte a čím složitější akce provádějí.