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.
Ć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.
Dzięki za cały kurs. Brakuje tylko buttona do paypala :)
OdpowiedzUsuńwitam, prosiłbym o rozwiazanie do ćw. 2. Instead of nie działa przy tabelach. W jaki sposób można zablokować edycję?
OdpowiedzUsuńcreate or replace trigger ad2
OdpowiedzUsuń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;