1.02k likes | 1.28k Views
Wykład 5: Zaawansowany SQL. Zaawansowany SQL. Typy danych SQL i schematy Więzy integralności (spójności) Wyzwalacze ( triggers ) Procedury składowane ( stored procedures ) Funkcje Autoryzacja Role Zanurzony SQL Dynamiczny SQL. Typy danych czas-data.
E N D
Zaawansowany SQL • Typy danych SQL i schematy • Więzy integralności(spójności) • Wyzwalacze (triggers) • Procedury składowane (stored procedures) • Funkcje • Autoryzacja • Role • Zanurzony SQL • Dynamiczny SQL
Typy danych czas-data • date:Data zawierające (4 cyfry) rok, miesiąci dzień • Przykład: date ‘2007-1-27’ • time:czas w godzinach, minutach i sekundach. • Przykład: time ‘11:55:30’ time ‘11:55:30.65’ • timestamp: data oraz czas • Przykład: timestamp ‘2007-1-27 11:55:30.75’ • interval:Przedział czasu • Przykład: interval ‘1’ day • odejmowaniejednej wartości date/time/timestamp od innej daje wartość typu interval • Wartości typu intervalmogą być dodawane do wartości date/time/timestamp
Typy danych czas-data (cd.) • Możemy pobierać wartości poszczególnych pól z wartości date/time/timestamp • Przykład: extract (year fromr.starttime) • MSSQL używa funkcji DAY, MONTH, YEAR, DATEADD, DATEDIFF, DATEPART oraz GETDATE: • SELECT YEAR(starttime) from r; • Możemy rzutować łańcuchy znaków na wartości typu date/time/timestamp • Przykład: • cast <wyrażenie tekstowe> as date • PrzykładMSSQL: • cast('1 październik 2003' as datetime)
Typy definiowalne • create type– taka konstrukcja w SQL tworzy typ definiowalny (typ uzytkownika) create type zloty as numeric (12,2) final • Tylko ORACLE wspiera tą konstrukcję! • create domain- taka konstrukcja w SQL-92 tworzy dziedziny typów - definiowalnych create domain person_name char(20) not null • Typy i dziedziny są podobne. Dziedziny mogą posiadać więzy np. not null • Większość producentów SZRBD nie wspiera tych konstrukcji!
Więzy dla dziedzin • Domain constraintssą podstawową postacią więzów spójności.Sprawdzają wartości wprowadzane do bazy i sprawdzają czy porównania w kwerendach mają sens: • CREATE DOMAIN VALID_EMPL_IDS INTEGER • CHECK (VALUE BETWEEN 101 AND 199); • Nowe dziedziny mogą być tworzone z istniejących typów danych • Przykład: create domain zlotynumeric(12, 2);create domaineuro numeric(12,2); • Nie można przyrównać/przypisać wartości typu zloty do wartości typu euro. • Ale możemy przekształcić typy tak jak poniżej: (castr.Aaseuro) (Powinno również przemnożyć wynik przez kurs wymiany)
Typy opisujące duże obiekty • Obiekty takie jak zdjęcia, pliki wideo, ... są przechowywane w bazie jako large object: • blob: binary large object – obiekt jest kolekcją binarnych danych, których interpretacji dokonuje aplikacja poza systemem bazy danych • clob: character large object – kolekcja znaków • Jeżeli w kwerendzie znajduje się zapytanie o duże obiekty zwracany jest wskaźnik a nie sam obiekt. • Przykład ORACLE: • Typ BLOB pozwala na przechowanie do 8 terabajtów danych binarnych w bazie danych. • Typ CLOB pozwala na przechowanie do 8 terabajtów jednobajtowych znaków w bazie danych. • Typ NCLOB wielobajtowe CBLOB. • Typ BFILE przechowuje duże dane binarne w plikach zewnętrznych wzlędem bazy danych.
Więzy spójności • Więzy spójności zapobiegają przypadkowemu uszkodzeniu bazy danych. Sprawdzają, czy zmiany w bazie nie powodują utraty spójności danych. • Rachunek oszczędnościowy musi mieć stan co najmniej 30,000.00 • Pensja pracownika nie może być mniejsza niż 7 zł za godzinę • Klient musi posiadać telefon (niepusta wartość atrybutu)
Więzy spójności dla pojedynczej relacji • not null • primary key • unique • check (P ),gdziePjest predykatem
Więzy not null • Deklarujemy, że oddzial_nazwa dlarelacji aktywa jestnot null oddzial_nazwachar(15) not null • Dziedzina Euro ma być not null create domainEuronumeric(12,2)not null
Więzy unique • unique ( A1, A2, …, Am) • Specyfikacja unique stwierdza, że atrybuty A1, A2, … Amtworzą klucz kandydujący. • W przeciwieństwie do kluczy głównych klucze kandydujące mogą być puste (null)
Klauzula check • check (P ),gdzie P jest predykatem (MySQL nie realizuje klauzuli check) Przykład: Deklarujemy oddzial_nazwa jako klucz główny i żądamy aby wartości aktywów nie były ujemne. create table oddzial(oddzial_nazwa char(15),oddzial_miasto char(30),aktywa integer,primary key (oddzial_nazwa),check (aktywa >= 0)) Zbliżają się wybory, w MS SQL sprawdzamy, czy wyborca ma 18 lat w dniu wyborów: ALTER TABLEwyborcaADD CONSTRAINT CK_wiek_18 CHECK (DateDiff(yy,DateofBirth, DateofVote)>=18);
Klauzula check • check może być wykorzystane jako więzy dla krotek (w poprzednim przypadku warunek dotyczył jednego atrybutu, poniżej mamy dwa atrybuty wymienione w warunku) Przykład: CREATE TABLE Campus ( location char(25), enrollment integer, rank integer, CHECK(enrollment >= 10,000 OR rank > 5) );
Klauzula check (cd.) • W standardzie SQL-92 klauzula checkpozwala na ograniczanie dziedzin: • Można jej użyć np. do sprawdzenia czy stawka godzinowa jest większa od wartość określona prawem. create domainstawka_godzinanumeric(5,2) constraintsprawdz_stawkecheck(value > = 4.00) • W ten sposób więzy są nałożone na dziedzinę atrybutu i zapewniają, że nikt w bazie nie może nam przypisać stawki mniejszej • Klauzulaconstraintsprawdz_stawke jest opcjonalna; wykorzystywana przy sygnalizacji, jakie więzy zostały naruszone przy modyfikacji danych.
Więzy referencyjnej spójności • Zapewniają, że wartość pojawiająca się w jednej relacji dla danego zbioru atrybutów pojawi się również w innej relacji dla jakiegoś zbioru atrybutów. • Przykład: Jeśli “Centum” jest nazwą oddziałupojawiającą się w jednej z krotek w relacji rachunek, to musi istnieć odpowiednia krotka w relacjioddzialdla oddziału “Centrum”. • Klucze główne, klucze kandydujące oraz klucze obce mogą być specyfikowane jako części polecenia SQLcreate table : • Klauzulaprimary keywymienia atrybuty tworzące klucz główny. • Klauzula unique [key]wymienia atrybuty tworzące klucz kandydujący. • Klauzula foreign keywymienia atrybuty tworzące klucz obcy oraz nawę relacji kojarzonej poprzez klucz obcy. Domyślnie klucz obcy odnosi się do klucza głównego drugiej tabeli.
Więzy spójnościw SQL – Przykład create table klient(klient_nazwisko char(20),klient_ulica char(30),klient_miasto char(30),primary key (klient_nazwisko )) create table oddzial(oddzial_nazwachar(15),oddzial_miasto char(30),aktywa numeric(12,2),primary key(oddzial_nazwa ))
Więzy spójnościw SQL – przykład (cd.) create table rachunek(rachunek_numer char(10),oddzial_nazwa char(15),stan integer,primary key (rachunek_numer), foreign key (oddzial_nazwa)references oddzial ) create table depozytor(klient_nazwiskochar(20),rachunek_numer char(10),primary key(klient_nazwisko, rachunek_numer),foreign key(rachunek_numer ) references rachunek,foreign key(klient_nazwisko )references klient )
Kaskadowe działanie w SQL create table rachunek . . .foreign key(oddzial_nazwa)references oddzialon delete cascade on update cascade. . . ) • Klauzulaon delete cascadespowoduje, że jeśli usuwanie jakiegoś oddziału w relacji oddziałpowoduje naruszenie więzów spójności to odpowiednia krotka w relacji rachunek zostanie także usunięta. • Podobnie sprawa wygląda dla kaskadowych uaktualnień (zmiana nazwy w tabeli oddzial z „Grudziądz” na „Grudziądz Rynek” powinna się przenieść do tabeli rachunek).
Kaskadowe działanie w SQL(cd.) • Jeśli istnieje łańcuch zależności kluczy obcych z on delete cascadeokreślonym dla każdej zależności to usuwanie (modyfikacja) na jednym końcu łańcucha propaguje się do drugiego końca (jak kostki domina). • Jeżeli kaskadowe działanie narusza więzy integralności na jakimś stopniu kaskady, system porzuca transakcję. • W wyniku, wszystkie zmiany zostaną wycofane (rollback). • Więzy spójności są sprawdzane na końcu transakcji • Cząstkowe kroki mogą łamać więzy spójności przy założeniu, późniejsze kroki usuną naruszenie • W przeciwnym przypadku byłoby niemożliwe opisywanie pewnych faktów, np. wstawienie dwóch krotek, których klucze obce wskazują wzajemnie na siebie: zawieranie małżeństwa
Więzy spójnościw SQL (cd.) • Alternatywą dla kaskad mogą być: • on delete set null • Wstawia w krotce podrzędnej wartości puste • on delete set default • Wstawia w krotce podrzędnej watości dpmyślne • on delete restrict • on delete no action (MS SQL) • Nie pozwala na usuwanie jeśli istnieje krotka zależna • Ale wartości puste komplikują „logikę” więzów integralności • jeśli jakikolwiek atrybut klucza obcego ma wartość null, to krotka spełnia więzy integralności z definicji! • W MySQL set null nie może dotyczyć sytuacji gdy pole w tabeli ma warunek not null (oczywiste!)
Zapewnienia (assertions) • Nie wszystkie warunki można wyrazić przy pomocy więzów omawianych poprzednio (jak check) • Zapewnienie(assertion) jest predykatem wyrażającym warunek, który zawsze ma spełniać cała baza. • Zapewnienie w SQL przyjmuje postać create assertion <nazwa_zapewnienia> check <predykat> • Kiedy wstawione jest „zapewnienie” system sprawdza jego poprawność oraz sprawdza czy predykat jest spełniony przy modyfikacji, która może nie spełniać warunku. • Takie testowanie może wprowadzić duże obciążenie do bazy, zapewnienia powinny być używane z ostrożnością. • MS SQL ich nie posiada
Przykład zapewnienia • Średnia ocen jest > 3.0 and średnia dochod < 1000 • CREATE ASSERTION Avgs CHECK( 3.0 < (SELECT avg(ocena) FROM Student) AND 1000 > (SELECT avg(dochod) FROM Student)) • Student ze średnią < 3.0 może się tylko strać o kampus z rankingiem > 4. • CREATE ASSERTION RestrictApps CHECK( NOT EXISTS (SELECT * FROM Student, Apply, Campus WHERE Student.ID = Apply.ID AND Apply.location = Campus.location AND Student.GPA < 3.0 AND Campus.rank <= 4))
Przykład zapewnienia • Każdy kredyt posiada przynajmniej jednego kredytobiorcę, który posiada rachunek ze stanem przynajmniej 3000.00 zł create assertion stan_wiezy check (not exists ( select * from kredytwhere not exists ( select * from kredytobiorca, depozytor, rachunekwhere kredyt.kredyt_numer = kredytobiorca.kredyt_numerand kredytobiorca.klient_nazwisko = depozytor.klient_nazwiskoand depozytor.rachunek_numer = rachunek.rachunek_numerand rachunek.stan >= 3000)))
Przykład zapewnienia • Suma wszystkich kwot kredytów w każdym oddziale musi być mniejsza od sumy stanów rachunków w tym oddziale. create assertion suma_wiezy check(not exists (select * from oddzialwhere (select sum(kwota) from kredytwhere kredyt.oddzial_nazwa = oddzial.oddzial_nazwa ) >= (select sum (stan) from rachunekwhere rachunek.oddzial_nazwa = oddzial.oddzial_nazwa )))
PROGRAMOWANIE Skarb DBA(głównie na przykładzie MS SQL Server)
Struktury proceduralne • Programowanie „wsadowe” (batch) • Zmienne • Instrukcje sterujące • Przetwarzanie błędów • Procedury składowane • Funkcje definiowalne • Synonimy • Wyzwalacze DML
Wyzwalacze i procedury składowane – należą do najważniejszych narzędzi DBA (database administrator) oraz DBAD (application developer) • Wyzwalacze mogą zaoszczędzić |DBA utraconego czasu i problemów poprzez automatyzację monitorowania stanu bazy i zadań administracyjnych. • Procedury składowane mogą być wykorzystywane do tworzenia skryptów administracyjnych , które będą używane wielokrotnie i zmniejszają czas niezbędny do administracji i szansę na powstanie błędów. • To będzie bliższe klasycznemu programowaniu • Oprócz tego mamy jeszcze UDFy User Defined Functions • Zaczniemy od podstaw: batche, zmienne i instrukcje sterujące!
Batche • Batch to szereg instrukcji (T-)SQL umieszczonych w jednym pliku • W pliku *.sql można umieścić wiele batchy, oddzielamy je instrukcją GO • Reguły • Niektóre instrukcje muszą być przesłane w ich własnym batchu:CREATE PROCEDURE, CREATE VIEW, CREATE FUNCTION, CREATE DEFAULT, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER • Zmienne muszą być zdefiniowane i wykorzystane w tym samym batchu • Wieloliniowe komentarze /* …. */ muszą się zawierać w jednym batchu • Struktury tabel nie mogą być zmieniane w tym samym batchu • Błąd kompilacji zatrzyma wykonanie wszystkich instrukcji batcha • Błąd wykonania wstrzyma wykonanie kolejnych instrukcji
USE tempdb;GOCREATE TABLE T1 (C1 int NOT NULL);INSERT INTO T1 VALUES (1);INSERT INTO T1 VALUES (2,2);INSERT INTO T1 VALUES (3);GOSELECT * FROM T1;DROP TABLE T1;GO • CREATE TABLE jest kompilowane, po kolei są kompilowane instrukcje INSERT i wykonywane, ale druga Instrukcja zawiera błąd, więc do tablei zostanie dodany tylko jeden wiersz
Zmienne • Zmienną definiujemy poprzedzają jej nazwę małpą (@) • W jednym batchu możemy użyć do 10^4 zmiennych • DECLARE @Var1 int; DECLARE @Var2 as varchar(25); DECLARE @Var3 decimal(5,2), @Var4 int; • Przypisanie wartości: • SET @Var1 = 5; SET @Var2 = ‘A varchar string’; SELECT @Var2 = ‘Another varchar string’, @Var3 = 123.45
Zmienne 2 • Inna forma przypisania (przy pomocy zapytania do bazy SELCT) • USE PPDB;DECLARE @CustName varchar(50);SELECT @CustName = CustomerNameFROM Customer WHERE CustomerID = 1; • Funkcje systemowe (np. @@Error) nazywane czasami (błędnie ) zmiennymi globalnymi
Instrukcje sterujące • BEGIN … END grupuje instrukcje używane razem z IF, WHILE, CASE • IF … ELSE • USE AdventureWorks;GOUPDATE HumanResources.EmployeePayHistorySET PayFrequency = 4 WHERE EmployeeID = 1;IF @@ERROR <> 0 -- funkcja sysytemowa BEGINPRINT ‘An error occured in the previous statement.’; RETURN; ENDELSEPRINT ‘No error occured in the previous statement.’;
Instrukcje sterujące 2 • WHILE • DECLARE @Counter int;SET @Counter = 1;WHILE (@Counter <= 10) BEGIN PRINT @Counter; SET @Counter = @Counter + 1; END • Powyżej mamy przykład typowej pętli, ale instrukcję WHILE można też wykorzystywać z warunkiem EXISTS do wykonywania operacji na wierszach tabeli • WHILE EXISTS (SELECT * FROM T1 WHERE C1 = 1)BEGIN-- Wykonaj jakieś operacje na wierszach -- tabeli T1 z warunkiem C1 = 1END • W instrukcji WHILE można korzystać z BREAK i CONTINUE, których użycie jest typowe dla pętli („oczywista oczywistość”).
Instrukcje sterujące 3 • CASE • USE AdventureWorks2008;GOSELECT Name,CASE NameWHEN ‘Human Resources’ THEN ‘HR’ WHEN ‘Finance’ THEN ‘FI’WHEN ‘Information Services’ THEN ‘IS’ WHEN ‘Executive’ THEN ‘EX’WHEN ‘Facilities and Maintenance’ THEN ‘FM’ END AS AbbreviationFROM AdventureWorks2008.HumanResources.DepartmentWHERE GroupName = ‘Executive General and Administration’; • Instrukcja CASE jest używana w celu zamiany wartości kolumny w zapytaniu SELECT. W Transact-SQL CASE przetwarza wiersz po wierszu
Zarządzanie błędami • Błędy składni • Błędy wykonania • PRINT ‘Przed błędem’;SELECT 1/0;PRINT ‘Po błędzie’; • Komunikaty błędów • Numer błędu (powyżej 50 000 błędy definiowalne przez użytkownika) • Waga błędu (Severity Level) – powyżej 10 mają charakter informacyjny • Stan (State) (liczba wskazujące gdzie pojawił się błąd?) • Numer linii • Tekst komunikatu • Przykład: • Przed błędem • Msg 8134, Level 16, State 1, Line 2 • Divide by zero error encountered. • Po błędzie
Zarządzanie błędami 2 • Blok TRY … CATCH … • Składnia • BEGIN TRY-- Kod mogący generować błędyEND TRYBEGIN CATCH -- Logika obsługi błędówEND CATCH; • Blok CATCH musi następować zaraz po bloku TRY • Wewnątrz bloku CATCH można użyć kilku funkcji informacyjnych (por. następny slajd) • Funkcje te użyte poza blokiem CATCH zwrócą NULL
Zarządzanie błędami 3 • Funkcje informacyjne bloku CATCH • ERROR_LINE() • ERROR_NUMBER() • ERROR_MESSAGE() • ERROR_PROCEDURE() jeśli błąd pojawił się w procedurze jej nazwa jest zwracana, w przeciwnym razie NULL • ERROR_SEVERITY() • ERROR_STATE() • Przykład: • USE AdventureWorks2008;BEGIN TRY SELECT 1/0;END TRYBEGIN CATCHINSERT INTO dbo.ErrorLog (Line, Number, ErrorMsg, [Procedure], Severity, [State]) VALUES (ERROR_LINE(), ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_PROCEDURE(), ERROR_SEVERITY(), ERROR_STATE());END CATCH;
Zarządzanie błędami 4 • Funkcja @@ERROR • Zwraca tylko numer błędu • Instrukcje typu • SELECT 1/0 • PRINT @@ERROR • Ale co będzie wynikiem poniższego kodu? • SELECT 1/0;IF @@ERROR <> 0 PRINT @@ERROR; • Warunek IF @@ ERROR <> 0 resetuje wartość funkcji !!! • Należy wiec użyć zmiennej pośredniej, która zapamięta stan funkcji • DECLARE @SaveError int;SELECT 1/0;SET @SaveError = @@ERROR;IF @SaveError <> 0PRINT @SaveError; • Funkcji @@ERROR używamy głównie ze względu na kompatybilność ze starszymi wersjami SQL Server np. 2000
Zarządzanie błędami 5 • Generacja błędów: • Czasami chcemy / musimy wygenerować własne błędy (nie przewidziane przez system) • Posługujemy się wtedy procedurą składowaną sp_addmessage • Przykład: • EXEC sp_addmessage 50005, -- Message ID10, -- Severity Level‘ID bieżącej bazy: %d, nazwa bazy: %s.’; • Instrukcja RAISEERROR wygeneruje odpowiedni błąd, • Składnia: • RAISERROR ( { msg_id | msg_str | @local_variable } • { ,severity ,state } • [ ,argument [ ,...n ] ] ) • [ WITH option [ ,...n ] ]
Zarządzanie błędami 6 • Przykład: • DECLARE @DBID int;DECLARE @DBNAME nvarchar(128);SET @DBID = DB_ID();SET @DBNAME = DB_NAME();RAISERROR (50005, 10, -- Severity. 1, -- State. @DBID, -- First substitution argument. @DBNAME); -- Second substitution argument.GO • Można też generować błędy bez dodawania komunikatów do systemu • RAISERROR (‘Custom Message’, 10, -- Severity 1); -- State • Oprócz dodawania komunikatów mamy też ich usuwanie: • sp_dropmessage
Procedury składowane (MSSQL) • Procedury składowane są zbiorami operacji przechowywanymi na serwerze i wykonywanymi przez klienta aplikacji. • Wartości parametrów mogą być przekazywane do procedury przechowywanej jako wejścia. • Parametry wyjściowe mogą być używane do zwracania wartości zmiennej do kodu wywołującego. • Procedura składowana może mieć s sumie do 2100 parametrów. • Pojedyncza wartość całkowita jest zazwyczaj używana do wskazywania sukcesu lub porażki (wykonania procedury). • Istnieje wiele operacji, które mogą być wykonywane przez procedury przechowywane w bazie danych: • Zmiana struktury bazy danych i wykonywanie zdefiniowanych przez użytkownika transakcje są powszechnymi operacjami • Procedury składowane mogą być wykorzystane do zwracania wyniku zapytania SELECT, ale istnieją lepsze narzędzia
Procedury składowane 2 • Omówimy budowanie procedur składowanych Transact-SQL, ale możliwe jest również zbudowanie takich procedur przy użyciu .NET (CLR) • Zalety: • Bezpieczeństwo: • Prawo do wykonania procedury składowanej jest przyznawane niezależnie od dostępu do obiektów bazy danych których ona dotyczy. • Użytkownik, który uzyskuje dostęp do wykonania procedury składowanej może wykonywać wszystkie operacje w procedurze przechowywanej. Możliwe jest również , że wykonujemy ją jako inny użytkownik. • Modularne programowanie: • Wielokrotne wykorzystywanie, • Skomplikowane procedury mogą być rozbijane na bloki • Czas wykonania • Procedury są kompilowane raz (w zasadzie) • Czas przesyłania kodu do serwera
Procedury składowane 3 • Wiele operacji bazodanowych może być wykonanych przez inne obiekty/struktury • Procedury składowane mogą wykonać prawie wszystkie operacje. Ale poniższe są zabronione: • Tworzenie lub modyfikacja następujących obiektów: • Aggregate • Default • Function • Procedure • Rule • Schema • Trigger • View • Instrukcja USE • SET PARSEONLY lub warianty SHOWPLAN
Procedury składowane 4 • Procedura może zwrócić więcej niż jeden zbiór rezultatów do wywołującej ją aplikacji. • Funkcje tablicowe definiowalne przez użytkownika są lepszym rozwiązaniem jeśli ma być zwrócony jeden wynik. • Wyniki procedury nie mogą być używane w klauzuli FROM kwerendy (istnieje funkcja OPENQUERY(), która pozwala na obejście tego ograniczenia). • Procedury mogą korzystać z tablic tymczasowych. • Tablica tymczasowa istnieje tylko na czas działania procedury. • Procedura zagnieżdżona może korzystać z tablic tymczasowych utworzonych przez procedurę wywołującą (nadrzędną). • Odwołując się do obiektów wewnątrz procedury zalecane jest używanie nazwy schematu, unika się w ten sposób błędów związanych z domyślnym przeszukiwaniem bazy przez procedurę.
Procedury składowane 5 • Składnia • CREATE PROC[EDURE] [schema_name.]proc_name[({@param1} type1 [ VARYING] [= default1] [OUTPUT])] {, …}[WITH {RECOMPILE | ENCRYPTION | EXECUTE AS 'user_name'}] [FOR REPLICATION]AS batch | EXTERNAL NAME method_name • schema_name – nazwa schematu do którego jest przypisywana tworzona procedura. • proc_name– oczywista … • Parametr procedury składowanej ma taki sam sens logiczny jak zmienna lokalna w batchu • @param1 – nazwa pierwszego parametru • type1 - typ pierwszego parametru • default1– opcjonalna wartość domyślna (może być NULL) • OUTPUT– wskazuje, że parametr może zwrócić wartość z procedury do systemu (wywołującej aplikacji)
Procedury składowane 6 • Prekompilowana postać procedury jest przechowywana na serwerze • Opcja WITH RECOMPILEspowoduje, że procedura będzie rekompilowana przed każdym użyciem. • To niszczy jedną z ważnych zalet procedur. • KlauzulaEXECUTE ASokreśla kontekst bezpieczeństwa (jako kto) wykonywania procedury. W ten sposób można kontrolować, którego konta użyje baza danych do sprawdzenia uprawnień do obiektów, z których korzysta procedura. • Domyślnie tylko członkowieról sysadmin, db_owneroraz db_ddladmin mogą wykorzystywać instrukcję CREATE PROCEDURE. Ale zgodnie z zasadami, członkowie tych ról mogą przekazać te uprawnienia innym użytkownikom przy pomocy polecenia GRANT CREATE PROCEDURE.
Procedury składowane 7 • Przykład • USE sample;GOCREATE PROCEDURE increase_budget (@percent INT=5)AS UPDATE projectSET budget = budget + budget*@percent/100; • Można tworzyć procedury tymczasowe: lokalne (#nazwa_procedury) i globalne (##nazwa_procedury). • Stosują się do nich podobne zasady jak do tablic tymczasowych • Procedury mają (w pewnym sensie) dwie fazy : faza tworzenia i faza wykonania • Polecenie EXECUTE wykonuje istniejąca procedurę (kto może wykonywać daną procedurę?)
Procedury składowane 8 • Składnia • [[EXEC[UTE]] [@return_status =] {proc_name| @proc_name_var}{[[@parameter1 =] value | [@parameter1=] @variable [OUTPUT]] | DEFAULT}..[WITH RECOMPILE] • Wszystkie opcje poza @return_status mają analogiczne znaczenie jak w instrukcji tworzenia procedury • @return_status – przechowuje status wykonania procedury • Przykład: • SELECT * FROM project;EXEC increase_budget 7;SELECT * FROM project;GO
Procedury składowane 9 • Przykład z wykorzystaniem opcji OUTPUT • USE sample;GO • CREATE PROCEDURE delete_emp @employee_no INT, @counter INT OUTPUT AS SELECT @counter = COUNT(*) FROM works_on WHERE emp_no = @employee_no DELETE FROM employee WHERE emp_no = @employee_no DELETE FROM works_on WHERE emp_no = @employee_noGO--DECLARE @quantity INT – deklarcja EXECUTE delete_emp @employee_no=28559, @counter=@quantity OUTPUTPRINT @quantityGO
Procedury składowane 10 • Usuwanie procedury • DROP PROCEDURE nazwa_procedury • Modyfikacja procedury składowanej • ALTER PROCEDURE … • Jest to praktycznie ta sama składnia co dla CREATE PROCEDURE • Po co skoro można DROP PRCEDURE oraz CREATE PROC ? • Ale wtedy znikają zdefiniowane już uprawnienia