WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE.

Slides:



Advertisements
Podobne prezentacje
STRUKTURY DANYCH.
Advertisements

Podział i zastosowanie
Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np.
Wykład 3 Prowadzący: dr Paweł Drozda
Skrypty, procedury przechowywane i wyzwalane
Object-Relational Mapper for PHP
SQL – Strukturalny język zapytań
SQL INJECTION Wykorzystanie błędów w językach skryptowych
Bazy danych II Instrukcja SELECT Piotr Górczyński 25/08/2001.
Język SQL Część II.
BD-LAB4 Wojciech Pieprzyca
Bazy danych 8. SQL podstawy P. F. Góra semestr letni 2004/05.
Bazy danych II Instrukcja INSERT Piotr Górczyński 25/08/2001.
25/08/ Bazy danych II Piotr Górczyński Instrukcja UPDATE.
25/08/ Bazy danych II Piotr Górczyński MS Access – Action Query.
(c) 1999, Instytut Informatyki Politechniki Poznańskiej Rozdział 7: Relacje i ograniczenia integralnościowe Język definiowania danych - DDL (Data Definition.
Bezpieczeństwo Procedury składowane Funkcje i Wyzwalacze
ZSBD PL/SQL CZĘŚĆ 3 Wykład 5 Prowadzący: dr Paweł Drozda.
Język definicji danych (Data Definition Language)
Funkcje znakowe ASCII(znak IN VARCHAR2) RETURN INTEGER
ASCII(znak IN VARCHAR2) RETURN INTEGER zwraca wartość numeryczną kod ascii znaku CHAR(n Integer)zwraca znak odpowiadający kodowi n CONCAT(tekst1, tekst2)zwraca.
SQL select kredytobiorca,bank, rodzaj, data_zawarcia, klasyfikacja,kwota, terminzapadalnosci-data_zawarcia iledni from tab_kredyt where (terminzapadalnosci-data_zawarcia)>1095.
Ogólne jednostki programowe 1
Wykład 2 Wojciech Pieprzyca
BD-LAB6 Wojciech Pieprzyca
Wykład 1 Wojciech Pieprzyca
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Relacyjne Bazy Danych (Oracle) Prezentacja jest współfinansowana.
Typy wskaźnikowe, dynamiczne struktury danych
Podprogramy.
Typy złożone, case, stałe. Typ zbiorowy type typ_zb = set of typ_podstawowy; Typem podstawowym może być tylko typ porządkowy. Typem podstawowym może być
Język SQL – ciąg dalszy DML (Data Manipulation Language)
Język SQL (Structured Query Language) DDL (Data Definition Language)
Bezpieczeństwo baz danych
Przykład włamania do aplikacji internetowej poprzez modyfikację zapytań SQL Skrypty ASP Serwer bazy danych MS SQL Server Piotr Kuźniacki BDi.
Narzędzia do testowania
Schemat Hornera Mgr inż. Michał Szucki.
Bazy Danych II prowadzący: mgr inż. Leszek Siwik
SQL – Structured Query Language (3)
Delphi i Acad cd.. l_poz := MSpace.Count; Label3.Caption:=IntToStr(l_poz); ent:=Mspace.Item(0); for l_poz := 0 to MSpace.Count-1 do begin; ent:=Mspace.Item(l_poz);
Wyrażenia w Turbo Pascalu.
Instrukcje: CREATE, INSERT, UPDATE, DELETE, DROP
SQL – Structured Query Language (1)
MySQL bazy danych dla witryny
SQL - Structured Query Language
Zbiory i rekordy mgr inż. Agata Pacek. Deklaracja typu zbiorowego (określa ilość elementów w zbiorze) type biegi=set of 0..6; Definiowanie zmiennej typu.
Instrukcja warunkowa i wyboru
Jak zacząć w MS SQL? USE master; GO IF DB_ID (Nbaza') IS NOT NULL DROP DATABASE baza; GO CREATE DATABASE baza; GO USE baza; GO.
Wykład 5: Zaawansowany SQL
Składnia instrukcji warunkowej if…
Bazy Danych Wykład 7 Wojciech St. Mościbrodzki
PL/SQL – dalsza wędrówka
SQL – część II.
Temat 1: Strukturalny język zapytań SQL
1 SBD, L.Banachowski Podstawy SQL - języka relacyjnych i obiektowo-relacyjnych baz danych (SQL2, SQL'1999, Oracle) Powtórzenie wyk ł adu 3.
1 SBD, L.Banachowski Zaawansowane cechy SQL Powtórzenie wyk ł adu 5.
Autor: Damian Urbańczyk
Bazy Danych W06 Wojciech St. Mościbrodzki
1 SBD, L.Banachowski Oprogramowanie strony serwera cz. 1 Powtórzenie wyk ł adu 6.
Komendy SQL do pracy z danymi
SQL – JDD (DDL) Język definicji danych (Data Definition/Description Language)
1 Wykład Asercje, wyzwalacze i prawa. 2 Elementy aktywne bazy Chcielibyśmy, aby baza danych zapewniała nam pewne własności lub niezmienniki.
Wykład 3 Prowadzący: dr Paweł Drozda. Użytkownik bazy danych – osoba lub aplikacja, mająca dostęp do części danych zgromadzonych w bazie Uprawnienia –
Oracle Data Modeler (4.1) Tworzenie modelu danych – specyfikacja wymagań informacyjnych (na dane) Tworzenie modelu procesów – specyfikacja wymagań funkcyjnych.
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
Prototypowanie w ORACLE DESIGNER Projektowanie Bazy Danych.
Oracle Data Modeler (4.1). Aplikacja Wymagania biznesowe Tworzenie systemu informacyjnego Procesy Informacje Analiza Projektowanie Browser: Hollywood.
Oracle Data Modeler ( ) Wiele opcji dostępnych poprzez prawy przycisk myszy zarówno na elementach nawigatora obiektów (z lewej strony), jak i na.
1 Procedury i funkcje CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS.
Widoki (views) - Perspektywy:
DDL język definiowania danych
Zapis prezentacji:

WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE INSERT DELETE Wyzwalacze są najbardziej użyteczne przy wymuszaniu więzów integralności.

SKŁADNIA CREATE TRIGGER nazwa_triggera [BEFORE | AFTER [DELETE | INSERT | UPDATE | UPDATE OF lista_kolumn] [ ORDER integer ] ON nazwa_tablicy [ REFERENCING [ OLD AS STARA_nazwa ] [ NEW AS nowa_nazwa ]] [ FOR EACH { ROW | STATEMENT } ] [ WHEN (warunek) ] [ IF UPDATE ( nazwa_kolumny ) THEN [ { AND | OR } UPDATE (nazwa_kolumny ) ]... ] … złożone wyrażenie END IF ] ] BEGIN …… END

PRZYKŁAD : CREATE TRIGGER wprowadz before insert order 3on dba.PRACOWNICY REFERENCING NEW AS nowy_pracownik FOR EACH ROW BEGIN IF nowy_pracownik.identyfikator = any (select identyfikator from pracownicy) THEN message Nr pracownika musi być unikalny' type action to client; rollback trigger END IF; IF NOT nowy_pracownik.kod_dzialu =any (select kod_dzialu from kody_i_nazwy_dzialow) THEN message Taki dział nie istnieje' type action to client; rollback trigger END IF; IF year(now(*) – year(nowy_pracownik.data) < 18 THEN message Nie przyjmujemy niepełnoletnich type action to client; rollback trigger END IF; END

INNY PRZYKŁAD CREATE TRIGGER identyfikator AFTER INSERT on Pracownicy REFERENCING NEW AS new_id FOR EACH ROW BEGIN DECLARE err char (40); SET err='Nie wolno użyć takiego identyfikatora'; IF new_id.id_pr = 0000 then MESSAGE err TYPE ACTION TO CLIENT; ROLLBACK TRIGGER END IF END

PRZYKŁAD: W bazie istnieje tablica STAN(id, liczba zatrudnionych), w której pamiętana jest ilość załogi w każdym dziale. Informacja ta jest automatycznie aktualizowana po wstawieniu nowego pracownika do tablicy PRACOWNICY lub przy przeniesieniu pracownika do innego działu (update kod działu). Stan załogi w dziale nie może przekroczyć 100 osób. ALTER trigger zatrudnienie after insert, update of kod działu, delete on pracownicy referencing new as wstawiane old as usuwane for each row begin if inserting then begin if (select "liczba zatrudnionych" from stan where stan.id=wstawiane."kod działu")<101 then begin update stan set stan."liczba zatrudnionych"=stan."liczba zatrudnionych"+1 where wstawiane."kod działu"=stan.id end else begin message 'Blad' type action to client; rollback trigger; end end if end elseif deleting then begin update stan set stan."liczba zatrudnionych"=stan."liczba zatrudnionych"-1 where usuwane."kod działu"=stan.id end elseif updating then begin update stan set stan."liczba zatrudnionych"=stan."liczba zatrudnionych"+1 where wstawiane."kod działu"=stan.id; update stan set stan."liczba zatrudnionych"=stan."liczba zatrudnionych"-1 where usuwane."kod działu"=stan.id end end if; end

WYZWALACZE I TRANSAKCJE Operacje wykonywane w wyzwalaczu są przeprowadzane niejawnie jako część transakcji: 1.Uruchomione zostaje niejawnie polecenie BEGIN TRANSACTION (dla tabeli posiadającej wyzwalacze). 2.Następuje operacja INSERT, UPDATE lub DELETE. 3.Wywoływany jest wyzwalacz i wykonywane są jego polecenia. 4.Wyzwalacz albo cofa transakcję, albo transakcja jest niejawnie zatwierdzana.

Ograniczenia w stosowaniu wyzwalaczy: –Wyzwalacze nie mogą być tworzone dla tabel tymczasowych. –Wyzwalacze muszą być tworzone dla tabel w bieżącej bazie danych. –Wyzwalacze nie mogą być tworzone dla widoków. –Przy usuwaniu tabeli automatycznie usuwane są też wszystkie związane wyzwalacze.

Przykład bazy projektowanej na ćwiczeniach

W tej bazie jest wiele triggerów. Z każdą tablicą może być związany trigger działający na INSERT, sprawdzający poprawność wstawianych danych, Dodatkowo np. przy wstawianiu do tablicy Faktura nowej faktury, uzupełniana jest data wystawienia faktury (data bieżąca). Jeśli przy wstawianiu nie jest określona przez użytkownika data płatności, to również przyjęta jest ta data jako bieżąca. Użytkownik może wpisać samodzielnie datę płatności, ale musi to być maksymalnie data – do7 dni od daty wystawienia faktury (trigger sprawdza ten warunek). Przy rejestracji konkretnego zakupu (wstawieniu pozycji) trigger oblicza wartość sprzedawanego towaru (po ustaleniu jego ceny w tablicy TOWAR), dodaje tą kwotę do wartości całej faktury (aktualizując pole WARTOSC w tablicy FAKTURA) a także zmniejsza posiadaną ilość towaru aktualnie sprzedawanego (w tablicy TOWAR). Jeśli towar zostanie całkowicie wyprzedany lub jego zapas zmniejszył się poniżej ustalonego limitu, trigger komunikuje o tym fakcie.

Trigger, który ustala numer Klienta rejestrowanego w bazie, jeśli pole Nr_klienta nie jest incrementowane automatycznie: ALTER TRIGGER "Nadawanie numeru klienta" BEFORE INSERT ORDER 1 ON "DBA"."KLIENT" REFERENCING NEW AS nowy FOR EACH ROW BEGIN set nowy.nr_klienta= (select MAX(nr_klienta) from klient)+1 END

ALTER TRIGGER NOWA_FAKTURA BEFORE INSERT ORDER 1 ON FAKTURA REFERENCING NEW AS NOWA FOR EACH ROW BEGIN IF NOT EXISTS(SELECT * FROM KLIENT WHERE NR_KLIENTA=NOWA.NR_KLIENTA) THEN MESSAGE 'WPISZ NAJPIERW KLIENTA DO BAZY' TYPE ACTION TO CLIENT; ROLLBACK TRIGGER END IF; SET NOWA.NR_FAKTURY=(SELECT MAX(NR_FAKTURY) FROM FAKTURA)+1; SET NOWA.DATA_WYSTAWIENIA = NOW(); IF NOWA.DATA_PLATNOSCI IS NULL THEN SET NOWA.DATA_PLATNOSCI = NOW() ELSE IF NOWA.DATA_PLATNOSCI < NOW() OR NOWA.DATA_PLATNOSCI > (SELECT DATEADD (DAY, 7, NOW() ) ) THEN MESSAGE 'Bledna data, platnosc musi nastapic do 7 dni od daty wystawienia faktury' TYPE ACTION TO CLIENT; ROLLBACK TRIGGER END IF; END

ALTER TRIGGER NOWA_POZYCJA BEFORE INSERT ORDER 1 ON "DBA"."POZYCJA" REFERENCING NEW AS NOWA_POZ FOR EACH ROW BEGIN SET NOWA_POZ.WARTOSC_POZ=NOWA_POZ.ILOSC* (SELECT CENA_NETTO * ( 1 + VAT + MARZA )) FROM TOWAR WHERE KOD_T=NOWA_POZ.KOD_T); UPDATE TOWAR SET POSIADANA_ILOSC = POSIADANA_ILOSC – NOWA_POZ.ILOSC WHERE KOD_T=NOWA_POZ.KOD_T; IF (SELECT WARTOSC FROM FAKTURA WHERE NR_FAKTURY=NOWA_POZ.NR_FAKTURY) IS NULL THEN UPDATE FAKTURA SET WARTOSC=NOWA_POZ.WARTOSC_POZ WHERE NR_FAKTURY=NOWA_POZ.NR_FAKTURY; ELSE UPDATE FAKTURA SET WARTOSC=WARTOSC+ NOWA_POZ.WARTOSC_POZ WHERE NR_FAKTURY=NOWA_POZ.NR_FAKTURY END IF; MESSAGE 'Zaktualizowano stan towaru na magazynie i wartosc faktury' type action to client; END;

ALTER TRIGGER "sprawdzanie stanu" AFTER UPDATE ORDER 1 ON "DBA"."TOWAR" REFERENCING OLD AS PRZED NEW AS PO FOR EACH ROW BEGIN DECLARE NAZWA_BRAKU CHAR(20); SET NAZWA_BRAKU = (SELECT NAZWA_TOWARU FROM TOWAR WHERE KOD_T = PO.KOD_T); IF PO.POSIADANA_ILOSC = 0 THEN MESSAGE 'ZABRAKLO TOWARU: ',NAZWA_BRAKU TYPE ACTION TO CLIENT ELSE IF PO.POSIADANA_ILOSC < PO.MIN_ZAPAS THEN MESSAGE 'ILOSC TOWARU: ',NAZWA_BRAKU,' WYNOSI, PO.POSIADANA_ILOSC,' NORMA MINIMALNA TO ',PO.MIN_ZAPAS TYPE ACTION TO CLIENT END IF; end