--Triggery -- --Trigger je kod, ktery je automaticky spusten pri nejake udalosti. Touto --udalosti mohou byt systemove akce typu prihlaseni apod. Pro bezne uzivatele --jsou nejdulezitejsi udalosti vazici se k modifikaci dat v tabulce. -- --Syntax: -- --CREATE [OR REPLACE] TRIGGER jmeno {BEFORE|AFTER|INSTEAD OF} --udalost [REFERENCING OLD AS o NEW AS n] [FOR EACH ROW] [WHEN (podminka)] --blok -- --Udalost muze vypadat jako OR nasledujicich moznosti: --DELETE --INSERT --UPDATE [OF sloupec, ...] --ON tabulka -- --INSTEAD OF triggery nas ted nezajimaji (slouzi pro pohledy), --BEFORE triggery jsou spousteny pred provedenim udalosti, --AFTER triggery jiz po provedeni udalosti. -- --Trigger je spusten budto jednou pri provadeni prikazu (default) nebo pro --kazdy meneny radek (FOR EACH ROW). -- --[Pro triggery typu FOR EACH ROW] --Pri zmene mam k dispozici promenne :new s novou hodnotou a :old s puvodni --hodnotou. BEFORE trigger muze menit hodnoty :new a tim ovlivnovat data. --(pokud se mi nelibi nazvy new a old (napr. koliduji s nazvy sloupcu), --mohu si je prejmenovat v klauzuli REFERENCING). -- --Trigger je spusten jen, je-li splnena podminka v casti WHEN. -- --Podminky: INSERTING, UPDATING, DELETING -- --IF INSERTING THEN . . . END IF; --IF UPDATING THEN . . . END IF; --IF DELETING THEN . . . END IF; DROP TABLE platy; CREATE TABLE platy(uco NUMBER, uvazek NUMBER, sazba NUMBER, plat NUMBER); -- Trigger pro aktualizaci platu podle sazby a uvazku: CREATE OR REPLACE TRIGGER Aktualizuj_plat BEFORE INSERT OR UPDATE ON platy FOR EACH ROW DECLARE BEGIN :new.plat:=:new.sazba*:new.uvazek; END; / SELECT * FROM platy; INSERT INTO platy VALUES (1,100,5,0); SELECT * FROM platy; -- Trigger pro hlidani, aby uvazek nebyl vyssi nez 200 CREATE OR REPLACE TRIGGER Hlidej_plat BEFORE INSERT OR UPDATE OF uvazek ON platy FOR EACH ROW DECLARE BEGIN IF :new.uvazek>200 THEN :new.uvazek:=200; END IF; END; / -- trigger opravi hodnotu uvazku na 200 pri vkladani INSERT INTO platy VALUES (3,500,400,0); SELECT * FROM platy; -- trigger opravi hodnotu uvazku na 200 pri ukatualizace jiz vlozene polozky UPDATE platy SET uvazek=400 WHERE uco=1; SELECT * FROM platy; -- Priklad: logovani zmeny platu DROP TABLE platy_log; CREATE TABLE platy_log(kdy DATE, uco NUMBER, puvodni NUMBER, novy NUMBER); CREATE OR REPLACE TRIGGER loguj_zmeny_platu AFTER INSERT OR DELETE OR UPDATE ON platy FOR EACH ROW DECLARE BEGIN INSERT INTO platy_log VALUES(sysdate,:new.uco,:old.plat,:new.plat); END; / -- spusteni trigerru INSERT INTO platy VALUES (4,100,10,0); SELECT * FROM platy_log; DROP TABLE platy_log2; CREATE TABLE platy_log2(kdy DATE, uco NUMBER, typ_zmeny VARCHAR2(20)); -- Trigger pro logovani typu upravy CREATE OR REPLACE TRIGGER loguj_zmeny AFTER INSERT OR DELETE OR UPDATE ON platy FOR EACH ROW DECLARE BEGIN if INSERTING then INSERT INTO platy_log2 VALUES(sysdate,:new.uco,'Insert'); end if; if UPDATING then INSERT INTO platy_log2 VALUES(sysdate,:old.uco,'Update'); end if; if DELETING then INSERT INTO platy_log2 VALUES(sysdate,:old.uco,'Delete'); end if; END; / -- spusteni trigerru INSERT INTO platy VALUES (5,100,10,0); UPDATE platy SET uvazek = 150 WHERE uco = 3; DELETE FROM platy; SELECT * FROM platy_log2;