Programowanie baz danych Transact SQL, procedury składowane, wyzwalacze. Procedury składowane (stored procedures) definiowane przez użytkownika



Podobne dokumenty
Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Administracja i programowanie pod Microsoft SQL Server 2000

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Wykład 8. SQL praca z tabelami 5

15. Funkcje i procedury składowane PL/SQL

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

PODSTAWY BAZ DANYCH 13. PL/SQL

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

LAB 6 BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL,

Składowane procedury i funkcje

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Transakcje inf. podstawowe

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Programowanie po stronie serwera w SZBD. Robert A. Kłopotek Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

BAZY DANYCH Cz III. Transakcje, Triggery

W SQL Serwerze 2008 wprowadzono parametry tablicowe (Table Valued Parameters - TVP).

Bloki anonimowe w PL/SQL

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

Struktura bazy danych

Wyzwalacze (triggery) Przykład

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Sprawdzenie poziomu izolacji transakcji (w aktualnym połączeniu):

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

Zaawansowane bazy danych i hurtownie danych semestr I

na MS SQLServer 2005 i 2008

Systemowe aspekty baz

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

P o d s t a w y j ę z y k a S Q L

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Microsoft SQL Server Podstawy T-SQL

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Wykład 05 Bazy danych

PL/SQL. Zaawansowane tematy PL/SQL

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

SQL 4 Structured Query Lenguage

050 SQL ELEMENTY ZAAWANSOWANE. Prof. dr hab. Marek Wisła

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Cele. Definiowanie wyzwalaczy

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Bazy danych 10. SQL Widoki

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Wykład 5. SQL praca z tabelami 2

Obowiązuje od wersji

Oracle11g: Wprowadzenie do SQL

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X

SQL (ang. Structured Query Language)

BAZA DANYCH SIECI HOTELI

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Oracle PL/SQL. Paweł Rajba.

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Język PL/SQL Procedury i funkcje składowane

Przykładowa baza danych BIBLIOTEKA

Hurtownia Świętego Mikołaja projekt bazy danych

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Aspekty aktywne baz danych

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

CREATE TABLE autorzy ( id_autora SERIAL PRIMARY KEY, imie TEXT, nazwisko TEXT );

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

Tworzenie zapytań do Microsoft SQL Server

Monika Sychla Daniel Smolarek Projekt bazy danych

Bazy danych 6. Klucze obce. P. F. Góra

Bazy danych SQL Server 2005

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Systemowe aspekty baz danych

Elementy. języka SQL

Procedury i funkcje składowane

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

CREATE USER

Język SQL, zajęcia nr 1

Paweł Rajba

SQL Server. Odtwarzanie baz danych.

Autor: Joanna Karwowska

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

SQL :: Data Definition Language

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Ćwiczenia 2 IBM DB2 Data Studio

Microsoft SQL Server. Tradycyjna architektura klientserwer. Przeniesienie części logiki na serwer. Programowanie Transact SQL

Administracja i programowanie pod Microsoft SQL Server 2000

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Obsługa błędów w SQL i transakcje. Obsługa błędów w SQL

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Transkrypt:

Programowanie baz danych Transact SQL, procedury składowane, wyzwalacze Procedury składowane i wyzwalacze będą omówione na przykładzie rozwiązao przyjętych w języku Transact SQL w systemie Microsoft SQL Server. Inne systemy zarządzania bazami danych mają swoje proceduralne rozszerzenia języka SQL, np. w Oracle jest to PL/SQL, w PostgreSQL PL/pgSQL. Wiele systemów umożliwia pisanie procedur w językach zewnętrznych, np. w Javie, czy językach.net (Microsoft SQL Server 2005 i 2008). Procedury składowane (stored procedures) definiowane przez użytkownika Procedury składowane to procedury zawierające kod w języku związanym z konkretnym systemem zarządzania bazami danych. Jak już wspomniano w systemie Microsoft SQL Server język ten nazywa się Transact-SQL (T-SQL). Transact SQL jest rozszerzeniem standardu SQL zawierającym instrukcje sterowania przebiegiem programu takie jak np. if, pętla while. Oprócz procedur T-SQL daje możliwośd pisania własnych funkcji. Zalety procedur przechowywanych Współużytkowanie logiki aplikacji Ukrywanie przed użytkownikami szczegółów tabel Mechanizmy zabezpieczeo Zmniejszanie ruchu w sieci Składnia w T-SQL CREATE PROC[EDURE] nazwa_procedury [ ( @nazwa_parametru typ_danych [=wartość_domyślna] [OUTPUT] [...] )] instrukcje_transact_sql; Przykład CREATE PROCEDURE lista_na_litere ( @litera_1 char ) SELECT Nazwisko, Imie FROM Pracownicy WHERE Nazwisko LIKE @litera_1+ % ORDER BY Stawka DESC Wykonanie procedury przechowywanej z parametrami: EXECUTE nazwa @par1=wartość, @par3=wartość EXECUTE nazwa wartość1, wartość2, wartość3 Zamiast EXECUTE można pisad EXEC 1

EXEC nazwa wartość1, wartość2, wartość3 Parametry wyjściowe Procedura składowana może mied parametry wyjściowe. W deklaracji parametru musi się pojawid słowo kluczowe OUTPUT. Poniższa procedura wylicza za jaką kwotę sprzedano książkę o identyfikatorze przekazanym jako pierwszy argument procedury. Sumowanie jest realizowane dla wszystkich faktur, zawierających tę książkę. Wyliczona kwota przekazywana jest przez drugi argument, który jest zadeklarowany jako wyjściowy (OUTPUT) CREATE PROCEDURE p_jakasprzedazksiazki ( @IDksiazki int = 0, @Kwota money OUTPUT ) SELECT @Kwota = SUM(Cena*Ilosc) FROM SzczegolyFaktury WHERE IDKsiazki = @IDKsiazki Słowo kluczowe OUTPUT musi wystąpid również przy wywołaniu procedury. Przykład poniżej. declare @xxx money exec p_jakasprzedazksiazki 14, @xxx output Zagnieżdżanie procedur przechowywanych W procedurze składowanej może wystąpid wywołanie inne procedury składowanej, np: CREATE PROCEDURE p_wywolaj_jakasprzedazksiazki ( @IDKsiazki int ) DECLARE @Kwota_sumaryczna money EXEC p_jakasprzedazksiazki @IDKsiazki, @Kwota_sumaryczna OUTPUT SELECT @kwota_sumaryczna GO EXEC p_wywolaj_jakasprzedazksiazki 125 Zadania 2

Zadanie 1 Napisz procedurę składowaną, która wypisze nazwy tych produktów z tabeli Products w bazie danych Northwind, które mają najwyższą cenę (cena przechowywana jest w polu UnitPrice). Zadanie 2 Napisz procedurę składowaną, która do tabeli BestCustomer (należy ją wcześniej utworzyd) wpisze dane klienta lub klientów (z tabeli Customers), który (którzy) złożył (złożyli) zamówienia na największą kwotę, przy czym chodzi tu o sumę kwot na wszystkich zamówieniach odbiorców. Informacja o zamówieniach znajduje się w tabelach Orders i [Order Details]. Procedura wpisze do tabeli dane jednego klienta lub kilku, gdyby zdarzyło się, że kilku złożyło zamówienia na identyczną największą kwotę. Zadanie 3 Zmodyfikuj procedurę z zadania 2 tak, by do tabeli BestCustomers wpisane były dane nie tylko klientów, którzy zamówili na największą kwotę, ale również tych, którzy złożyli zamówienia na kwotę drugą i trzecią od góry. Funkcje definiowane przez użytkownika W T-SQL można korzystad ze sporej liczby funkcji zdefiniowanych w systemie, można też definiowad funkcje użytkownika. Są dwa typy funkcji: skalarne, zwracające pojedyncze wartości, funkcje zwracające zestawy wierszy (rowset). Funkcje skalarne Składnia (uproszczona) CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [] scalar_parameter_data_type [ = default ] } [,...n ] ] ) RETURNS scalar_return_data_type [ WITH < function_option> [ [,]...n] ] [ ] function_body RETURN scalar_expression < function_option > ::= { ENCRYPTION SCHEMABINDING } Przykład (Books Online) CREATE FUNCTION CubicVolume -- Input dimensions in centimeters 3

(@CubeLength decimal(4,1), @CubeWidth decimal(4,1), @CubeHeight decimal(4,1) ) RETURNS decimal(12,3) -- Cubic Centimeters. RETURN ( @CubeLength * @CubeWidth * @CubeHeight ) Wywołanie funkcji: SELECT *, MyUser.MyScalarFunction() FROM MyTable Funkcje zwracające zestawy wierszy (multivalued) Składnia CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [] scalar_parameter_data_type [ = default ] } [,...n ] ] ) RETURNS @return_variable TABLE < table_type_definition > [ WITH < function_option > [ [,]...n ] ] [ ] function_body RETURN < table_type_definition > :: = ( { column_definition table_constraint } [,...n ] ) Tego typu funkcje są mocniejszą alternatywą dla widoków. Widok może zawierad tylko zdanie SELECT, ponadto nie może byd parametryzowany. Funkcje zwracające zestaw wierszy mogą mied rozbudowaną logikę. Przykład (Books Online): CREATE FUNCTION LargeOrderShippers ( @FreightParm money ) RETURNS @OrderShipperTab TABLE ( ShipperID int, ShipperName nvarchar(80), OrderID int, ShippedDate datetime, Freight money ) INSERT INTO @OrderShipperTab SELECT S.ShipperID, S.CompanyName, O.OrderID, O.ShippedDate, O.Freight FROM Shippers S INNER JOIN Orders O ON S.ShipperID = O.ShipVia WHERE O.Freight > @FreightParm RETURN 4

Wywołanie funkcji: SELECT * FROM dbo.largeordershippers( $500 ) Wywołanie systemowych funkcji, które zwracają zestawy wierszy wymaga użycia prefiksu :: przed nazwą funkcji: SELECT * FROM ::fn_helpcollations() Funkcje zwracające zestawy wierszy (inline) Tego typu funkcje mają funkcjonalnośd widoków sparametryzowanych. Rozważmy następujący widok (przykład z Books Online): CREATE VIEW vw_customernamesinwa SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers WHERE Region = 'WA' Taki widok wybiera dane tylko z regionu WA. Gdybyśmy chcieli użyd parametru zamiast stałej WA, musimy utworzyd funkcję typu inline. CREATE FUNCTION fn_customernamesinregion ( @RegionParameter nvarchar(30) ) RETURNS table RETURN ( SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers WHERE Region = @RegionParameter ) GO -- Example of calling the function for a specific region SELECT * FROM fn_customernamesinregion(n'wa') GO Klauzula RETURNS zawiera tylko słowo TABLE, natomiast po RETURN należy w nawiasach umieścid zdanie SELECT, wykorzystujące parametr bądź parametry funkcji. 5

Transact SQL, przegląd wybranych konstrukcji języka Zmienne typów prostych Deklarowanie zmiennych prostych DECLARE @nazwa typdanych Przypisanie wartości do zmiennej SELECT @nazwa = wartość Inny sposób: SET @nazwa = wartość lub: SELECT @nazwa = Tabela.pole, Tabela.pole2 FROM Tabela WHERE lub: SET @nazwa = (SELECT FROM Tabela WHERE ) Zmienne typów tablicowych DECLARE @nazwa TABLE (tu definicja pól tak jak w zwykłej tabeli) Zmiennej takiej można użyd tak, jakby to była tabela, np. w zdaniu SELECT w klauzuli FROM. Przykład: declare @a table (i int, a char) insert into @a values (1,'a') insert into @a values (2,'b') select * from @a Podstawowe instrukcje CE Są dwie wersje CE. Pierwsza wersja: CE input_expression WHEN when_expression THEN result_expression [...n ] [ ELSE else_result_expression ] Druga wersja: 6

CE WHEN Boolean_expression THEN result_expression [...n ] [ ELSE else_result_expression ] Przykład wykorzystania pierwszej wersji: CREATE PROCEDURE p_uaktualnijcenyproduktów UPDATE Produkty SET Cena = CE VAT WHEN 0 THEN Cena * 1.10 WHEN 7 THEN Cena * 1.05 ELSE Cena RETURN Przykład wykorzystania drugiej wersji: CREATE PROCEDURE p_uaktualnijcenyksiążek UPDATE Ksiazki SET Cena = CE WHEN Cena <=10 THEN (Cena * 1.10) WHEN Cena >10 And Cena <=20 THEN (Cena * 1.05) ELSE (Cena) RETURN Powyższa procedura aktualizuje pole Cena w tabeli Ksiazki zgodnie z regułą, że książki o bieżącej cenie mniejszej lub równej 10 zdrożeją o 10%, książki o bieżącej cenie powyżej 10, ale mniejszej bądź równej 20 zdrożeją o 5%, cena pozostałych książek nie ulegnie zmianie. IF ELSE CREATE PROCEDURE p_pokaztytuły @PoczatekTytulu varchar(255)=null IF @PoczatekTytulu <> SELECT Tytul, Cena From Ksiazki WHERE Tytul LIKE @PoczatekTytulu + % ORDER BY Cena DESC ELSE SELECT Tytul, Cena FROM Ksiazki ORDER BY Tytul Składnia: IF warunek_logiczny instrukcja T-SQL ELSE instrukcja T-SQL 7

Uwaga! Jeśli ma byd wykonana grupa instrukcji, zamiast pojedynczej instrukcji T-SQL, należy użyd nawiasów : IF warunek_logiczny instrukcje T-SQL... ELSE instrukcje T-SQL... W warunku logicznym można stosowad konstrukcję EXISTS (SELECT...), zwracającą wartośd PRAWDA, jeśli SELECT zwraca rekordy. WHILE CREATE PROCEDURE p_aktualizujśredniącenę WHILE (SELECT Avg(Cena) From Ksiazki ) < 20 UPDATE Ksiazki SET Cena = Cena * 1.1 RETURN Składnia: WHILE wyrażenie_logiczne instrukcja T-SQL..., BREAK, CONTINUE, RETURN CREATE PROCEDURE p_aktualizujśredniącenęlimitmax WHILE (SELECT Avg(Cena) From Ksiazki ) < 20 UPDATE Ksiazki SET Cena = Cena * 1.1 IF (SELECT Max(Cena) FROM Ksiazki) > 30 BREAK powoduje przerwanie pętli ELSE CONTINUE --powoduje przejście do początku pętli RETURN Powyższa procedura będzie podnosiła cenę wszystkich książek o 10% tak długo, jak średnia cena książki jest mniejsza od 20 lub cena chociaż jednej książki przekroczy 30.... obejmują blok instrukcji Transact SQL, blok taki można traktowad jak pojedynczą instrukcję CONTINUE powoduje przeskok do początku pętli. BREAK przerywa wykonywanie pętli. RETURN przerywa wykonywanie procedury. Instrukcja ta może byd użyta w formie RETURN wyrażenie 8

co powoduje, że do miejsca wywołania procedury przekazana jest wartośd wyrażenia. Pobranie tej wartości w miejscu, gdzie procedura jest wywoływana jest realizowane w sposób następujący: EXECUTE @zmienna = nazwa_procedury Obsługa błędów cz. 1 Funkcja @@ERROR zwraca numer błędu ostatnio wykonanej instrukcji T-SQL (w bieżącym połączeniu) lub wartośd zero, jeśli wykonanie instrukcji zakooczyło się powodzeniem. Ze względu na to, że wartośd @@ERROR jest ustalana po każdej instrukcji T-SQL, jeśli chcemy tę wartośd przetestowad później, to należy ją przypisad do jakiejś innej zmiennej. RAISERROR( komunikat,poziom_błędu,stan) z użyciem funkcji RAISERROR można zgłosid błąd w systemie MS SQL Server. Poziomy błędów są od 1 do 25. Parametr stan może byd wykorzystany w przypadku, gdy w wielu miejscach może byd zgłoszony ten sam błąd. Parametr stan może służyd do rozróżniania takich miejsc (poprzez nadanie wartości z zakresu 1..126). RAISERROR ma jeszcze inne sposoby wywołania (patrz Books Online). CREATE PROCEDURE p_wstawnazwedziału @NazwaDzialu varchar(50) As IF @NazwaDzialu <> INSERT INTO Działy (N_Działu) VALUES (@NazwaDzialu) IF @@ERROR <>0 RAISERROR( Nie powiodło się dopisanie, 16,1) RETURN Transakcje w T-SQL Początek transakcji: TRAN[SACTION] Koniec transakcji zapisanie zmian COMMIT [TRAN[SACTION]] Wycofanie zmian koniec transakcji ROLLBACK [TRAN[SACTION]] TRANSACTION IF @@ERROR = 0 9

ELSE PRINT Transakcja zakończyła się powodzeniem COMMIT TRANSACTION RAISERROR( Nastąpił błąd,16,34) ROLLBACK TRANSACTION Oczywiście jeśli pewna instrukcja w transakcji zakooczy się błędem, to nie musimy testowad zmiennej @@ERROR i wykonywad jawnie instrukcji ROLLBACK, i tak transakcja będzie wycofana. Jednak powyższa konstrukcja powoduje coś więcej - w tym przypadku zgłaszany jest komunikat, że wystąpił błąd w ostatniej instrukcji transakcji, lub wyświetlany jest napis, że transakcja zakooczyła się powodzeniem. Istnieje możliwośd zatwierdzenia części transakcji (do miejsca określanego jako SAVEPOINT). Podobnie można wycofad tylko częśd transakcji (do miejsca określanego jako SAVEPOINT). Szczegóły opisane są w Books Online. 10

Procedury wyzwalane (wyzwalacze, triggers) Wyzwalacze bardzo ważnymi obiektami wykorzystywanymi w programowaniu baz danych. Zostały włączone dopiero do standardu ANSI SQL99, jednak producenci systemów zarządzania bazami danych znacznie wcześniej wprowadzili wyzwalacze w swoich rozszerzeniach języka SQL. Dlatego w różnych systemach wyzwalacze działają nieco inaczej, inaczej się je również definiuje. W systemie Microsoft SQL Server procedury wyzwalane typu AFTER (ze wzgledów historycznych słowo AFTER można zastąpid słowem FOR) umożliwiają wykonywanie pewnych akcji automatycznie po skasowaniu, aktualizacji lub wstawieniu rekordów. Wyzwalacze typu INSTEAD OF wykonują coś zamiast operacji, która spowodowała uruchomienie wyzwalacza. Wyzwalacze można definiowad z użyciem zdao Transact SQL lub w programie Management Studio przez kliknięcie prawym przyciskiem myszki na nazwie tabeli. Przykłady zastosowao wyzwalaczy: realizacja logiki biznesowej, dbanie o spójnośd zdenormalizowanej bazy, realizacja nietypowych więzów integralności danych, realizacja nietypowych więzów integralności referencyjnej. Termin logika biznesowa jest używany w odniesieniu do ograniczeo i reguł, jakie nakładane są na bazę a wynikają ze specyfiki działania firmy czy organizacji, dla której baza została zaprojektowana. Na przykład do reguł działania firmy może należed ustalanie rabatów w zależności od ilości zakupionego towaru. Pobranie towaru z magazynu może składad się z wielu operacji, wynikających z założonych zasad działania firmy. Na przykład można sprawdzad czy ilośd towaru jest wystarczająca i po obniżeniu tej ilości poniżej pewnej granicy można sprzedawad tylko ograniczoną ilośd dla jednego odbiorcy, przy okazji automatycznie może byd generowane zapytanie o cenę do dostawców, może byd realizowany wybór dostawcy i złożone zamówienie na dostawę tego towaru. Logika biznesowa może byd realizowana przez odpowiednie procedury składowane, ale automatyczne wykonywanie procedur po zmianie danych w bazie jest realizowane przez wyzwalacze. Spójnośd danych w zdenormalizowanych tabelach może byd również zapewniona przez odpowiednie wyzwalacze. Jeśli dane są powtarzane w wielu miejscach, to zmiana danych w jednym miejscu powinna pociągnąd za sobą automatyczną zmianę we wszystkich pozostałych miejscach. Można to realizowad przez wyzwalacze. Inny przykład będzie dotyczył rozważanego już w podrozdziale 4.5 problemu zmieniających się cen wypożyczania filmów. Przedstawione tam rozwiązanie trzecie polegało na tym, że bez zmian pozostawała tabela Filmy, zawierająca pola {Tytuł, Reżyser, Cena}, przy czym przechowywana była tylko bieżąca cena. Jednocześnie w tabeli Wypożyczenia dodane zostało pole Cena_wypożyczenia tabela ta zawierała pola {Id_klienta, Id_kasety, Cena_Wypożyczenia, Data_wypożyczenia, Termin_zwrotu, Data_Zwrotu}. Przy wypożyczeniu 11

kasety należy dopisad wiersz do tabeli Wypożyczenia. Cena_wypożyczenia powinna byd automatycznie pobierana z tabeli Filmy po wpisaniu pozostałych danych! Osoba dopisująca nie powinna mied możliwości dopisywania dowolnej Ceny_wypożyczenia, gdyż mogłaby wtedy wpisywad wartości niezgodne z cennikiem zawartym w tabeli Filmy. Jest tu pole działania dla wyzwalaczy. To właśnie wyzwalacz będzie odpowiedzialny za wpisanie odpowiedniej ceny pobranej z tabeli Filmy. Wyzwalacze mogą dbad o nietypowe reguły integralności danych, takie, których nie można zrealizowad przez warunek ograniczający CHECK. W warunku CHECK nie można np. odwoływad się do wartości z innych baz danych, w wyzwalaczach można to robid, można nawet odwoływad się do wartości z bazy na innym serwerze. W wyzwalaczach można też zapisywad bardziej skomplikowane reguły, niż można to zrobid w warunku CHECK. Na przykład, jeśli mamy pewien przepis na to, z jakim stanowiskiem związana jest jaka liczba dni urlopu, to możemy napisad wyzwalacz, który automatycznie po zmianie stanowiska pracownika zmieni mu liczbę przysługujących dni urlopu. Oczywiście ktoś mógłby powiedzied, że liczba dni urlopu nie powinna byd przechowywana w tabeli, jeśli mamy regułę określającą tę liczbę. Wówczas liczba dni urlopu mogłaby byd wyliczana na bieżąco poprzez widoki. Ponadto w MS SQL Serwerze jest też możliwośd definiowania pól wyliczeniowych bezpośrednio w tabeli. Jednak te metody zawiodą, jeśli reguła wyliczania urlopu zmienia się i nie wszyscy pracownicy podlegają jednej regule. Wtedy pozostają tylko wyzwalacze. Wyzwalacze mogą dbad również o więzy integralności referencyjnej, w tym więzy inne niż standardowe. Więzy integralności referencyjnej były omówione w rozdziale drugim. Standardowe więzy można włączyd w zdaniu CREATE TABLE w klauzuli REFERENCES (lub FOREIGN KEY) przy definiowaniu tabeli po stronie wiele połączenia. Tak włączone więzy nazywane są więzami deklaratywnymi (DRI Declarative Referential Integrity). Inny sposób realizacji integralności referencyjnej polega na skonstruowaniu odpowiednich wyzwalaczy. W wyzwalaczach można dbad o inne reguły niż podane w rozdziale drugim. Przypominam, że w skrócie mówiąc włączenie DRI powoduje, że system nie dopuści do wykonania żadnej operacji, która spowodowałaby, że w tabeli po stronie wiele połączenia pojawi się rekord osierocony, tzn. nie posiadający odpowiednika w tabeli po stronie jeden. Jednak przy użyciu DRI nie można np. wymóc, by w polu łączącym tabeli po stronie wiele można było wpisywad wartości, które są w pewnej tabeli lub w jakiejś innej tabeli. Przez DRI można odwoływad się tylko do jednej tabeli po stronie jeden. Wyzwalacze nie mają takich ograniczeo. Na przykład przy użyciu wyzwalaczy można spowodowad, by do pola Id_pracownika w tabeli Zwolnienia_chorobowe można było wpisywad wartości z pola Id_pracownika z tabeli Pracownicy lub z tabeli Kierownicy. Albo na przykład można wpisywad do tabeli Szczegóły_sprzedaży do pola Id_towaru wartości pochodzące z tabeli Samochody lub Motocykle. DRI nie daje takich możliwości. Uwaga. Jeśli w tabeli są warunki ograniczające typu CHECK oraz włączone są więzy integralności referencyjnej i zdefiniowane są wyzwalacze, to najpierw wykonywane jest sprawdzanie warunków CHECK oraz DRI, potem dopiero uruchamiane są wyzwalacze. Zatem jeśli wyzwalacze mają kontrolowad integralnośd danych lub integralnośd referencyjną, to nie należy tworzyd warunków CHECK, ani nie należy włączad DRI. Uproszczona składnia dla wyzwalacza typu AFTER. 12

CREATE TRIGGER nazwa_wyzwalacza ON nazwa_tabeli [WITH ENCRYPTION] { { {FOR AFTER} { [INSERT] [,UPDATE] [,DELETE] } instrukcja_t-sql } { {FOR AFTER} { [INSERT] [,UPDATE]} IF UPDATE (nazwa_pola) [ { AND OR UPDATE (nazwa_pola) [...]] instrukcja_sql [...] } } instrukcja_t-sql oznacza instrukcję Transact-SQL. Można umieścid więcej instrukcji T-SQL ujmując je między słowa kluczowe oraz. IF UPDATE (nazwa_pola) powoduje sprawdzenie, czy pole zostało zmodyfikowane. WITH ENCRYPTION zapobiega wyświetlaniu treści wyzwalacza przez systemową procedurę składowaną sp_help, za pomocą której normalnie można treśd wyzwalacza wyświetlid. Pseudotabele inserted i deleted Podczas operacji wstawiania i kasowania rekordów w wyzwalaczach dostępne są pseudotabele o nazwach inserted oraz deleted. Jeśli zostały skasowane wiersze z tabeli, dla której zdefiniowany jest wyzwalacz typu AFTER DELETE, to skasowane wiersze znajdują się w tabeli deleted. Jeśli zostały wstawione wiersze do tabeli, dla której zdefiniowany został wyzwalacz typu AFTER INSERT, to nowo dopisane wiersze znajdują się w również tabeli inserted. Natomiast jeśli zostały zmodyfikowane wiersze w tabeli, dla której zdefiniowany został wyzwalacz typu AFTER UPDATE, to wiersze w postaci przed modyfikacją znajdują się w tabeli deleted, w wiersze w postaci po modyfikacji znajdują się w tabeli inserted. Uwaga. NIE MA tabeli o nazwie UPDATED!! Przykłady będą podane poniżej. Użycie transakcji w wyzwalaczach (triggerach) W wyzwalaczach zaimplementowane są mechanizmy transakcji. Bez jawnego udziału użytkownika jest definiowany początek transakcji. W każdym miejscu w wyzwalaczu można transakcję wycofad. Transakcją objęta jest również operacja, która spowodowała uruchomienie wyzwalacza. 13

Zatem jeśli w wyzwalaczu wykonana zostanie instrukcja ROLLBACK, to wycofane zostaną wyniki nie tylko wszystkich operacji już w wyzwalaczu wykonanych, ale również wycofana zostanie ta operacja, która wyzwalacz uruchomiła. Usuwanie i blokowanie działania wyzwalacza Procedurę wyzwalaną można usunąd wykonując polecenie DROP TRIGGER nazwa. Procedurę wyzwalaną można zablokowad/odblokowad wykonując polecenie ALTER TABLE tabela {ENABLE DISABLE } TRIGGER {ALL nazwa [, ] } 14