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', ...