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