Trigger
Trigger je [[Procedury|procedura]] uložená na [[Databázové systémy|databázovém serveru]], která je automaticky spouštěna po nějaké události na základě spouštěcí podmínky.
[!tldr] - Trigger je procedura, která se automaticky pouští po události v [[Databázové systémy|databázi]] - Používá se na komplexnější [[Integritní omezení|integritní omezení]] či přesunutí části logiky do prostoru databáze. - Syntaxe je hodně závislá na použitém [[Databázové systémy|DBMS]]
CREATE TRIGGER jmeno
BEFORE | AFTER | INSTEAD OF udalost ON tabulka
[REFERENCING <referencni_promenne> AS <jmena>]
[FOR EACH ROW | FOR EACH STATEMENT]
WHEN (...)
[AS]
akce
Spouštění triggeru
BEFOREtrigger pracuje s databází před provedení dotazu- Výhodné pro validace vstupních dat
- Doplňování dat
AFTERtrigger pracuje s databází po provedení dotazu,- Výhodné pro aplikační logiku
Granularita
- Trigger na úrovni příkazu (
FOR EACH STATEMENT) je aktivován jednou pro celý příkaz - Trigger na úrovni řádku (
FOR EACH ROW) je aktivován pro každý modifikovaný řádek
[!faq] Co když bude množina modifikovaných řádků prázdná? V tom případě se trigger na úrovni příkazu provede jednou, zatímco trigger na úrovni řádku se neprovede ani jednou.
Makes sense.
Referenční proměnné
Referenční proměnné jsou takové proměnné, které odkazují na modifikované [[Databázový objekt|databázové objekty]] (řádky, tabulky, ...)
| Akce | Trigger na úrovni příkazu | Trigger na úrovni řádku |
|---|---|---|
INSERT |
new_table |
new_row, new_table |
DELETE |
old_table |
old_row, old_table |
UPDATE |
new_table, old_table |
new_row, new_table, old_row, old_table |
[!example] Příklad ON DELETE CASCADE referenční integrity pomocí triggeru na úrovni řádku
CREATE TRIGGER tr_cascade1 AFTER DELETE ON Studenti REFERENCING old_row AS 0 FOR EACH ROW DELETE FROM Prihlasky WHERE Prihlasky.sID = 0.sID [!example] Příklad ON DELETE CASCADE referenční integrity pomocí triggeru na úrovni příkazu ```sql CREATE TRIGGER tr_cascade2 AFTER DELETE ON Studenti REFERENCING old_row AS 0 FOR EACH STATEMENT DELETE FROM Prihlasky WHERE Prihlasky.sID IN (SELECT sId FROM OT)