Cviceni 8
--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;