Databázové systémy 2 Cvičení č. 8 Ing. Tomáš Váňa (tomas.vana@student.upce.cz) Fakulta elektrotechniky a informatiky Univerzita Pardubice
Obsah cvičení Triggery nad tabulkami. Triggery nad pohledy („Insted of triggery“). Sekvence. Regulární výrazy. Výjimky. Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Sekvence Sekvence podle pravidel dokáže generovat požadovaná čísla. Sekvence generují jedinečná čísla v rámci všech transakcí v databázi. Výhodné využití pro umělé primární klíče. Často se ve užívají v kombinaci s triggerem. CREATE SEQUENCE [schema.]name [START WITH integer] [INCREMENT BY integer] [MAXVALUE integer|NOMAXVALUE] [MINVALUE integer|NOMINVALUE] [CYCLE|NOCYCLE] [CACHE integer|NOCACHE] [ORDER|NOORDER] Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Sekvence Příklad vytvoření sekvence: CREATE SEQUENCE CV8_MY_ID_SEQ START WITH 1 INCREMENT BY 1; Příklad použití sekvence v triggeru: create or replace TRIGGER GET_NEW_ID BEFORE INSERT ON MY_TABLE FOR EACH ROW BEGIN SELECT cv8_lide_seq.NEXTVAL INTO :new.id FROM dual; END; Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Vlastnosti triggerů Uvnitř triggeru můžeme používat tři logické funkce (INSERTING, UPDATING, DELETING), které umožní identifikovat, který příkaz inicioval spuštění triggeru. Vlastnost Chování INSERTING TRUE, jestliže se jedná o příkaz INSERT, jinak FALSE UPDATING TRUE, jestliže se jedná o příkaz UPDATE, jinak FALSE DELETING TRUE, jestliže se jedná o příkaz DELETE, jinak FALSE Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Vlastnosti triggerů Příklad využití: Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Regulární výrazy Regulární výraz je řetězec popisující celou množinu řetězců. Využití: Vyhledávaní textu (testovaní shody, zjištění pozice). Manipulace s textem (záměna textu, extrakce). Regularní výrazy v Oracle DB: Funkce: REGEXP_LIKE REGEXP_REPLACE REGEXP_SUBSTR REGEXP_COUNT REGEXP_INSTR Význam jednotlivých funkcí naleznete na: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_regexp.htm# Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Regulární výrazy Využití v rámci databáze: Vyhledávaní podle vzoru. SELECT first_name, last_name FROM employees WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$'); Formátování výstupu. SELECT names "names", REGEXP_REPLACE(names, '^(\S+)\s(\S+)\s(\S+)$', '\3, \1 \2') AS "names after regexp" FROM famous_people; Check constraint. CONSTRAINT c_contacts_pnf CHECK (REGEXP_LIKE (p_number, '^\(\d{3}\) \d{3}-\d{4}$')) Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Regulární výrazy REGEXP_LIKE Obdobná funkce jako LIKE. REGEXP_LIKE místo jednoduchého vzoru (%hledany_text%) využívá vyhledávání na základě vzoru zapsaného jako regulární výraz. Syntaxe: REGEXP_LIKE(zdrojovy_text, vzor) zdrojovy_text - text, ve kterém hledáme vzor – regulární výraz, který se aplikuje na zdrojový text. Tabulka zástupných znaků pro regulární výraz: http://download.oracle.com/docs/cd/B14117_01/appdev.101/b10795/adfns_re.htm#1006817 Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Regulární výrazy Příklady práce s regulárními výrazy v Oracle DB: http://orafaq.com/node/2404 http://www.adp-gmbh.ch/ora/sql/re/index.html http://psoug.org/reference/regexp.html Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Vytvořte všechny tabulky z přiloženého skriptu. (Skript naleznete na serveru projektu LEARN). Vytvořte sekvenci CV8_LIDE_SEQ. Vytvořenou sekvenci využijte v triggeru nad tabulkou CV8_LIDE. Trigger se bude jmenovat CV8_LIDE_ID a jeho úkolem bude automaticky doplňovat ID u nově vkládaných záznamů. Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Dále nad tabulkou vytvořte trigger CV8_LIDE_SMAZAT. Trigger zajistí zkopírování mazaného záznamu do tabulky CV8_LIDE_SMAZANI. Záznam nezapomeňte opatřit datem, kdy ke smazaní daného záznamu došlo (atribut datum_smazani). Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Stále nad tabulkou CV8_LIDE vytvořte trigger CV8_LIDE_VALIDACE. Trigger bude aktivován při vkládání a aktualizaci záznamů. Trigger zajistí: V případě, že jméno a příjmení nebudou zadány s velkým prvním písmenem, trigger provede opravu. Do tabulky je možné vložit jen osoby, starší 15 let. Pokud se někdo pokusí vložit osobu mladší 15 let, trigger musí vyvolat výjimku s textem: „Osoba je mladší 15 let“. Trigger vyvolá výjimku s textem „Měnit ID v tabulce cv8_lide je zakázané! “ v případě, že se někdo pokusí změnit hodnotu ve sloupci ID. Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Pokračování CV8_LIDE_VALIDACE: Trigger bude obsluhovat atribut validni, který bude udávat, zda daná osoba z tabulky má korektně vyplněny všechny informace. Za korektní vyplnění se považuje: Délka telefonního čísla je nejméně 9 znaků. Adresa má nejméně 10 znaků. Email obsahuje validní emailovou adresu. (využijte regulární výraz) Rodné číslo je ve správném formátu. (http://latrine.dgx.cz/jak-overit-platne-ic-a-rodne-cislo) V případě, že údaje budou korektně vyplněny, nastaví trigger atribut validní na 1, jinak 0. Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Nad tabulkou CV8_ZAJMY vytvořte trigger CV8_ZAJMY_SMAZAT. Trigger dovolí vymazat záznam z tabulky CV8_ZAJMY jen v případě, že daný zájem sdílí maximálně dva lidé. V takovém případě trigger zajistí smazaní záznamů i z tabulky CV8_LIDE_ZAJMY. Jinak vyvolá výjimku s textem „Daný zájem sdílí více než 2 osoby “. V tomto případě mazaní z tabulek neproběhne. Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Dále nad tabulkou CV8_ZAJMY vytvořte trigger CV8_ZAJMY_DML, který se bude zapisovat informace o DML operacích nad tabulkou CV8_ZAJMY. Každá DML operace bude zaznamenána do tabulky CV8_LOG_TABLE. Evidujte následující informace: Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Nad tabulkou CV8_ZAJMY vytvořte trigger CV8_ZAJMY_UPDATE, který zajistí, že změna ID v tabulce CV8_ZAJMY se promítne i do tabulky CV8_LIDE_ZAJMY. Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Nad tabulkou CV8_LIDE_ZAJMY vytvořte trigger CV8_LIDE_ZAJMY_DML s naprosto stejnou logikou jako CV8_ZAJMY_DML. Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Vytvořte pohled CV8_LIDE_ZAJMY_VIEW(ID_LID NUMBER, JMENO VARCHAR2, PRIJMENI VARCHAR2, ID_ZAJ NUMBER, ZAJEM VARCHAR2). Pohled by měl poskytovat následující výstup: Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Příklady Nad pohledem CV8_LIDE_ZAJMY_VIEW vytvořte trigger CV8_LIDE_ZAJMY_VIEW_TRG, který umožní měnit atributy jmeno, prijmeni a zajem. Ke změně hodnot atributů musí dojít v samotných zdrojových tabulkách. Databázové systémy 2 – cvičení 8
Databázové systémy 2 – cvičení 8 Cvičení 8 – kontrola Všechny databázové objekty z tohoto cvičení vytvořte se svém schématu. Pro splnění cvičení je nutné, aby všechny objekty byly správně vytvořeny a funkční do půlnoci dne před následujícím cvičením. Databázové systémy 2 – cvičení 8