Systemowe aspekty baz danych
Deklaracja zmiennej Zmienne mogą być wejściowe i wyjściowe Zmienne w T-SQL można deklarować za pomocą @: declare @nazwisko varchar(20) Zapytanie z użyciem zmiennej: select @nazwisko = Nazwisko from Pracownik where NrPrac = 22000 Spowoduje wyświetlenie tego, co jest pod zmienną @nazwisko select @nazwisko
Zapytania sparametryzowane Deklaracja zmiennych: declare @nazwisko varchar(20) declare @NrPrac int Przypisanie wartości do zmiennej set @NrPrac = 22000 Zapytanie z parametrami select @nazwisko = Nazwisko from Pracownik where NrPrac = @NrPrac Spowoduje wyświetlenie tego, co jest pod zmienną @nazwisko: select @nazwisko
Procedury składowane Procedura składowana jest zapisywana do bazy danych Przykład: create procedure GetName @NrPrac int, @nazwisko varchar(20) output as begin select @nazwisko = Nazwisko from Pracownik where NrPrac = @NrPrac End Wywołanie powyższej procedury składowanej declare @nazwisko varchar(20) declare @NrPrac int set @NrPrac = 22000 exec GetName @NrPrac, @nazwisko output select @nazwisko
Procedury składowane Przykład: create procedure GetName @NrPrac int, @nazwisko varchar(20) output, @Zarobki int output as begin if (@NrPrac < 10000) begin select @nazwisko = Nazwisko from Pracownik where NrPrac = @NrPrac end end select @Zarobki = Zarobki from Pracownik where NrPrac = @NrPrac
Procedury składowane Wywołanie procedury: Deklaracja zmiennych: declare @nazwisko varchar(20) declare @NrPrac int declare @Zarobki int Przypisanie zmiennej: set @NrPrac = 3990 Wywołanie procedury: exec GetName @NrPrac, @nazwisko output, @Zarobki output Wyświetlenie wartości: select @nazwisko, @Zarobki
Funkcje Wyróżniamy dwa rodzaje funkcji: skalarne; tablicowe.
Funkcje skalarne Przykład funkcji skalarnej: create function GetNameFun (@NrPrac int) RETURNS nchar(20) as begin declare @nazwisko nchar(20) select @nazwisko = Nazwisko from Pracownik where NrPrac = @NrPrac return @nazwisko End Funkcja skalarna zwraca pojedynczą wartość Wywołanie funkcji: declare @nazwisko varchar(20) set @nazwisko = dbo.getnamefun(22000)
Funkcje tablicowe Przykład funkcji tablicowej: create function GetNameTable (@NrPrac int) RETURNS table as return (select Nazwisko from Pracownik where NrPrac = @NrPrac) Funkcja tablicowa zwraca tablicę Wywołanie funkcji: select * from GetNameTable(22000)
Dynamiczny SQL Umożliwia dynamiczne tworzenie zapytań (na poziomie wykonywania programu); Przykład zapytania: declare @zm_zapytanie varchar(100) declare @zm_tabela varchar(100) declare @zm_kolumny varchar(100) set @zm_kolumny = 'Imie, Nazwisko' set @zm_tabela = ' Pracownik' set @zm_zapytanie = ' select '+ @zm_kolumny + ' from ' + @zm_tabela Wywołanie: execute sp_sqlexec @zm_zapytanie lub exec( @zm_zapytanie)
Dynamiczny SQL Funkcja tworząca dynamiczne zapytanie create procedure GetQuery @query nvarchar(200), @NrPrac int as begin declare @result varchar(200) set @result = @query + ' where NrPrac = ' + CAST(@NrPrac as varchar(20)) execute sp_sqlexec @result End Wywołanie execute GetQuery 'select * from Pracownik ', 22000
Procedury systemowe w SQL Server 2005 Zaczynają się od sp_ Utworzenie nowego typu za pomoca procedury systemowej exec sp_addtype PESEL,'varchar(11)', 'NOT NULL' Odczytanie tekstu procedury składowanej: exec sp_helptext 'GetName' Sprawdzanie parametrów triggera exec sp_helptrigger Osoba
declare @Nazwisko varchar(20) declare @Imie varchar(20) declare @NrPrac int Kursory declare kurplaca cursor for select Imie, Nazwisko, NrPrac from Pracownik open kurplaca fetch next from kurplaca into @Imie, @Nazwisko, @NrPrac while @@FETCH_STATUS = 0 begin select @Imie, @Nazwisko, @NrPrac if (@NrPrac = 22000) begin select @Imie = 'NewName' update Pracownik set Imie = @Imie where current of kurplaca end fetch next from kurplaca into @Imie, @Nazwisko, @NrPrac End close kurplaca deallocate kurplaca
Indeksy Indeks określony na atrybucie A pewnej relacji jest mechanizmem, który pozwala na efektywne wyszukiwanie krotek o ustalonej wartości składowej atrybutu A. Indeks składa się z uporządkowanej kolekcji: wartości atrybutu A oraz adresu fizycznego rekordu odpowiadającego temu atrybutowi. Indeksy stosuje się w dużych tabelach, nakłada się na takie atrybuty (z reguły o typie int), na których selekcja jest prowadzona szczególnie często. Przykładowo zakładamy, że taka operacja będzie wykonywana bardzo często: select * from Pracownik where NrPrac = 23000
Indeksy Tworzenie indeksu: create index IndeksNrPrac on Pracownik(NrPrac) Optymalizator zapytań najpierw sięga do indeksu IndeksNrPrac i znajduje wartości adresów fizycznych rekordów spełniających kryteria. Indeksy po wielu atrybutach: create index IndeksNrPracNazw on Pracownik(NrPrac, Nazwisko) Usuwanie indeksów (SQL3): drop index IndeksNrPracNazw Usuwanie indeksów (T-SQL): drop index Pracownik.IndeksNrPracNazw
Indeksy Wybór właściwego indeksu zależy od projektanta bazy danych. Przyspiesza wykonywanie zapytań pobierających; Operacje wstawiania, usuwania i modyfikacji bazy danych są skomplikowane przy zastosowaniu indeksów. Musi być reorganizacja indeksów.
Perspektywy (Views) Perspektywy są bytami podobnymi do tabel. Różnica jest taka, że: Tabele znajdują się fizycznie w bazie danych. Jedynie definicja perspektywy znajduje się w bazie danych. Wyliczenie (materializacja) następuje w momencie użycia perspektywy. Wynik jest konsumowany i następnie kasowany. Wada: czas ewaluacji perspektyw + czas ewaluacji zapytań używających perspektyw bez optymalizacji często nieakceptowalny
Zastosowanie perspektyw Ograniczenie danych do takich, które są istotne w konkretnym zastosowaniu. Ograniczenie dostępu do obiektów, ochrona prywatności. Ukrywanie przed użytkownikami struktury bazy danych. Hurtownie danych: analiza informacji gromadzonych z heterogenicznych źródeł.
Perspektywy Przykład Create view PracLokal as SELECT lok.lokalizacja, lok.wydzial AS LokWydz, pr.imie, pr.nazwisko, pr.nrprac, pr.rokpracy, pr.wydzial AS PrWydz, pr.zarobki FROM Lokalizacja as lok INNER JOIN Pracownik AS pr ON lok.wydzial = pr.wydzial Widok można traktować jak tabelę: select * from PracLokal where Nazwisko='Zaorski'
Modyfikowanie widoków Modyfikowanie widoków polega na modyfikacji tabel źródłowych na których widok się opiera. Modyfikowanie widoków jest możliwe tylko w ściśle określonych sytuacjach: - widok musi być oparty na klauzuli SELECT bez operacji grupowania; - klauzula WHERE nie może zawierać zapytania dotyczącego modyfikowanej relacji ; - klauzula SELECT musi być na tyle duża, żeby wstawić odpowiednie wartości do relacji, która ma być zmodyfikowana. Atrybuty modyfikowanej tabeli, których nie ma w perspektywie, powinny dać się wypełnić wartościami domyślnymi albo NULL;
Modyfikowanie widoków To zadziała, bo modyfikowana jest jedna tabela: insert into PracLokal (Imie, Nazwisko, NrPrac) values ('Damian', 'Matysiak', 2490) To nie zadziała, bo jest próba modyfikacji więcej niż jednej tabeli: insert into PracLokal (Imie, Nazwisko, NrPrac, Lokalizacja) values ('Damian', 'Matysiak', 2490, 'Lublin')
Autoryzacja Autoryzacja może być definiowana na następujących poziomach: Serwera bazy danych; Bazy danych; Obiektów w bazie danych; Dodanie nowego użytkownika: exec sp_addlogin 'Piotr','My-Passw CREATE LOGIN Piotr1 WITH PASSWORD = 'My-Pasw1'
Role na serwerze bazy danych Fixed server role sysadmin serveradmin setupadmin securityadmin processadmin dbcreator diskadmin bulkadmin Description Can perform any activity in SQL Server Can set server-wide configuration options, shut down the server Can manage linked servers and startup procedures Can manage logins and CREATE DATABASE permissions, also read error logs and change passwords Can manage processes running in SQL Server Can create, alter, and drop databases Can manage disk files Can execute BULK INSERT statements
Procedury systemowe obsługujące role serwera bazy danych sp_addsrvrolemember Adds a login as a member of a fixed server role sp_dropsrvrolemember Removes an SQL Server login, Windows user or group from a fixed server role sp_helpsrvrole Returns a list of the fixed server roles sp_helpsrvrolemember sp_srvrolepermission Returns information about the members of fixed server roles Returns the permissions applied to a fixed server role
Dodanie użytkownika Dodanie nowego użytkownika: exec sp_addlogin 'Piotr', PiotrHaslo CREATE LOGIN Piotr1 WITH PASSWORD = Piotr1Haslo' Dodanie roli serwera dla użytkownika: exec sp_addsrvrolemember Piotr,'sysadmin'
Role bazy danych W systemie istnieją standardowe role bazy danych. Nie można ich zmieniać, ale można tworzyć nowe. db_owner db_accessadmin db_securityadmin db_ddladmin db_backupoperator db_datareader db_datawriter db_denydatareader db_denydatawriter Has all permissions in the database Can add or remove user IDs Can manage all permissions, object ownerships, roles and role memberships Can issue ALL DDL, but cannot issue GRANT, REVOKE, or DENY statements Can issue DBCC, CHECKPOINT, and BACKUP statements Can select all data from any user table in the database Can modify any data in any user table in the database Cannot select any data from any user table in the database Cannot modify any data in any user table in the database
Procedury składowane obsługujące role bazy danych sp_addrole sp_addrolemember sp_dbfixedrolepermission sp_droprole sp_helpdbfixedrole sp_helprole sp_helprolemember sp_droprolemember Creates a new database role in the current database Adds a user to an existing database role in the current database Displays permissions for each fixed database role Removes a database role from the current database Returns a list of fixed database roles Returns information about the roles in the current database Returns information about the members of a role in the current database Removes users from the specified role in the current database
Dodanie użytkownika Dodanie nowego użytkownika do bazy danych: CREATE USER Piotr Dodanie roli serwera dla użytkownika: exec sp_addrolemember 'db_owner',piotr exec sp_addrolemember 'db_ddladmin',piotr
Definiowanie uprawnień na poziomie obiektów i instrukcjach Uprawnienia można definiować na następujących obiektach lub instrukcjach: SELECT, INSERT, UPDATE, DELETE, EXECUTE CREATE DATABASE, CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TABLE, CREATE VIEW BACKUP DATABASE, BACKUP LOG
Dodanie użytkownika oraz jego roli - przykład Dodanie nowego użytkownika exec sp_addlogin 'Nowy','NoweHaslo' CREATE USER Nowy exec sp_addrolemember 'db_ddladmin',nowy Nie ma uprawnień do wykonania zapytania, a więc nie można zrobić: select * from Bar
Instrukcja GRANT GRANT umożliwia użytkownikowi lub roli wykonywanie operacji Przykład: grant select on Pracownik to Nowy Użytkownik Nowy może teraz wykonać instrukcję: select * from Pracownik Przykład2: grant select on Pracownik(Imie, Nazwisko) to Nowy Użytkownik Nowy może teraz wykonać instrukcję: select Imie from Pracownik Nie może jednak wykonać operacji: select * from Pracownik
Instrukcja GRANT Przykład3: grant select on Pracownik to Nowy WITH GRANT OPTION Użytkownik Nowy może teraz wykonać Użytkownik Nowy może teraz wykonać instrukcję SELECT i może też dać uprawnienia do wykonania tej instrukcji innemu użytkownikowi. GRANT może być stosowany na każdym poziomie autoryzacji.
Instrukcja REVOKE Instrukcja REVOKE powoduje odebranie prawa do wykonywania instrukcji. Przykład: grant select on Pracownik(Imie, Nazwisko) to Nowy revoke select on Pracownik from Nowy Powoduje odebranie użytkownikowi prawa do wykonywania instrukcji SELECT na tabeli Pracownik.
Dziękuję