|
![]() | Rutiny uložené na serveru | ![]() | Jazyk SQL a jeho implementace | Sekvence | ![]() |
Trigger je nástroj, který zajišťuje automatické provedení programu v jazyce SQL při vložení, zrušení nebo změně záznamu v určité tabulce. Trigger může například zajistit, že:
Triggery zjednodušují tvorbu aplikací, protože přenášejí část práce databázové aplikace na server. Umožňují centralizované definování pravidel platných pro informační systém. Existuje-li například v podnikovém informačním systému tabulka zaměstnanců, lze pomocí triggerů popsat, jaké všechny akce musí být provedeny při přijetí nebo propuštění zaměstnance, změně platu nebo přeřazení do jiného oddělení. Tyto akce se naprogramují na jednom místě, ale budou sloužit všem aplikacím, které manipulují s tabulkou zaměstnanců. Dodržení pravidel pro údržbu evidence zaměstnanců pak bude zajišťovat server automaticky a konzistence dat bude zajištěna bez ohledu na možné chyby v měnících se aplikacích.
Trigger je pojmenovaným objektem patřícím do databázové aplikace. Má tyto vlastnosti:
Při provedení konkrétní akce mohou být splněny podmínky pro spuštění více než jednoho triggeru. V takovém případě jsou spuštěny po řadě všechny. V současné podobně návrhu normy SQL 3 není zahrnut způsob, jak by uživatel v textu triggerů mohl definovat pořadí jejich spouštění. Je pravděpodobné, že před definitivní redakcí normy bude tento způsob specifikován a poté bude přidán i do 602SQL.
Provádění triggerů může měnit obsah databáze a tím spouštět další triggery. Spouštění triggerů se může do sebe libovolně zanořovat.
Při provádění triggerů se nekontrolují práva (triggery se provádějí s maximálními právy). Aby díky tomu nemohlo dojít k neoprávněnému přístupu k datům, může triggery vytvářet pouze uživatel obsazený do role Author
v aplikaci, do níž trigger patří. V zamčené aplikaci není tedy možné triggery vytvářet.
INSERT a UPDATE triggery se nespouštějí při importu dat do tabulky. DELETE triggery se nespouštějí při smazání tabulky jako objektu (při mazání záznamů samozřejmě ano). Spouštění triggerů při akcích vyvolaných aktivní referenční integritou závisí na nastavení příznaku kompatibility SQLOPT_NO_REFINT_TRIGGERS (4096)
Pro účely ladění může být výhodné trasovat spouštění triggerů (situace TRACE_TRIGGER_EXEC
), triggery lze také debugovat stejně jako procedury.
Trigger se vždy provádí jako součást transakce, v níž je spuštěn příkaz, který trigger spustil. Chyba, která případně nastane při provádění triggeru, má stejné důsledky, jako chyba ve spouštěcím příkazu - trigger nelze odvolat bez odvolání tohoto příkazu, příkaz nelze odvolat bez odvolání změn provedených triggerem.
Chyby kategorie "rollback exception condition", pokud se vyskytnou uvnitř triggeru, ignorují vnitřní deklarace handlerů (tj. handlery v triggeru a procedurách volaných tímto triggerem). Zachytit je lze pouze handlerem pro spouštěcí příkaz.
Uvnitř triggerů se nesmí provádět žádné explicitní transakční příkazy, v opačném případě nastane chybový sqlstate 2D000 (SQ_INVAL_TRANS_TERM).
Seznam subsekcí:
![]() | Rutiny uložené na serveru | ![]() | Jazyk SQL a jeho implementace | Sekvence | ![]() |