Czym są procedury składowane

Transkrypt

Czym są procedury składowane
Bazy danych
Procedury składowane
185
186
Bazy danych
Przegląd zagadnień
Czym sa procedury skladowane
Praca z procedurami skladowanymi
Zalety i wady procedur skladowanych
Podsumowanie
Laboratorium
W tym wykładzie dowiesz się czym są procedury składowane i jakie
korzyści niesie ich wykorzystywanie w bazach danych.
Bazy danych
187
Czym są procedury składowane
Proces wykonania zapytania SQL
Wykonywanie procedur skladowanych
Rekompilacja procedur skladowanych
Procedura składowana (ang. stored procedure) jest nazwanym
zbiorem zapytań w języku SQL, który jest przechowywany na serwerze
(w SZBD) i jest kompilowany przy pierwszym wykonaniu. Procedury wnoszą
do środowiska serwera baz danych przetwarzanie warunkowe i moŜliwości
programistyczne.
W SZBD wykonanie dowolnego fragmentu kodu języka SQL wiąŜe się
z pewnym ciągiem procesów - począwszy od sprawdzenia składni aŜ do
kompilacji i wykonania.
188
Bazy danych
Proces wykonywania zapytania SQL przez ZSBD
PoniŜej opisujemy, jak odbywa się wykonanie pojedynczego zapytania
w języku Transact-SQL w MS SQL Server.
1. 1. Kod musi zostać sprawdzony pod względem poprawności składni
(kontrola poprawności semantycznej - czyli czy kod nie odwołuje się
do nieistniejących obiektów lub uŜywa nieistniejących poleceń oraz
kontrola poprawności syntaktycznej - czy uŜyta składnia jest
poprawna).
2. Następnie kod jest rozdzielany na fragmenty (często nazywane
znacznikami) interpretowane przez ZSBD. Proces ten nazywamy
parsowaniem (ang. parsing).
3. Następnie SZBD standaryzuje wyodrębnione części kodu, tzn. zapisuje
je w jednoznacznej postaci (usuwając niepotrzebne znaczniki).
4. Kolejnym etapem jest optymalizacja - kaŜde zapytanie moŜe posiadać
wiele przygotowanych tzw. planów wykonania (ang. execution plan).
MS SQL Server posiada wewnętrzny proces (Query Optimizer), który
wybiera optymalny sposób dostępu do danych - tzn. taki plan
wykonania zapytania, w którym serwer będzie skanował
(przeszukiwał) najmniejszą ilość stron danych (o fizycznej strukturze
danych w MS SQL Server moŜesz przeczytać w module 6. Na
optymalizację szczególny wpływ mają struktura indeksów oraz sposób
łączenia tabel.
5. Następuje kompilacja zapytania wg optymalnego planu wykonania i
wykonanie skompilowanego zapytania.
6. Wyniki działania zapytania są zwracane do klienta.
Wykonywanie procedur składowanych
Wykonywanie procedur składowanych odbywa się inaczej niŜ
wykonywanie pojedynczych zapytań SQL. PoniŜej prezentujemy schemat
utworzenia i pierwszego wykonania procedury na przykładzie MS SQL Server.
1. Programista bazy danych tworzy definicję procedury składowanej
- tzn. wykonuje polecenie CREATE PROCEDURE.
2. Kod procedury jest sprawdzany pod względem syntaktyki.
3. Nazwa procedury i jej kod (tzw. ciało) są zapisywane do
odpowiednich tabel systemowych bazy danych (sysobjects oraz
syscomments).
4. UŜytkownik wywołuje procedurę z odpowiednimi parametrami
uŜywając polecenia EXEC.
5. Dalej następuje właściwe wykonanie procedury - optymalizacja
planu wykonania i kompilacja.
6. Skompilowany optymalny plan wykonania jest zapisywany w tzw.
cache'u procedur.
W MS 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).
Bazy danych
189
Kolejne odwołanie do procedury składowanej powoduje juŜ tylko wybranie z
cache'u procedur skompilowanego planu wykonania procedury.
Rys. 9.1 Schemat tworzenia i wykonywania procedur składowanych w MS
SQL Server
Rekompilacja procedur składowanych
Czasami zachodzi potrzeba ponownej kompilacji procedury
składowanej. Dzieje się tak, gdy wydajność skompilowanej procedury
gwałtownie spada (moŜe tak być z wielu powodów, np. zmiany struktury
indeksów lub zapisanej duŜej ilości rekordów), gdy istnieje potrzeba kompilacji
procedury przy kaŜdym jej wykonaniu (powody mogą być te same, co w
pierwszej sytuacji) lub gdy zmianie ulega kod samej procedury (gdy uŜyjemy
polecenia ALTER PROCEDURE).
Rekompilacji, czyli ponownej kompilacji procedury, moŜna dokonać na dwa
sposoby: albo w definicji procedury dodając klauzulę WITH RECOMPILE albo
uŜywając specjalnej systemowej procedury rekompilującej (w MS SQL Server
jest to procedura sp_recompile).
Rekompilacja nie oznacza utworzenia procedury składowanej na
nowo. Oznacza utworzenie nowego planu wykonania i zapisanie go do
cache'u procedur na miejsce poprzednio skompilowanego planu tej
samej procedury.
190
Bazy danych
Praca z procedurami składowanymi
Tworzenie procedur skladowanych
Wywolywanie procedur skladowanych
Parametry procedur skladowanych
Kolejnosc parametrów
Procedury składowane tworzone są na ogół z myślą o współpracy bazy danych
z aplikacjami klienckimi.
Bazy danych
191
Tworzenie procedur składowanych
Do tworzenia procedur składowanych uŜywamy polecenia języka SQL
CREATE PROCEDURE (lub CREATE PROC).
W definicji procedury składowanej określamy: nazwę procedury; nazwy, typy
danych oraz kierunek działania parametrów procedury; ciało procedury - czyli
kod wykonywany przez procedurę; opcjonalnie deklarujemy, czy procedura ma
być przy kaŜdym wykonaniu rekompilowana.
PoniŜej podano przykład utworzenia prostej procedury składowanej nie
zawierającej Ŝadnych parametrów.
Rys. 9.2 Przykład stworzenia procedury składowanej za pomocą języka T-SQL
Wywoływanie procedur składowanych
Do wywołania procedury składowanej słuŜy polecenie EXECUTE (lub
EXEC).
Rys. 9.3 Przykład wywołania procedury składowanej bez parametrów
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
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 procedury, a procedura podczas działania
moŜe zmienić wartość parametru i zwrócić nową wartość.
192
Bazy danych
Rys. 9.4 Przykład stworzenia procedury składowanej z parametrem
wejściowym
Dobrym nawykiem jest podawanie wartości domyślnych parametrów,
poniewaŜ uŜytkownik moŜe nie podać wartości wszystkich
parametrów procedury. Poza tym w praktyce niezbędna jest kontrola
danych podawanych na wejście procedury (walidacja danych) oraz
obsługa błędów w języku SQL (więcej o tym dowiesz się w
ćwiczeniach).
Kolejność parametrów
UŜytkownik ma dwie moŜliwości
składowanej z wieloma parametrami:
•
•
wywoływania
procedury
podać wartości parametrów w takiej kolejności, w jakiej parametry
zostały zdeklarowane w definicji procedury składowanej,
przyporządkowywać wartości parametrom o konkretnych nazwach
(kiedy nadajemy jawnie wartości parametrom, kolejność parametrów w
wywołaniu jest dowolna).
Rys. 9.5 Przykład wywołania procedury składowanej z jawnym podaniem
wartości parametru wejściowego
Z oczywistych względów lepiej jest wywoływać procedury
składowane z jawnym przypisaniem wartości parametrom
wejściowym. Nie trzeba wówczas znać kolejności, w jakiej parametry
te są zdefiniowane w procedurze.
Bazy danych
193
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 cahe'u
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 (przezroczystosc 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).
Jeśli w ogóle moŜna mówić o wadach procedur składowanych, to w zasadzie
moŜna wspomnieć o kilku aspektach:
•
•
•
•
rekompilacja czasem jest następstwem zmniejszenia wydajności
procedury (czyli administrator baz danych musi wiedzieć, kiedy
przeprowadzić rekompilację),
w procedurach składowanych podobnie jak w perspektywach
występuje problem zerwanego łańcucha własności (patrz moduł 8),
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 SZBD (np. T-SQL) takich jak: operowanie zmiennymi, funkcje
i procedury systemowe, obsługa błędów.
194
Bazy danych
Podsumowanie
Czym sa procedury skladowane
Praca z procedurami skladowanymi
Zalety i wady procedur skladowanych
Procedury składowane znajdują wiele zastosowań w bazach danych.
Zwiększają bezpieczeństwo (poprzez odcięcie bezpośredniego dostępu do
tabel), zapewniają ujednoliconą logikę biznesową dla aplikacji oraz poprawiają
wydajność bazy danych i ograniczają ruch w sieci.
Bazy danych
Laboratorium
195
196
Bazy danych
Procedury systemowe
Systemowe procedury składowane w systemie Microsoft SQL Server
2005 są przechowywane w bazie master, zaś w ich nazwach pojawia się prefiks
sp_. W tym ćwiczeniu będziemy stawiali przed Tobą problemy, które
rozwiąŜesz właśnie przy uŜyciu systemowych procedur składowanych.
Krok 1 - Informacje o bazie danych
►
►
►
►
►
►
►
Zaloguj się do maszyny wirtualnej ZBD jako uŜytkownik
Administrator z hasłem P@ssw0rd.
Kliknij Start. Z grupy programów Microsoft SQL Server 2005
uruchom SQL Server Management Studio.
W oknie logowania kliknij Connect.
Kliknij w menu głównym programu Management Studio na File.
Kliknij Open - File.
Odszukaj plik C:\Labs\Lab09\SystemProcedure.sql i kliknij
Open.
Zaznacz kod, który wywołuje procedurę systemową sp_helpdb
(patrz kod poniŜej).
USE Adventure Works
GO
EXEC sp_helpdb AdventureWorks
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
Procedura sp_helpdb zwraca informacje o wybranej bazie danych (rozmiar,
listę plików i informacje o nich).
Pytanie: Z ilu plików składa się baza danych AdventureWorks?
Odpowiedź: Z dwóch - z pliku danych AdventureWorks_Data oraz pliku
dziennika transakcji AdventureWorks_Log.
Krok 2 - Informacje o obiektach bazy danych
►
Zaznacz kod, który wywołuje procedurę systemową sp_help.
EXEC sp_help 'HumanResources.JobCandidate'
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
Procedura sp_help zwraca informacje o wybranym obiekcie w bazie danych.
Pytanie: Czy w tabeli HumanResources.JobCandidate jest jakakolwiek kolumna
typu xml?
Odpowiedź: Tak, jest kolumna Resume (przechowywany jest w niej opis
pracownika w formacie XML).
Bazy danych
197
Krok 3 - Informacje o indeksach w tabeli
►
Zaznacz kod, który wywołuje procedurę systemową sp_helpindex.
EXEC sp_helpindex 'Sales.SalesOrderDetail'
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
Procedura sp_helpindex zwraca listę i opis indeksów załoŜonych na kolumnach
w wybranej tabeli.
Pytanie: Czy na kolumnie SalesOrderID jest załoŜony jakiś indeks?
Odpowiedź: Tak, kolumna ta jest częścią klucza głównego tabeli i w związku z
tym jest takŜe częścią indeksu (w tym wypa
dku
indeksu
klastrowanego
o
nazwie
PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID.
Gdybyś chciał dowiedzieć się więcej na temat systemowych procedur
składowanych, sięgnij do Books Online i w indeksie wpisz system
stored procedures.
198
Bazy danych
Tworzenie procedur składowanych
W tym ćwiczeniu stworzysz i wywołasz przykładową procedurę składowaną.
Krok 1 - Tworzenie procedury
►
►
►
►
►
►
►
Zaloguj się do maszyny wirtualnej ZBD jako uŜytkownik
Administrator z hasłem P@ssw0rd.
Kliknij Start. Z grupy programów Microsoft SQL Server 2005
uruchom SQL Server Management Studio.
W oknie logowania kliknij Connect.
Kliknij w menu głównym programu Management Studio na File.
Kliknij Open - File.
Odszukaj plik C:\Labs\Lab09\Procedure.sql i kliknij Open.
Zaznacz
kod,
który
tworzy
procedurę
składowaną
Production.uspGetProductsByCategory (patrz kod poniŜej).
USE AdventureWorks
GO
CREATE PROC Production.uspGetProductsByCategory
@Category nvarchar(30),
@Count int OUTPUT
AS
SET NOCOUNT ON
SELECT
Production.Product.ProductID,
Production.Product.Name,
Production.Product.ListPrice
FROM Production.Product
INNER JOIN Production.ProductSubcategory
ON
Production.Product.ProductSubcategoryID
=
Production.ProductSubcategory.ProductSubcategoryID
INNER JOIN Production.ProductCategory
ON Production.ProductSubcategory.ProductCategoryID
= Production.ProductCategory.ProductCategoryID
WHERE Production.ProductCategory.Name = @Category
SET @Count = @@ROWCOUNT
SET NOCOUNT OFF
GO
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
Wykonanie powyŜszego fragmentu kodu tworzy procedurę składowaną
Production.uspGetProductsByCategory w bazie danych AdventureWorks.
Procedura ta ma parametr wejściowy (@Category), który słuŜy do pobrania od
uŜytkownika nazwy kategorii produktów.
Zaszyte w procedurze zapytanie SELECT (złączenie trzech tabel - tabeli
przechowującej produkty, tabeli przechowującej podkategorie produktów
Bazy danych
199
i tabeli przechowującej kategorie produktów) zwraca listę produktów spod
wybranej kategorii i ich cen.
Ponadto procedura ma jeden parametr wyjściowy (@Count - opatrzony słowem
kluczowym OUTPUT), który zwraca z procedury ilość znalezionych pod
wybraną kategorią produktów.
Uwagi do powyŜszego kodu:
1. SET NOCOUNT ON - ta linia wyłącza przesyłanie przez procedurę
zbędnego komunikatu o liczbie rekordów dotkniętych zapytaniem
SELECT.
2. OUTPUT - to słowo musi pojawić się przy nazwie parametru
wyjściowego, takŜe w momencie wykonywania procedury (patrz
następne kroki ćwiczenia).
3. @@ROWCOUNT - ta funkcja systemowa zwraca liczbę rekordów
dotkniętych ostatnio wykonaną składnią T-SQL.
Krok 2 - Wywołanie procedury bez uŜycia nazw parametrów
►
Zaznacz kod, który wywołuje procedurę składowaną bez podawania
nazw parametrów.
-- wykonanie procedury (1)
DECLARE @NumberOfProducts int
EXEC
Production.uspGetProductsByCategory
'Accessories', @NumberOfProducts OUTPUT
SELECT @NumberOfProducts
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
PowyŜszy kod przedstawia metodę wykonania procedury składowanej bez
podawania nazw parametrów. Przy takim wywołaniu musisz podać wartości
wszystkich parametrów procedury i to w takiej kolejności, w jakiej te parametry
występują w definicji procedury.
Jeśli nie znasz parametrów procedury składowanej informacje o nich
moŜesz uzyskać uŜywając procedury systemowej sp_help, która
zwraca informacje o wybranym obiekcie. Przykład:
EXEC sp_help 'Production.uspGetProductsByCategory'
Krok 3 - Wykonanie procedury z uŜyciem parametrów
-- wykonanie procedury (2)
DECLARE @NumberOfProducts int
EXEC
Production.uspGetProductsByCategory
@Category='Accessories', @Count=@NumberOfProducts
OUTPUT
SELECT @NumberOfProducts
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
200
Bazy danych
PowyŜszy kod przedstawia metodę wykonania procedury składowanej
z podaniem nazw parametrów. Takie wywołanie umoŜliwia podanie niepełnej
listy parametrów bez konieczności zachowania odpowiedniej kolejności
parametrów (niektóre parametry w procedurze mogą mieć wartości domyślne,
które definiuje się jak poniŜej:
CREATE PROC Production.uspGetProductsByCategory
@Category nvarchar(30) = 'Accessories',
...

Podobne dokumenty