Aspekty systemowe baz danych

advertisement
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
select @Zarobki = Zarobki from Pracownik
where NrPrac = @NrPrac
end
end
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)
Procedury składowane (MySQL)
• Procedura składowana jest zapisywana do bazy danych
• Przykład:
DELIMITER $$
create procedure GetName (Nr int)
Begin
//Deklaracja zmiennych
declare Naz varchar(30);
declare I varchar(20);
// Pobieranie danych
select Nazwisko,Imie INTO Naz,I
from Pracownik
where NrPrac = Nr;
// Wypisanie danych
select Naz, I;
end$$
DELIMITER ;
• Wywołanie powyższej procedury składowanej
call GetName(5111);
Procedury składowane (MySQL)
• Procedura z parametrem zewnętrznym:
DELIMITER $$
create procedure GetName (OUT Naz varchar(20), Nr int)
begin
select Nazwisko INTO Naz
from Pracownik
where NrPrac = Nr;
end$$
DELIMITER ;
• Wywołanie powyższej procedury składowanej
set @Naz = '';
call GetName(@Naz, 5111);
select @Naz;
Procedury składowane (MySQL)
• Procedura z parametrem zewnętrznym:
DELIMITER $$
create procedure GetName (OUT Naz varchar(20), Nr int)
Begin
IF (Nr < 5000) THEN
select Nazwisko INTO Naz
from Pracownik
where NrPrac = Nr;
END IF;
end$$
DELIMITER ;
• Wywołanie powyższej procedury składowanej
set @Naz = '';
call GetName(@Naz, 5111);
select @Naz;
Funkcje (MySQL)
• Funkcje są zapisywane do bazy danych.
• W odróżnieniu od procedur składowanych zwracają jakąś wartość.
• Przykład:
DELIMITER $$
create function GetNameFunction (Nr int)
returns varchar(50)
begin
declare Naz varchar(20);
select Nazwisko INTO Naz
from Pracownik
where NrPrac = Nr;
return Naz;
end$$
DELIMITER ;
• Wywołanie powyższej funkcji
set @s = GetNameFunction(3588);
select @s;
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
• 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
Kursory
declare @Nazwisko varchar(20)
declare @Imie varchar(20)
declare @NrPrac int
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
Rodzaje indeksów na przykładzie
SQL Server
• Indeks klastrowy:
– może być jeden w tabeli;
– dane znajdują się w liściach;
– utworzenie klucza głównego na kolumnę w tabeli powoduje
dodanie indeksu klastrowego na tę kolumnę;
create clustered index nazwa_indeksu on tabela (kolumna1,…)
• Indeks nieklastrowy:
– może być więcej niż jeden w tabeli;
– w liściach nie ma danych tylko są wskaźniki do danych;
create nonclustered index nazwa_indeksu on tabela (kolumna1,…)
Indeks klastrowy
Indeks nieklastrowy
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
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')
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ł.
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
Description
sysadmin
Can perform any activity in SQL Server
serveradmin
Can set server-wide configuration options, shut
down the server
setupadmin
Can manage linked servers and startup
procedures
securityadmin
Can manage logins and CREATE DATABASE
permissions, also read error logs and change
passwords
processadmin
Can manage processes running in SQL Server
dbcreator
Can create, alter, and drop databases
diskadmin
Can manage disk files
bulkadmin
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
Returns information about the members of
fixed server roles
sp_srvrolepermission
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
Has all permissions in the database
db_accessadmin
Can add or remove user IDs
db_securityadmin
Can manage all permissions, object
ownerships, roles and role memberships
db_ddladmin
Can issue ALL DDL, but cannot issue GRANT,
REVOKE, or DENY statements
db_backupoperator
Can issue DBCC, CHECKPOINT, and BACKUP
statements
db_datareader
Can select all data from any user table in the
database
db_datawriter
Can modify any data in any user table in the
database
db_denydatareader
Cannot select any data from any user table in
the database
db_denydatawriter
Cannot modify any data in any user table in the
database
Procedury składowane obsługujące role bazy
danych
sp_addrole
Creates a new database role in the current
database
sp_addrolemember
Adds a user to an existing database role in
the current database
sp_dbfixedrolepermission
Displays permissions for each fixed
database role
sp_droprole
Removes a database role from the current
database
sp_helpdbfixedrole
Returns a list of fixed database roles
sp_helprole
Returns information about the roles in the
current database
sp_helprolemember
Returns information about the members of
a role in the current database
sp_droprolemember
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ć
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ę
Download