sobota, 20 listopada 2010

Kurs Oracle PL/SQL. Wyzwalacze typu INSTEAD-OF


Na niektórych widokach nie można wykonywać operacji DML (kasowania, zmiany, dodawania wierszy) . Przykładem może być widok oparty o połączone tabele:



Ponieważ w tym widoku znajdują się dane pochodzące z dwóch tabel, nie mogę na nim wykonać operacji delete i muszę zastosować wyzwalacz typu instead-of.

Dane pochodzące z widoku:


 

Widzimy że w jednej lokalizacji może znajdować się więcej niż jeden departament. Teraz chciałbym, aby przy usuwaniu danego departamentu :
  • jeśli wybrany departament jest jedynym w lokalizacji, automatycznie powinna zostać skasowana również lokalizacja
  • jeśli w lokalizacji w której znajduje się wybrany departament znajdują się inne departamenty, to lokalizacja powinna zostać nienaruszona, natomiast powinien zostać usunięty departament.


Poniższy kod najpierw sprawdza ile jest departamentów w danej lokalizacji, a następnie w zależności od tego ile znajduje się departamentów w tej lokalizacji usuwa tylko departament, lub departament i lokalizację. Uwaga: ponieważ tabela locations powiązana jest kluczem obcym z tabelą countries, przed wykonaniem poniższego wyzwalacza należałoby poszerzyć kod o sprawdzanie zależności w tabeli countries. Poniższy przykład ma charakter pokazowy, dodawanie dodatkowego kodu sprawiłoby że przykład przestałby być czytelny.



Ćwiczenia



1.Stwórz tabelę logs zawierającą pola info typu varchar2(100), time typu date. Stwórz wyzwalacz który przy każdej operacji zmieniającej w jakikolwiek sposób dane w tabeli jobs, do tabeli logs została wprowadzona informacja o typie zmiany oraz czasie kiedy ta zmiana została wykonana.



2. Zablokuj przy pomocy wyzwalacza możliwość zmiany istniejących danych w tabeli employees w taki sposób by zmniejszona została wartość w kolumnie salary dla któregokolwiek wiersza.



3.Do tabeli employees dodaj kolumnę typu liczbowego o nazwie month_salary. Spraw by przy każdym insercie do tej tabeli uwzględniającym informacje o wypłacie (kolumna "salary"), do nowo stworzonej kolumny była wprowadzana 1/12 wartości salary. Jeśli żadne dane nie zostaną wprowadzone do kolumny salary, przechwyć obsługę błędu i wyświetl na konsoli informacje o brakujących danych.



 




Ten temat omawiam na poniższych szkoleniach:
• Programowanie w PL/SQL
• Podstawy SQL i PL/SQL
Możesz w nich uczestniczyć, a jako czytelnik tego bloga otrzymasz 10% zniżki - poinformuj o tym fakcie konsultanta.

3 komentarze:

  1. Dzięki za cały kurs. Brakuje tylko buttona do paypala :)

    OdpowiedzUsuń
  2. witam, prosiłbym o rozwiazanie do ćw. 2. Instead of nie działa przy tabelach. W jaki sposób można zablokować edycję?

    OdpowiedzUsuń
  3. create or replace trigger ad2
    before update on employees
    for each row
    begin
    if :new.salary < :old.salary then
    RAISE_APPLICATION_ERROR(-20000, 'Nie można zmniejszyć wypłaty.');
    end if;
    end;

    OdpowiedzUsuń