Wydział Elektrotechniki, Informatyki i Telekomunikacji
Transkrypt
Wydział Elektrotechniki, Informatyki i Telekomunikacji
Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Instrukcja do zajęć laboratoryjnych Nr ćwiczenia: 6 Temat: Wyzwalacze bazodanowe 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 podległ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). 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 opracował: dr inż. Artur Gramacki 1 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 tabeli ITEM fragment tabel ORD ITEM_ID <pk> <fk> ID ORD_ID TOTAL PRICE QUANTITY 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 Na początek utwórzmy tą tabelę i wpiszmy do niej przykładowe dane: TEST. 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; opracował: dr inż. Artur Gramacki 2 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). 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 z tabeli 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'; opracował: dr inż. Artur Gramacki 3 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)? opracował: dr inż. Artur Gramacki 4