Wydziaˇ Elektrotechniki, Informatyki i Telekomunikacji
Transkrypt
Wydziaˇ Elektrotechniki, Informatyki i Telekomunikacji
! " ! " # $ % & # " $ && ' $ %"&'! ( /011 2 /$ 3 )*+#, - . $ 45 $ $ ( & $ 45 1. Napisa wyzwalacz dla tabeli EMP, który sprawdza czy w polu SALARY nie wpisano bł dnie liczby ujemnej (zarobki pracownika nie mog by ujemne!). 2. Jak wiadomo w tabeli EMP mo liwe jest przechowywanie informacji o odległo ciach pracowników (kolumny ID oraz MANAGER_ID). Napisa wyzwalacz, który b dzie kontrolował, czy wpisywane dla danego pracownika zarobki nie s wi ksze ni zarobki jego bezpo redniego szefa. Poni ej pokazano cz danych z tabeli EMP. Wynika z niej, e pracownicy o numerach ID=20 oraz ID=21 nie mog zarabia wi cej ni 1100, gdy tyle zarabia ich bezpo redni przeło ony. Podobnie pracownicy o numerach ID=22 oraz ID=23 nie mog zarabia wi cej ni 1300. ID MANAGER_ID Imie, Nazwisko SALARY ---------- ---------- ------------------------------ ---------8 2 Ben Biri 1100 20 8 ..Chad Newman 750 21 8 ..Alexander Markarian 850 9 2 Antoinette Catchpole 1300 22 9 ..Eddie Chang 800 23 9 ..Radha Patel 795 3. Napisz wyzwalacz, który b dzie kontrolował (i ew. poprawiał), czy wpisuj c do tabeli EMP imi oraz nazwisko pracownika pierwsza litera jest du a (przykładowo imi "Marek" powinno zosta przyj te bez zmian a imi "marek" powinno zosta automatycznie skorygowane do postaci "Marek"). opracowali: dr in . Artur Gramacki, dr in . Jarosław Gramacki Bazy danych, ORACLE, PL/SQL 1 4. Do tabeli DEPT doda kolumn NUMBER_OF_EMP (poleceniem ALTER TABLE ...). Zadaniem tej kolumny b dzie przechowywanie informacji o aktualnej liczbie pracowników, którzy pracuj w danym dziale. Napisa wyzwalacz, który b dzie dbał o aktualno danych w tej kolumnie. Poni sze zapytanie wylicza liczb pracowników w poszczególnych działach. Utworzony wyzwalacz powinien automatycznie wylicza t liczb i uaktualnia kolumn NUMBER_OF_EMP. Powinien on uruchamia si w przypadku rejestrowania nowego pracownika, kasowania istniej cego pracownika lub te modyfikacji istniej cego. SELECT r.name "Region", d.name "Dział", count(*) "Liczba prac." FROM emp E, dept D, region R WHERE E.dept_id = D.id AND D.region_id = R.id GROUP BY D.name, D.region_id, R.name; Region -------------------North America North America North America South America Africa / Middle East Asia Europe North America South America Africa / Middle East Asia Europe Dział Liczba prac. ---------------- -----------Administration 2 Finance 1 Operations 4 Operations 3 Operations 3 Operations 2 Operations 3 Sales 2 Sales 1 Sales 1 Sales 2 Sales 1 12 wierszy zostało wybranych. 5. Napisa wyzwalacz, który b dzie sprawdzał, czy dane w tabelach ORD oraz ITEM s spójne. Je eli stwierdzona zostanie niespójno wyzwalacz powinien odpowiednio zmodyfikowa warto kolumny TOTAL w tabeli ORD. Zgodnie z logik modelu SUMMIT2 mamy, e kolumna ORD.TOTAL zawiera (powinna zawiera ) sumaryczn warto sprzeda y na danym zamówieniu. Jest ona ilo ciowo równa warto ci wszystkich zamówionych produktów, których szczegóły zapisane s w tabeli ITEM (czyli jest to suma wszystkich iloczynów ITEM.PRICE * ITEM.QUANTITY dla danego zamówienia). fragment tabel ORD fragment tabeli ITEM <pk> <fk> ITEM_ID ID ORD_ID TOTAL PRICE QUANTITY opracowali: dr in . Artur Gramacki, dr in . Jarosław Gramacki Bazy danych, ORACLE, PL/SQL 2 6. Zaprojektowa a nast pnie zaimplementowa (korzystaj c z odpowiednio zbudowanego wyzwalacza) mechanizm pozwalaj cy rejestrowa wszelkie operacje (w praktyce chodzi o INSERT, UPDATE, DELETE) wykonywane na tabeli EMP. Chodzi tu o rodzaj historii zmian zachodz cych w tabeli EMP. Poni ej pokazano przykład działania opisanego wy ej mechanizmu dla bardzo prostej tabeli TEST. Na pocz tek utwórzmy t tabel i wpiszmy do niej przykładowe dane: DROP TABLE test; CREATE TABLE test (id NUMBER, kol VARCHAR2(10)); INSERT INTO test VALUES (100, 'a'); INSERT INTO test VALUES (101, 'b'); INSERT INTO test VALUES (102, 'c'); SELECT * FROM test; Tabela TEST wygl da wi c nast puj co: ID KOL 100 a 101 b 102 c Tabela TEST_HIST rejestruj ca zmiany, które dokonuj si w tabeli TEST niech wygl da jak poni ej: ID KOL ID_HIST TYP DATA 100 a 1001 U 09-09-2003 100 aa 1002 U 12-10-2003 100 aaa 1003 U 15-10-2003 103 d 1004 I 12-11-2003 101 b 1005 U 25-11-2003 101 bb 1006 D 29-11-2003 100 aaaa 1007 D 01-12-2003 Zawiera ona wszystkie kolumny tabeli TEST plus kilka kolumn "systemowych", które zaznaczono szarym kolorem. Wida , e znajduje si w niej 7 rekordów. Rekordy te zostały wstawione automatycznie przez odpowiednio zaprojektowany wyzwalacz. S one efektem wykonania na tabeli TEST czterech operacji UPDATE jednej operacji INSERT oraz dwóch operacji DELETE: UPDATE UPDATE UPDATE INSERT UPDATE DELETE DELETE test test test INTO test FROM FROM SET kol='aa' WHERE id='100'; SET kol='aaa' WHERE id='100'; SET kol='aaaa' WHERE id='100'; test VALUES (103, 'd'); SET kol='bb' WHERE id='101'; test WHERE id=101; test WHERE id=100; SELECT * FROM test; Zwró my uwag na kolumn ID_HIST, która pozwala nam odtworzy kolejno dokonywanych w tabeli TEST zmian (liczby te najwygodniej generowa za pomoc sekwencji). opracowali: dr in . Artur Gramacki, dr in . Jarosław Gramacki Bazy danych, ORACLE, PL/SQL 3 Kolumna TYP przechowuje symbol wykonywanej operacji (U – UPDATE, I – INSERT, D – DELETE). Tabela TEST po wykonaniu powy szych operacji ma nast puj c zawarto : ID KOL 102 c 103 d Zwró my uwag , e dane tabel TEST_HIST mo na bardzo łatwo wykorzysta do wykonania operacji odtwarzaj cych pierwotny stan tabeli TEST (ang. undo). W poni szej tabeli pokazano operacje, które nale y wykona aby powróci do stanu pierwotnego: TYP D Operacja do wykonania INSERT INTO test VALUES (100, 'aaaa'); D INSERT INTO test VALUES (101, 'bb'); U UPDATE test SET id=101, kol='b' WHERE id='101'; I DELETE FROM test WHERE id='103'; U UPDATE test SET id=100, kol='aaa' WHERE id='100'; U UPDATE test SET id=100, kol='aa' WHERE id='100'; U UPDATE test SET id=100, kol='a' WHERE id='100'; Z kolei dzi ki kolumnie DATA mo na zrealizowa operacj automatycznego odtwarzani stanu tabeli TEST do okre lonego punktu w przeszło ci (ang. point in time recovery). Czy potrafiłby stworzy procedur PL/SQL która b dzie to realizowała? Zastanów si , czy równie prosto mo na zrealizowa problem odtwarzania do okre lonego punktu w przeszło ci stanu wielu powi zanych ze sob tabel (wi zami integralno ci FOREIGN KEY)? LITERATURA PL/SQL User's Guide and Reference – oryginalna dokumentacja doł czana do systemu ORACLE Oracle8i Supplied PL/SQL Packages Reference – oryginalna dokumentacja doł czana do systemu ORACLE Oracle8i Error Messages – oryginalna dokumentacja doł czana do systemu ORACLE Oracle8i SQL Reference – oryginalna dokumentacja doł czana do systemu ORACLE opracowali: dr in . Artur Gramacki, dr in . Jarosław Gramacki Bazy danych, ORACLE, PL/SQL 4