ITA-101 Bazy Danych Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9 Wersja 1.0 Procedury składowane i wyzwalacze Spis treści Procedury składowane i wyzwalacze ................................................................................................... 1 Informacje o module ............................................................................................................................ 2 Przygotowanie teoretyczne ................................................................................................................. 3 Przykładowy problem .................................................................................................................. 3 Podstawy teoretyczne.................................................................................................................. 3 Przykładowe rozwiązanie............................................................................................................. 8 Porady praktyczne ..................................................................................................................... 13 Uwagi dla studenta .................................................................................................................... 14 Dodatkowe źródła informacji..................................................................................................... 14 Laboratorium podstawowe ................................................................................................................ 16 Problem 1 (czas realizacji 10 min).............................................................................................. 16 Problem 2 (czas realizacji 10 min).............................................................................................. 17 Problem 3 (czas realizacji 15 min).............................................................................................. 18 Problem 4 (czas realizacji 10 min).............................................................................................. 19 Laboratorium rozszerzone ................................................................................................................. 21
21
Embed
Procedury składowane i wyzwalaczemath.uni.lodz.pl/~bleja/asb/ITA-101-Modul_09_v2.pdf · 3. Zapamiętanie procedury w bazie danych – nazwa procedury i jej kod (tzw. ciało procedury
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
ITA-101 Bazy Danych
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski
Moduł 9
Wersja 1.0
Procedury składowane i wyzwalacze
Spis treści
Procedury składowane i wyzwalacze ................................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przykładowo dla utworzonej wcześniej procedury składowanej p_pracownicy wywołanie będzie
wyglądało w następujący sposób:
EXEC p_pracownicy GO
Parametry procedur składowanych
Procedury składowane mogą przyjmować parametry wywołania. Ilość i typ danych, które należy
podać przy wywołaniu procedury składowanej, określamy w trakcie tworzenia procedury (używając
polecenia CREATE PROCEDURE). W zależności od tego, czy parametry będą potrzebne do
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 6/21
wykonania procedury, czy też mają być one przez procedurę zwrócone, wyróżniamy dwa rodzaje
parametrów: wejściowe (INPUT) oraz wyjściowe (OUTPUT).
Możliwe jest też zdefiniowanie w procedurze parametru przejściowego (będącego jednocześnie
wejściowym i wyjściowym), czyli parametru, którego wartość podajemy przy wywołaniu, a która
może zostać zmieniona podczas działania procedury.
CREATE PROCEDURE p_pracownicy @nazwisko varchar(40)='Smith' AS SELECT imie, nazwisko FROM Osoby WHERE nazwisko=@nazwisko GO
Zalety i wady procedur składowanych
Procedury składowane dzięki temu, że są zapisane na serwerze oraz dzięki skompilowanemu
planowi wykonania przechowywanemu w buforze procedur posiadają dwie zasadnicze zalety:
• zwiększają wydajność bazy danych
• ograniczają ruch w sieci (przesyłane są tylko nazwy procedur i wartości parametrów)
Ponadto procedury składowane mają kilka zalet z punktu widzenia programistów aplikacji
bazodanowych:
• Zapewniają jedną logikę biznesową dla wszystkich aplikacji klienckich.
• Przesłaniają szczegóły tabel w bazie danych (przezroczystość struktury dla zwykłego
użytkownika aplikacji).
• Umożliwiają modyfikację danych bez bezpośredniego dostępu do tabel bazy danych.
• Dostarczają mechanizmów bezpieczeństwa (można nadawać uprawnienia do wykonywania
procedur poszczególnym użytkownikom bazy danych).
• Umożliwiają programowania modularne (procedura zostaje zapisana w bazie danych, skąd
można ją wielokrotnie wywoływać; procedurę może pisać osoba wyspecjalizowana w bazach
danych – programista aplikacji jedynie ją wywoła).
• Zapewniają szybsze wykonanie (jeśli wymagane jest wykonanie dużej liczby zapytań,
procedury składowane są szybsze, ponieważ wykonują się na serwerze, są optymalizowane i
umieszczane w pamięci przy pierwszym wykonaniu).
• Zmniejszają ruch sieciowy (jeśli zachodzi potrzeba wykonania wielu zapytań w T-SQL na raz,
można je zastąpić wywołaniem jednej procedury składowanej).
Jeśli w ogóle można mówić o wadach procedur składowanych, to w zasadzie można wspomnieć o
kilku aspektach:
• Następstwem rekompilacji czasem jest zmniejszenie wydajności procedury (czyli
administrator baz danych musi wiedzieć, kiedy przeprowadzić rekompilację).
• W przypadku zagnieżdżania procedur składowanych należy pamiętać o tym, że zmienia się
kontekst wykonania (procedura zagnieżdżana wykonuje się z uprawnieniami innej
procedury).
• Wreszcie, aby tworzyć dobre (tzn. poprawnie działające) procedury składowane niezbędne
jest poznanie zaawansowanych mechanizmów języka programowania baz danych (np. T-
SQL), takich jak zmienne, funkcje i procedury systemowe czy obsługa błędów.
Wyzwalacze
Wyzwalacz (ang. trigger) jest specjalnym rodzajem procedury składowanej. W przeciwieństwie do
zwykłej procedury składowanej wyzwalacz nie może zostać jawnie wywołany.
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 7/21
Wyzwalacz jest wywoływany w reakcji na określone akcje. Akcje te to wykonanie przez użytkownika
określonego polecenia SQL (INSERT, UPDATE, DELETE) na danej tabeli, dla której został określony
wyzwalacz.
Tworzenie wyzwalaczy
Wyzwalacze tworzymy używając polecenia CREATE TRIGGER. W definicji wyzwalacza określamy:
• nazwę wyzwalacza
• dla jakiej tabeli tworzymy wyzwalacz
• na jakie akcje wyzwalacz będzie reagował
• jakiego typu wyzwalacz tworzymy
• ciało wyzwalacza (odpowiednik ciała procedury składowanej) – czyli kod wykonywany przez
wyzwalacz
W SQL Server 2008 istnieją trzy rodzaje wyzwalaczy:
1. Wyzwalacze obsługujące operacje DML (ang. Data Manipulation Language), czyli INSERT,
UPDATE oraz DELETE wykonywane na tabeli lub widoku.
CREATE TRIGGER [nazwa_schematu.]nazwa_wyzwalacza ON { table | view } [ WITH <dml_opcje_wyzwalacza> [,…n] ] { FOR | AFTER | INSTEAD OF } [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] [ WITH APPEND ] [ NOT FOR REPLICATION ] AS wyrazenie_sql [ ; ] [,…n] <dml_opcje_wyzwalacza> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ]
2. Wyzwalacze obsługujące operacje DDL (ang. Data Definition Language), czyli CREATE,
ALTER, DROP oraz pewne procedury składowane, które wykonują operacje DDL.
CREATE TRIGGER nazwa_wyzwalacza ON { ALL SERVER | DATABASE } [ WITH <ddl_opcje_wyzwalacza> [,…n] ] { FOR | AFTER } { rodzaj_zdarzenia | event_group } [,…n] AS wyrazenie_sql [ ; ] [,…n] <ddl_opcje_wyzwalacza> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ]
3. Wyzwalacze obsługujące zdarzenie logowania (LOGON), które jest wywoływane, kiedy
ustalana jest sesja logującego się użytkownika.
CREATE TRIGGER nazwa_wyzwalacza ON ALL SERVER [ WITH <opcje_wyzwalacza_logon> [,…n] ] { FOR | AFTER } LOGON AS wyrazenie_sql [ ; ] [,…n]
<opcje_wyzwalacza_logon> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ]
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 8/21
Zastosowanie wyzwalaczy
Wyzwalacze znajdują wiele zastosowań w bazach danych. Przede wszystkim stosujemy wyzwalacze
wszędzie tam, gdzie w inny sposób nie da się weryfikować integralności danych, a zwłaszcza ich
zgodności z regułami logiki biznesowej. Na przykład chcemy, by w pewnej kolumnie tabeli
wstawiane były tylko wartości unikalne, ale jednocześnie zezwalamy na wstawienie wartości NULL.
Jedynym rozwiązaniem jest użycie wyzwalacza, który sprawdzi, czy wstawiana właśnie wartość już
w danym polu wystąpiła, a jeżeli użytkownik wstawia wartość NULL, to wyzwalacz mu na to
pozwoli (tego efektu nie można osiągnąć innymi metodami, np. używając indeksów, ustawiając
właściwość unikalności kolumny lub używając kryteriów sprawdzających dane wstawiane w
kolumnę).
Drugie zastosowanie to wszelkiego typu automatyzacja zadań administracyjnych w bazie danych
(wszelkiego rodzaju „przypominacze”, obsługa nietypowych działań czy chociażby wysyłanie
wiadomości przez email lub pager).
Wreszcie z uwagi na pewne cechy wyzwalacze pozwalają na określony typ przetwarzania
transakcyjnego.
Przykładowe rozwiązanie
Tworzenie i uruchomienie procedury składowanej
W cel utworzenia nowej procedury składowanej należy z paska narzędziowego wybrać New Query i
wpisać kod procedury. Przykładowo:
CREATE PROCEDURE dbo.getAllCustomers AS BEGIN SELECT [CustomerID], [CompanyName] FROM [Northwind].[dbo].[Customers] END
Następnie należy wykonać skrypt wciskając F5 lub wybierając z paska narzędziowego Execute. Jeśli
procedura składowana została utworzona poprawnie, powinieneś otrzymać komunikat
„Command(s) completed successfully” oraz zauważyć, że została dodana nowa procedura
składowana w obszarze Object Explorer, w gałęzi Databases -> Northwind -> Programmability ->
StoredProcedures, co pokazano na rys. 3.
Jeśli procedury nie widać w wyżej wymienionej gałęzi, należy ją odświeżyć. Jeśli procedura jest już
utworzona, a mimo to zażądano kolejnego jej utworzenia, to otrzymamy następujący komunikat:
„There is already an object named ‘getAllCustomers’ in the databases”.
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 9/21
Rys. 3 Tworzenie nowej procedury
Aby uruchomić procedurę składowaną, wystarczy użyć polecenia EXECUTE (lub krócej EXEC).
Można także kliknąć prawym klawiszem myszki procedurę i wybrać Execute Stored Procedure, co
wywoła okienko, w którym można przekazać do procedury jakieś parametry. Na rys. 4 widać, że
rozwijane menu udostępnia także inne opcje, takie jak modyfikacja lub usunięcie.
Rys. 4 Wywołanie procedury
Inne metody tworzenia procedur składowanych
Inną metoda tworzenia procedury składowanej jest skorzystanie z gotowego schematu procedury.
W tym celu kliknij prawym przyciskiem myszy na gałęzi Stored Procedures i wybierz New
StoredProcedure – uzyskasz w ten sposób gotowy schemat procedury składowanej, co pokazano
na rys. 5.
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 10/21
Rys. 5 Tworzenie nowej procedury według wzorca
Procedury składowane a polisy
W SQL Server 2008 wprowadzono politykę opartą o Management Framework dla silnika SQL, dzięki
której zarządzanie serwerem będzie bardziej zautomatyzowane w oparciu o pewne reguły, a nie
skrypty.
Zadaniem DMF (z ang. Declarative Management Framework) jest umożliwienie administratorowi
zarządzania serwerami za pomocą definiowanych przez administratora reguł. W SQL Server 2008
mamy gotowe szablony reguł oparte o najlepsze praktyki zaimplementowane w narzędziu Best
Practices Analyzer, używanym przez administratorów z poprzednimi wersjami systemu SQL Server.
Korzystając z mechanizmu polis możemy stworzyć restrykcje dla procedur składowanych o postaci:
brak możliwości definiowania przez programistę bazy danych procedur składowanych z prefiksem
„sp_”. Restrykcję tę wprowadzimy na bazie danych Biblioteka.
W ramach Object Explorer rozwijamy zakładkę Management a następnie Policy Menagement. W
pierwszym kroku należy dodać warunki, jakie będą dołączone do polisy.
Jako pierwszy stwórzmy warunek, który będzie pilnował, żeby nazwa procedury składowanej nie
posiadała prefiksu „sp_”. Konfigurację tego warunku pokazano na rys. 6.
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 11/21
Rys. 6 Stworzenie warunku na procedurę składowaną
Następnie należy stworzyć warunek dotyczący bazy danych, na której polisa, którą za chwilę
założymy, będzie działała. Zostało to zilustrowane na rys. 7.
Rys. 7 Stworzenie warunku na bazę danych
W kolejnym kroku należy wystawić polisę i dodać do niej wcześniej stworzone warunki.
Konfiguracje wystawiania polisy pokazano na rys. 8.
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 12/21
Rys. 8 Założenie polisy
Kiedy mamy już wystawiona polisę i chcemy ją przetestować, powinniśmy kliknąć prawym
przyciskiem myszy bazę danych Biblioteka i wybrać New Query. Następnie w edytorze możemy
wpisać następujący kod, służący do utworzenia pustej procedury składowanej:
CREATE PROCEDURE sp_testowa AS GO
Zauważmy, ze wystąpił błąd. Procedura nie została utworzona, gdyż zadziałała restrykcja DMF, co
pokazano na rys. 9.
Rys. 9 Błąd procedury i zadziałanie polisy
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 13/21
Tworzenie wyzwalacza
Stwórzmy wyzwalacz, którego zadaniem będzie nie dopuścić do zalogowania wskazanego przez nas
użytkownika. W tym celu na początku dodajemy użytkownika zbd_user i kojarzymy go z bazą
danych AdventureWorks. Następnie tworzymy odpowiedni wyzwalacz, który nie pozwoli
użytkownikowi zalogować się do Microsoft SQL Server Management Studio. W tym celu klikamy
prawym przyciskiem myszy bazę AdventureWorks i z menu kontekstowego wybieramy New
Query. W oknie edycji zapytania wpisujemy następujący kod:
USE AdventureWorks GO CREATE TRIGGER trgRestrictUser ON ALL SERVER WITH EXECUTE AS 'sa' FOR LOGON AS BEGIN IF (ORIGINAL_LOGIN() = 'zbd_user' AND APP_NAME() = 'Microsoft SQL Server Management Studio') ROLLBACK; END
Aby przetestować działanie utworzonego wyzwalacza, uruchamiamy drugą instancję SQL Server
Management Studio. W oknie Connect to Server Authentication wybieramy SQL Server
Authentication, w polu Login wpisujemy zbd_user, a w polu Password – user. Następnie klikamy
Connect. W efekcie powinien pokazać się błąd logowania jak na rys. 10.
Rys. 10 Bład logowania
Porady praktyczne
Procedury składowane
• W Microsoft SQL Server przy kontroli poprawności kodu procedury w trakcie jej tworzenia
serwer nie sprawdza, czy istnieją obiekty (tabele, widoki), do których procedura się
odwołuje. Sprawdzenie to następuje dopiero przy wykonaniu procedury (w przypadku
odwołania do nieistniejącego obiektu procedura zgłosi błąd).
• Rekompilacja procedury składowanej nie oznacza utworzenia procedury na nowo. Oznacza
utworzenie nowego planu wykonania i zapisanie go do bufora procedury na miejsce
poprzednio skompilowanego planu tej samej procedury.
• Systemowe procedury składowane w systemie Microsoft SQL Server 2008 są
przechowywane w bazie master, zaś w ich nazwach pojawia się prefiks „sp_”.
• Zgodnie z dobra praktyka programowania baz danych, procedury składowane użytkownika w
SQL Server 2008 nie powinny zaczynać się od prefiksu „sp_”. Prefiksem tym obarczone są
systemowe procedury składowane. W sytuacji kiedy kompilator zobaczy procedurę
składowaną o takiej nazwie, będzie jej szukał w procedurach systemowych jako tych, które
już są skompilowane, a ich plan wykonania jest zapamiętany w buforze procedur. Dopiero
kiedy jej tam nie znajdzie zacznie ją kompilować według poznanego schematu. Spowoduje to
wydłużenie czasu wykonania procedury składowanej.
Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski Moduł 9
ITA-101 Bazy danych Procedury składowane i wyzwalacze
Strona 14/21
• Stworzenie polisy, która nie pozwoli programiście utworzyć procedury składowanej
zaczynającej się od prefiksu „sp_” spowoduje, że pierwsza próba stworzenia procedury o
takiej nazwie pociągnie za sobą konieczność uruchomienia sprawdzenia polisy, a zatem czas
wykonania polecenia nieznacznie się wydłuży. Kolejna próba stworzenia procedury
niezgodnej z polisą spowoduje natychmiastowe wyświetlenie komunikatu o naruszeniu
restrykcji.
• Z punktu widzenia bezpieczeństwa fizycznej struktury bazy danych procedury składowane
stanowią dodatkowy poziom izolacji pomiędzy warstwą aplikacji dostępowej do bazy danych
a warstwą fizyczna bazy danych.
• Poprzez zastosowanie procedur składowanych możemy uniknąć jednego z
najpopularniejszych ataków na bazę danych, tzw. Wstrzykiwania kodu SQL z racji tego iż w
sieci pomiędzy bazą danych a aplikacją dostępową nie jest przesyłany kod SQL tylko nazwa
procedury składowanej wraz z jej parametrami.
Wyzwalacze
• Wyzwalacze mogą być tworzone bezpośrednio w Microsoft SQL Server 2008 Database
Engine za pomocą zwykłych zapytań napisanych w języku T-SQL lub poprzez specjalne
metody w Microsoft .NET Framework Common Language Runtime (CLR), które po
utworzeniu importowane są do instancji serwera bazodanowego.
• Microsoft SQL Server 2008 pozwala na tworzenie wielu wyzwalaczy dla specyficznego
zdarzenia.
• Do tworzenia wyzwalaczy potrzebne są specjalne uprawnienia w bazie danych.
• Następujące instrukcje języka T-SQL nie są dozwolone w wyzwalaczach DML: ALTER