Wyzwalacze bazy danych - zadania

 

1.      Napisz wyzwalacz, który będzie automatycznie przyznawał kolejne identyfikatory nowym zespołom. Przetestuj działanie wyzwalacza z poniższymi poleceniami.

 

INSERT INTO ZESPOLY(NAZWA) VALUES('KRYPTOGRAFIA');

1 wiersz został utworzony.

 

INSERT INTO ZESPOLY(NAZWA) SELECT substr('NOWE '||NAZWA,1,20) FROM ZESPOLY
WHERE ID_ZESP in (10,20);

2 wiersze zostały utworzone.

 

2.      Dodaj do relacji ZESPOLY atrybut LICZBA_PRACOWNIKOW. Napisz zlecenie SQL które zainicjuje początkowe wartości atrybutu. Napisz wyzwalacz, który będzie pielęgnował wartość tego atrybutu. Przetestuj działanie wyzwalacza.

 

ALTER TABLE ZESPOLY ADD (LICZBA_PRACOWNIKOW NUMBER);

 

UPDATE ZESPOLY Z

SET LICZBA_PRACOWNIKOW =

( SELECT COUNT(*) FROM PRACOWNICY WHERE ID_ZESP = Z.ID_ZESP );

 

SELECT * FROM zespoly;

 

   ID_ZESP NAZWA                ADRES                LICZBA_PRACOWNIKOW

---------- -------------------- -------------------- ------------------

        10 ADMINISTRACJA        PIOTROWO 3A                           2

        20 SYSTEMY ROZPROSZONE  PIOTROWO 3A                           7

        30 SYSTEMY EKSPERCKIE   STRZELECKA 14                         4

        40 ALGORYTMY            WLODKOWICA 16                         1

        50 BADANIA OPERACYJNE   MIELZYNSKIEGO 30                      0

 

INSERT INTO pracownicy(ID_PRAC,NAZWISKO,ID_ZESP,ID_SZEFA)

VALUES(300,'NOWY PRACOWNIK',40,120);

1 wiersz został utworzony.

 

SELECT * FROM zespoly;

 

   ID_ZESP NAZWA                ADRES                LICZBA_PRACOWNIKOW

---------- -------------------- -------------------- ------------------

        10 ADMINISTRACJA        PIOTROWO 3A                           2

        20 SYSTEMY ROZPROSZONE  PIOTROWO 3A                           7

        30 SYSTEMY EKSPERCKIE   STRZELECKA 14                         4

        40 ALGORYTMY            WLODKOWICA 16                         2

 

 

UPDATE PRACOWNICY SET ID_ZESP = 10 WHERE ID_ZESP = 30;

4 wiersze zostały zmodyfikowane.

 

SELECT * FROM zespoly;

 

   ID_ZESP NAZWA                ADRES                LICZBA_PRACOWNIKOW

---------- -------------------- -------------------- ------------------

        10 ADMINISTRACJA        PIOTROWO 3A                           6

        20 SYSTEMY ROZPROSZONE  PIOTROWO 3A                           7

        30 SYSTEMY EKSPERCKIE   STRZELECKA 14                         0

        40 ALGORYTMY            WLODKOWICA 16                         0

 

 

1.      Stwórz relację HISTORIA o schemacie (ID_PRAC, PLACA_POD, ETAT, ZESPOL, MODYFIKACJA). Napisz wyzwalacz, który po każdej modyfikacji płacy podstawowej, etatu lub zespołu będzie wpisywał wartości historyczne do relacji HISTORIA.

 

CREATE TABLE HISTORIA (

  ID_PRAC NUMBER,

  PLACA_POD NUMBER,

  ETAT VARCHAR2(20),

  ZESPOL VARCHAR2(20),

  MODYFIKACJA DATE);

 

UPDATE PRACOWNICY SET PLACA_POD = 800 WHERE NAZWISKO = 'KROLIKOWSKI';

DELETE FROM PRACOWNICY WHERE NAZWISKO = 'HAPKE';

 

SELECT * FROM HISTORIA;

 

   ID_PRAC  PLACA_POD ETAT                 ZESPOL               MODYFIKACJ

---------- ---------- -------------------- -------------------- ----------

       150     658,41 ADIUNKT              SYSTEMY ROZPROSZONE  13-12-2001

       230        480 ASYSTENT             SYSTEMY EKSPERCKIE   13-12-2001

 

2.      Utwórz perspektywę SZEFOWIE(SZEF, PRACOWNICY) zawierającą nazwisko szefa i liczbę jego podwładnych. Napisz procedurę wyzwalaną która umożliwi usuwanie szefów (wraz z kaskadowym usunięciem wszystkich podwładnych danego szefa) za pomocą powyższej perspektywy.

 

SELECT * FROM szefowie;

 

SZEF            PRACOWNICY

--------------- ----------

BLAZEWICZ                1

BRZEZINSKI               5

MORZY                    2

SLOWINSKI                2

WEGLARZ                  3

 

SELECT * FROM pracownicy WHERE id_prac = 140 OR id_szefa = 140;

 

   ID_PRAC NAZWISKO    ETAT       ID_SZEFA ZATRUDNI PLACA_POD PLACA_DOD  ID_ZESP

---------- ----------- ---------- -------- -------- --------- ---------- -------

       140 MORZY       PROFESOR        130 75/09/15       830       105       20

       190 MATYSIAK    ASYSTENT        140 93/09/01       371                 20

       200 ZAKRZEWICZ  STAZYSTA        140 94/07/15       208                 30

 

DELETE FROM szefowie WHERE szef='MORZY';

 

SELECT * FROM pracownicy WHERE id_prac = 140 OR id_szefa = 140;

nie wybrano żadnych wierszy