--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 vazajici se k modifikaci dat v tabulce. -- --Syntax: --CREATE [OR REPLACE] TRIGGER jmeno {BEFORE|AFTER|INSTEAD OF} --udalost ON tabulka [REFERENCING OLD AS o NEW AS n] [FOR EACH ROW] [WHEN (podminka)] --DECLARE --BEGIN -- Vas kod... --END; -- --Udalost muze vypadat jako OR nasledujicich moznosti: --DELETE --INSERT --UPDATE [OF sloupec, ...] -- --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; -- -- Smazani triggeru pomoci: -- DROP TRIGGER jmeno; -- Ukol c.1: Vytvorte trigger, ktery bude nastavovat ID knih -- Vyuzijte sekvenci, co jiz mame: seq_knihy_id CREATE OR REPLACE TRIGGER knihy_set_id ... -- Otestujte si funkcnost: INSERT INTO knihy (nazev) VALUES ('Testovaci'); DELETE FROM knihy WHERE nazev='Testovaci'; -- Vytvorte si tabulku uvazky. -- Eviduje procento uvazku pro zamestnance, ten jich muze mit vice. -- Tarif urcuje mzdu pri 1.0 uvazku. Osobni je osobni ohodnoceni a nezavisi -- na vysi uvazku. CREATE TABLE uvazky ( id_zam NUMBER NOT NULL REFERENCES zamestnanci, id NUMBER PRIMARY KEY, uvazek NUMBER CHECK (uvazek > 0 AND uvazek <= 1), tarif NUMBER NOT NULL, osobni NUMBER DEFAULT 0 NOT NULL, popis VARCHAR2(200) ); -- Ukol c.2: Vytvorte trigger, ktery pri zmene uvazku prepocita zamestnanci mzdu. -- Tj. aktualizujte hodnotu mzda v tabulce zamestnanci. -- Tip: Pro spravnou funkci pouzijte AFTER trigger. -- Tip2: Vypoctete si rozdil ve vysledne mzde a o nej zmente mzdu. CREATE OR REPLACE TRIGGER uvazky_vypocti_plat ... -- Otestujte si funkcnost: INSERT INTO zamestnanci VALUES (10, 'Michal', 0); INSERT INTO uvazky VALUES (10, 101, 0.5, 30000, 500, 'Programovani'); INSERT INTO uvazky VALUES (10, 102, 0.1, 20000, 0, 'Skoleni'); UPDATE uvazky SET uvazek=0.2 WHERE id=102; DELETE FROM uvazky WHERE id=102; DELETE FROM uvazky WHERE id_zam=10; DELETE FROM zamestnanci WHERE id=10; -- Ukol c.3: Vytvorte trigger, ktery kontroluje celkovy uvazek zamestnance. -- Ten nesmi prekrocit 1.0. -- Tip: Pro spravnou funkci pouzijte AFTER trigger. -- POZOR: Trigger nemuze byt FOR EACH ROW, ale FOR EACH STATEMENT. CREATE OR REPLACE TRIGGER uvazky_maximum ... -- Definovane triggery lze nalezt v user_triggers: SQL> SELECT trigger_name,table_name,trigger_type,triggering_event FROM user_triggers;