602SQL-Úplná dokumentace Index  

Syntaxe popisu triggeru (SQL)

popis_triggeru ::= TRIGGER [schéma.]jméno_triggeru [ BEFORE | AFTER ] akce ON jméno_tabulky 
    [ reference ] [ granularita ] [ WHEN ( podmínka ) ] příkaz
akce ::= INSERT | DELETE | UPDATE [ OF [ pravidlo ] sloupec { , sloupec }… ] 
reference ::= REFERENCING { OLD [ ROW ] [ AS ] stará_řádka | NEW [ ROW ] [ AS ] nová_řádka }… 
granularita ::= FOR EACH { ROW | STATEMENT }
pravidlo ::= = | ANY

Jméno triggeru musí být unikátní v rámci aplikace. Jméno tabulky musí označovat tabulku existující v rámci stejné aplikace a sloupce musí být jména vybraných sloupců této tabulky. Specifikace INSERT, DELETE nebo UPDATE říká, při jaké operaci s obsahem tabulky bude trigger spuštěn. Jsou-li za UPDATE uvedena navíc jména sloupců, bude spuštěn pouze při operacích modifikujících tuto množinu sloupců, není-li seznam sloupců uveden, trigger se spustí při změně v kterémkoliv sloupci. Viz Spouštění UPDATE triggerů s uvedeným seznamem sloupců.

Identifikátory stará řádka a nová řádka umožňují odvolávat se v podmínce a v příkazu na obsah databázového záznamu před a po provedení akce, která trigger spustila. Zápis ve tvaru stará_řádka.sloupec resp. nová_řádka.sloupec označuje starou resp. novou hodnotu sloupce. Je-li uvedeno INSERT, nesmí být uvedena stará řádka, je-li uvedeno DELETE, nesmí být uvedena nová řádka, neboť tyto pojmy nemají v těchto případech smysl. Identifikátory stará řádka a nová řádka nesmí být stejné.

Specifikace FOR EACH ROW říká, že trigger bude spuštěn pro každý změněný řádek zvlášť. Specifikace FOR EACH STATEMENT říká, že bude spuštěn pouze jednou v rámci provádění celého SQL příkazu, při němž se mění více řádků najednou. Není-li uvedeno jedno ani druhé, míní se FOR EACH STATEMENT. Specifikace nové řádky a staré řádky je povolena pouze v případě, že je uvedeno FOR EACH ROW. Transientní tabulky triggerů (dočasné tabulky obsahující smazané nebo vložené záznamy) nejsou ve 602SQL zatím implementovány, proto se varianta triggerů FOR EACH STATEMENT nedá použít, potřebujete-li číst staré a nové hodnoty v měněných řádcích. V této verzi je proto doporučováno použít FOR EACH ROW vždy.

Při spuštění triggeru se nejprve vyhodnotí podmínka (je možné se v ní odkazovat i na staré a nové hodnoty měněných sloupců), a je-li splněná, provede se příkaz (jednoduchý nebo složený). V rámci podmínky ani příkazu nesmí být proveden příkaz otevírající nebo uzavírající transakci - chybový sqlstate 2D000 (SQ_INVAL_TRANS_TERM).

BEFORE trigger při svém provádění vidí v tabulce původní verzi dat, zatímco AFTER trigger vidí již změněnou verzi dat. Ostatní klienti vidí změny (způsobené příkazem SQL nebo triggery) až po uzavření transakce.

Příklad použití:

trigger zajistí, že při vkládání záznamu do tabulky Firmy bude sloupec nazev zapsán velkými písmeny

TRIGGER VelkaPismena AFTER INSERT ON Firmy
REFERENCING NEW ROW AS novaradka
FOR EACH ROW
BEGIN
 SET novaradka.nazev=UPPER(novaradka.nazev);
END

Viz