Triggery v ORACLE
Možnosť definovania TRIGGEROV prináša až štandard SQL3(schválený 1999). Avšak už dlhú dobu môžeme triggery v DB používať(DB2, ORACLE, INFORMIX, SYBASE). Každá databáza prichádza zo svojím riešením, ktoré sa medzi sebou navzájom trochu líšia. Líšia sa, tým čo umožňujú ale i syntaxou.
Triggery sú akési podprogramy, ktoré vieme zadefinovať pomocou SQL. Spúšťajú sa pri databázových operácia INSERT, UPDATE, DELETE. V triggeroch môžeme povedať čo sa má udiať pred, po alebo namiesto zvolenej operácie.
DB ORACLE má k prijatému štandardu najbližšie. (Narozdiel od JOINOv).
Syntax
V DB ORACLE môžete používať BEFORE, AFTER a INSTEAD OF triggery.
Vytvorenie triggera (CREATE TRIGGER)
CREATE [OR REPLACE] TRIGER <tigger_name>
(BEFORE|AFTER|INSTEAD OF) (INSERT|DELETE|UPDATE) [OF <trigger_column_list> ]
ON <table_name>
[REFERENCING OLD [AS] <old_name> NEW [AS] <new_name>]
[FOR EACH ROW]
[WHEN ( <condition> )]
BEGIN
<SQL_statement>
END
- [OR REPLACE]
- ak existuje trigger s menom <table_name> a uživateľ má na to práva, tak predefinuje tento trigger
<tigger_name>
- jednoznačné meno triggera
-
(BEFORE|AFTER|INSTEAD OF)
-typ triggera,
BEFORE -trigger sa spustí pred vykonaním operácie (INSERT|DELETE|UPDATE)
AFTER -trigger sa spustí po vykonaní operácie (INSERT|DELETE|UPDATE)
INSTEAD OF -trigger sa spustí na miesto vykonania operácie (INSERT|DELETE|UPDATE)
(čo znamená, že môžete napríklad urobiť trigger nad VIEWom, ktorý sa postará o nainsertovanie dát do príslušných tabuliek z ktorých je VIEW zložený)
- (INSERT|DELETE|UPDATE)
-trigger bude reagovat na zvolenú operáciu alebo operácie
- [OF <trigger_column_list> ]
-pri UPDATE operáciii môžeme uviesť zoznam stĺpcov, na zmenu ktorých má zareagovať trigger
-
<trigger_column_list>
-zoznam stĺpcom, na ktorých zmenu bude reagovať trigger
-
<table_name>
- meno tabuľky (v ORACLE aj VIEW viď vyššie) nad, ktoru bude bežať trigger
- [REFERENCING OLD [AS] <old_name> NEW [AS] <new_name>]
- nastavenie aliasov pre starú a novú hodnotu
-
<old_name>
- alias pre starú hodnotu
-
<new_name>
- alias pre novú hodnotu
- [FOR EACH ROW]
- táto klauzula hovorí, či sa trigger má vykonať zvlášť pre každý riadok, alebo iba raz
- [WHEN ( <condition> )]
- kľúčové slovo WHEN nám umožňuje špecifikovať za akých podmienok sa vykoná trigger
-
<condition>
- obmedenie pre trigger, podmienka, ktorá hovorí kedy sa uplatní trigger
-
<SQL_statement>
- SQL príkazy, ktoré sa majú vykonať pri triggery (INSERT,UPDATE,DELETE)
Zmazanie triggera (DROP TRIGGER)
Na zmazanie triggera slúži príkaz
DROP TRIGGER <tigger_name>
Aktivácia/deaktivácia triggera
Na aktiváciu/deaktiváciu triggera slúžia príkazy:
ALTER TRIGGER <tigger_name> ENABLE;
-aktivácia triggera <tigger_name>
ALTER TRIGGER <tigger_name> DISABLE;
-deaktivácia triggera <tigger_name>
ALTER TABLE <table_name> DISABLE ALL TRIGGERS;
-deaktivácia všetkých triggerov, ktoré sa viažu k tabuľke <table_name>
Príklady
Nasledujúci trigger zmení pole fullname z tabuľky AUTHUSER vždy keď sa zmení pole plnemeno v tabuľke ZTOSOBA
ORACLE:
CREATE TRIGGER FullNameU
AFTER UPDATE OF PlneMeno
ON ZTOsoba
REFERENCING NEW AS Zmena
FOR EACH ROW
UPDATE AUTHUser SET FullName = Zmena.PlneMeno WHERE id = Zmena.id
DB2 od IBM:
CREATE TRIGGER FullNameU
AFTER UPDATE OF PlneMeno
ON ZTOsoba
REFERENCING NEW AS Zmena
FOR EACH ROW MODE DB2SQL
UPDATE AUTHUser SET FullName = Zmena.PlneMeno WHERE id = Zmena.id
Vidíme, že syntax sa u týchto databáz veľmi nelíši, a že oba firmy sledovali vývoj štandardu SQL. Avšak DB2 nevie používať napr: kľúčové slovo INSTEAD OF.