SQL Transakcje

advertisement
1.
2.
3.
4.
5.
Transakcje.
Współbieżność.
Widoki
Indeksy
Tworzenie i usuwanie baz danych- Plik danych i plik logów.
Transakcje to jedno z podstawowych pojęć współczesnych systemów baz danych. Umożliwiają one
współbieżny dostęp do zawartości bazy danych, dostarczając niezbędnych mechanizmów
synchronizacji.
str. 1
Istotą transakcji jest integrowanie kilku operacji w jedną niepodzielną całość.
Transakcja – zbiór operacji na bazie danych, które stanowią w istocie pewną całość i jako takie
powinny być wykonane wszystkie lub żadna z nich. Warunki jakie powinny spełniać transakcje
bardziej szczegółowo opisują zasady ACID (Atomicity, Consistency, Isolation, Durability –
Atomowość, Spójność, Izolacja, Trwałość).
Przykładem transakcji może być transakcja bankowa jaką jest przelew. Muszą tu zostać dokonane 2
operacje – zabranie pieniędzy z jednego konta oraz dopisanie ich do drugiego. W przypadku
niepowodzenia żadna z tych operacji nie powinna być zatwierdzona, gdyż zajście tylko jednej
powodowałoby nieprawidłowości w bazie danych (pojawienie się lub zniknięcie pieniędzy).
Transakcja składa się zawsze z 3 etapów:
•
•
•
rozpoczęcia
wykonania
zamknięcia
str. 2
W systemach bazodanowych istotne jest, aby transakcja trwała jak najkrócej, ponieważ równolegle
może być dokonywanych wiele transakcji i część operacji musi zostać wykonana w pewnej
kolejności. Każdy etap transakcji jest logowany, dzięki czemu w razie awarii systemu (dzięki
zawartości logów), można odtworzyć stan bazy danych sprzed transakcji, która nie została
zamknięta.
Część systemów baz danych umożliwia używanie punktów pośrednich (ang. save point), są to
zapamiętane w systemie etapy transakcji, do których w razie wystąpienia błędu można się wycofać,
bez konieczności anulowania wszystkich wykonanych działań.
W systemach baz danych realizujących standard SQL następujące polecenia dotyczą transakcji:
•
•
•
BEGIN lub BEGIN WORK – rozpoczęcie transakcji;
COMMIT – zatwierdzenie zmian wykonanych w obrębie transakcji;
ROLLBACK – odrzucenie zmian wykonanych w obrębie transakcji;
•
•
SAVEPOINT nazwa – zdefiniowanie punktu pośredniego o określonej nazwie;
RELEASE SAVEPOINT nazwa – skasowanie punktu pośredniego (nie wpływa w żaden
sposób
na stan transakcji);
•
ROLLBACK TO SAVEPOINT nazwa
– wycofanie transakcji do stanu zapamiętanego w
podanym punkcie pośrednim.
str. 3
SQL Server pozwala na rozpoczęcie transakcji w jednym z trzech trybów:
1. Jawne rozpoczęcie transakcji (ang. Explicit) — poprzez wydanie polecenia BEGIN
TRANSACTION. Explicit jest wykonywana zawsze wtedy, gdy programista w kodzie TSQL zadeklaruje chęć wykonania danego zapytania (bloku zapytań) w ramach transakcji.
2. Automatyczne rozpoczęcie i zatwierdzenie transakcji (ang. Autocommit) — poprzez
wykonanie dowolnej instrukcji języka Transact-SQL. Ten tryb jest domyślnym trybem SQL
Servera.
3. Niejawne rozpoczęcie transakcji (ang. Implicit) — poprzez włączenie opcji
IMPLICIT_TRANSACTIONS. W tym trybie wykonanie kolejnej instrukcji spowoduje
automatyczne rozpoczęcie kolejnej transakcji. Transakcje Implicit wykonywane są zawsze
wtedy, gdy co najmniej jedna z następujących komend jest wykonywana: ALTER TABLE,
CREATE, DELETE, DROP, FETCH, GRANT, OPEN, REVOKE, SELECT, TRUNCATE,
UPDATE.
WSPÓŁBIEŻNOŚĆ
Współbieżność transakcji
Współbieżność transakcji występuje w sytuacji kiedy kilka transakcji wykonuje operacje na tych samych
danych. Podczas wykonywania współbieżnych transakcji mogą wystąpić niepożądane anomalie. System
Zarządzania Baz Danych powinien dostarczać mechanizmów, które zapobiegają wystąpieniu niepożądanych
anomalii jednocześnie nie ograniczając wydajności bazy danych.
Celem wprowadzenia poziomów izolacji transakcji jest znalezienie kompromisu pomiędzy poprawnością
wykonywania transakcji a zapewnieniem jak największego stopnia współbieżności wykonywanych
transakcji. Wraz ze wzrostem poziomu izolacji transakcji maleje stopień współbieżności.
Anomalie współbieżnego dostępu
Podczas wykonywania równolegle transakcji na tych samych danych, w zależności od poziomu izolacji
transakcji mogą występować następujące anomalie:
•
brudny odczyt,
str. 4
•
•
•
utracona modyfikacja,
niepowtarzalny odczyt,
fantomy.
Aby właściwie stosować poziomy izolacji niezbędne jest zrozumienie tych anomalii.
Brudny odczyt
Brudny odczyt (ang. Dirty read / Uncommitted dependency) to sytuacja, w której transakcja odczytuje dane
zmienione przez inną transakcje, która później zostaje wycofana, a więc odczytane dane przez pierwszą
transakcje są nieprawdziwe.
Utracona modyfikacja
Utracona modyfikacja (ang. Lost update) to sytuacja, w której dwie transakcje równoległe próbują zmienić
te same dane i zmiany wprowadzane przez jedną transakcje mogą być nadpisane przez drugą transakcję.
Niepowtarzalny odczyt
Niepowtarzalny odczyt (ang. Non-repeatable read / Inconsistent Analysis) powstaje w sytuacji gdy jedna z
transakcji wykonuje kilkakrotnie te same zapytania na danych, które w między czasie są zmieniane przez
inną transakcję, co powoduje, że to samo zapytanie nie generuje tych samych rezultatów.
Fantomy
Fantomy (ang. Phantoms) to sytuacja podobna do niepowtarzalnego odczytu. Jedna transakcja wykonuje
kilkakrotnie to samo zapytanie ale otrzymuje różne zbiory wynikowe, ponieważ inna transakcja w tym
samym czasie usuwa lub dodaje nowe dane, które spełniają warunki zapytania. To powoduje, że za każdym
razem wynikiem zapytania może być inna liczba wierszy.
Poziomy izolacji
Dla każdej transakcji można ustalić w jakim stopniu ma ona być izolowana przed zmianami wykonywanymi
przez inne transakcje. Stopień izolacji determinuje, które anomalie związane z współbieżnym
wykonywaniem transakcji są dozwolone. Poziomy izolacji kontrolują:
•
•
•
czy mają być zakładane blokady na odczytywane dane i jakiego rodzaju blokady są wymagane,
na jak długo blokady odczytu są zakładane,
czy operacja związana z odczytywaniem danych z wiersza modyfikowanego przez inną transakcję:
o ma być zablokowana, aż zostanie zwolniona blokada wyłączności (typu X),
o nie jest blokowana ale odczytuje wersję danych zatwierdzoną wcześniej przed
rozpoczęciem transakcji,
o nie jest blokowana i odczytuje dane niezatwierdzone przez inną transakcję.
Algorytm blokowania dwufazowego (ang. two-phase locking – 2PL ) jest jedną z
najpopularniejszych metod implementacji transakcji. Algorytm ten należy do ogólniejszej
klasy algorytmów sterowania współbieżnością, które stosują blokowanie. Działanie takich
algorytmów w najprostszym przypadku polega na założeniu blokady na danej, która ma być
zapisana lub odczytana, a po wykonaniu operacji blokada jest zwalniana.
Algorytm blokowania dwufazowego składa się z dwóch faz: fazy wzrostu (ang. growing
phase ) oraz fazy zmniejszania (ang. shrinking phase ). W pierwszej fazie transakcja może
blokować zasoby, ale nie wolno jej zwalniać zasobów, które wcześniej już zablokowała. W
str. 5
drugiej fazie transakcja może zwalniać zasoby, lecz nie wolno jej blokować żadnych
nowych zasobów. Jeżeli proces nie chce modyfikować danych dopóki nie osiągnie momentu
przed fazą zmniejszania, to w razie niepowodzenia przy zakładaniu jakiejś blokady może on
zwolnić wszystkie blokady i rozpocząć ponownie algorytm.
Blokady współdzielone S (ang. Shared) są zakładane domyślnie na odczytywanych obiektach tylko
na czas wykonywania zapytania. Jeżeli dane zostały zablokowane w trybie S, to możliwe jest
założenie na nie blokady S przez inne procesy.
Blokady wyłączne X (ang. eXclusive) są zakładane na modyfikowanych obiektach i domyślnie
utrzymywane do zakończenia całej transakcji. Użytkownicy modyfikujący dane blokują innych
użytkowników.
Ustalenie poziomu izolacji nie wpływa na blokady, które są ustawiane aby chronić proces modyfikacji
danych. Transakcja zawsze otrzymuje blokadę wyłączności (typu X) na dane, które modyfikuje, i blokada ta
jest utrzymywana aż do momentu aż transakcja nie zostanie zakończona, niezależnie od tego jaki poziom
izolacji ma ustawiona transakcja. Dla operacji odczytu, poziomy izolacji definiują poziom zabezpieczenia
przed efektami zmian wykonywanych przez inne transakcje.
Standard SQL-92 definuje cztery poziomu izolacji transakcji (kolejność od najniższego stopnia izolacji do
najwyższego):
•
•
•
•
READ UNCOMMITTED - niezatwierdzony odczyt (poziom izolacji 0),
READ COMMITTED - odczyt zatwierdzonych danych (poziom izolacji 1),
REPEATABLE READ - powtarzalny odczyt (poziom izolacji 2),
SERIALIZABLE - uszeregowalny (poziom izolacji 3).
str. 6
W MS SQL Server stosuje się dwa dodatkowe poziomy izolacji oparte na wersjonowaniu wierszy. Jeden z
nich to nowa implementacja odczytu zatwierdzonych danych READ UNCOMMITTED z włączoną opcją
READ_COMMITTED_SNAPSHOT , a drugi to nowy poziom izolacji, wyższy od powtarzalnego odczytu ale
niższy od poziomu uszeregowalnego. Jest to poziom SNAPSHOT.
Możliwość wystąpienia anomalii związanych z współbieżnością transakcji w zależności od
poziomu izolacji
READ UNCOMMITTED - Odczyt niezatwierdzonych danych
Odczyt niezatwierdzonych danych (ang. read uncommitted) jest najniższym poziomem izolacji, która
zabezpiecza jedynie przed odczytem fizycznie uszkodzonych danych. Jest to najmniej restrykcyjne
ustawienie, które praktycznie powoduje ignorowanie założonych blokad. Ten poziom izolacji jest dostępny
tylko dla transakcji wykonywanych w trybie READ ONLY.
Transakcja wykonywana z tym poziomem izolacji nie zakłada blokad współdzielonych, w celu
uniemożliwienia innej blokadzie modyfikacji odczytywanych przez nią danych. Transakcje te nie są
blokowane przez blokady wyłączności, które chroniłyby tę transakcję przed odczytem wierszy, które były
zmodyfikowane ale nie zatwierdzone przez inną transakcję. Wartości danych mogą być zmienione, wiersze
mogą znikać lub pojawiać się nowe przed ukończeniem transakcji.
READ COMMITTED - Odczyt zatwierdzonych danych
Poziom izolacji odczyt zatwierdzonych danych (ang. read committed) zapewnia transakcji, która taki poziom
posiada, że odczytuje ona dane utworzone wyłącznie przez zatwierdzone transakcje i wartość żadnej danej,
zapisywanej przez tę transakcję nie zostanie zmieniona przez inną transakcję do momentu zakończenia tej
transakcji. Poziom ten nie gwarantuje jednak, że wartość danej odczytywanej przez tę transakcję nie
zostanie zmieniona przez inną transakcję do momentu jej zakończenia. Ten poziom izolacji nie gwarantuje
również rozwiązania anomalii fantomów i, stąd, nie gwarantuje uszeregowalności wszystkich realizacji.
W MS SQL Server jest to domyślny poziom izolacji transakcji i występuje on w dwóch wersjach, w zależności
str. 7
od tego czy włączona jest opcja READ_COMMITTED_SNAPSHOT (domyślnie jest wyłączona). Jeśli jest
wyłączona to transakcja zachowuje się tak jak to jest opisane powyżej, natomiast jeśli jest włączona to
podczas zmiany wartości w bazie w ramach transakcji jest tworzony snapshot starych danych dzięki czemu
inna transakcja może bez problemu odczytać wartość z bazy nie czekając na zatwierdzenie pierwszego
zapisu. Niesie to jednak za sobą poważne konsekwencje – z pewnością znacznie zmniejszy się liczba
deadlocków (zakleszczeń transakcji) w bazie ale taka sytuacja może nie być akceptowalna z punktu widzenia
biznesowego.
REPEATABLE READ - Powtarzalny odczyt
Poziom izolacji powtarzalny odczyt (ang. repeatable read) zapewnia, że każda transakcja, która ten poziom
ma ustawiony odczytuje dane utworzone wyłącznie przez zatwierdzone transakcje i wartość żadnej danej,
odczytywanej lub zapisywanej przez tę transakcję nie zostanie zmieniona przez inną transakcję do
momentu zakończenia transakcji. Niestety, ten poziom izolacji nie gwarantuje rozwiązania anomalii
fantomów i, stąd, nie gwarantuje uszeregowalności wszystkich realizacji.
Transakcja wykonywana na tym poziomie izolacji nie może odczytywać danych, które zostały
zmodyfikowane ale jeszcze nie zatwierdzone przez inne transakcje oraz żadne inne transakcje nie mogą
modyfikować danych, które są odczytywane przez tę transakcję dopóki transakcja się nie zakończy.
Zakładane są blokady współdzielone (typu S) na wszystkie dane odczytywane przez każde polecenie
transakcji i utrzymywane są do zakończenia transakcji. Takie blokady nie pozwalają innym transakcją
modyfikować ani wierszy, które są odczytywane przez tę transakcję. Inne transakcje mogą jednak wstawiać
nowe wiesze, które pasują do warunków wyszukiwania bieżącej transakcji, co powoduje powstawaniu
anomalii fantomów. Ponieważ blokady współdzielone trzymane są przez tę transakcje do czasu jej
ukończenia a nie po wykonaniu danego polecenia, dlatego współbieżność jest znacznie mniejsza niż przy
izolacji domyślnej READ COMMITTED, dlatego należy używać tego poziomu tylko gdy jest to konieczne.
SNAPSHOT - Migawka
Poziom izolacji SNAPSHOT - miagawka został zaimplementowany w MS SQL Server i wykorzystuje
technologię wersjonowania wierszy. Każda transakcja w momencie jej utworzenia tworzy sobie snapshot
danych i na nim pracuje do czasu jej zakończenia. Inne transakcje nie są w stanie zmodyfikować danych,
które zostały użyte. Nawet jeżeli inna transakcja zmodyfikuje dane to oryginalna transakcja cały czas
pracuje na danych z momentu jej utworzenia. Ten poziom izolacji można używać w bazie MS SQL Server
tylko jeśli włączona jest opcja ALLOW_SNAPSHOT_ISOLATION. Jeżeli transakcja na poziomie izolacji
SNAPSHOT korzysta z kilku baz danych opcja ALLOW_SNAPSHOT_ISOLATION musi być włączona na każdej z
tych baz.
Transakcja wykonywana na tym poziomie izolacji będzie wykorzystywała wersję danych, które istniały przed
rozpoczęciem się transakcji. Transakcja może tylko rozpoznać zmiany danych, które były zatwierdzone
przed rozpoczęciem transakcji. Zmiany danych wykonane przez inne transakcje po rozpoczęciu tej transakcji
nie są widoczne dla poleceń wykonywanych podczas tej transakcji. Z wyjątkiem sytuacji gdy baza danych
jest odtwarzana transakcje na poziomie izolacji SNAPSHOT nie zakładają blokad gdy czytają dane.
Transakcje te czytając dane nie blokują innych transakcji przez zmianą tych danych. Inne transakcje
zapisujące dane nie blokują transakcji SNAPSHOT przed odczytem danych.
Gdy transakcja jest cofana podczas odzyskiwania bazy danych transakcje typu SNAPSHOT będą wymagały
str. 8
zakładania blokad jeśli odczytywane dane są zablokowane przez inne transakcje, które są wycofywane.
Transakcja SNAPSHOT będzie zablokowana do czasu aż wycofywanie się nie zakończy. Blokada jest
zwalniana natychmiast po zakończeniu transakcji.
MS SQL Server nie wspiera wersjonowania metadanych, dlatego niektóre polecenia DDL nie mogą być
wykonywane na tym poziomie. Są to: ALTER TABLE, CREATE INDEX, CREATE XML INDEX, ALTER INDEX,
DROP INDEX, DBCC REINDEX, ALTER PARTITION FUNCTION, ALTER PARTITION SCHEME.
SERIALIZABLE - Uszeregowalny
Poziom izolacji uszeregowalny gwarantuje najwyży poziom izolacji. Transakcja wykonywana na tym
poziomie izolacji odczytuje dane utworzone wyłącznie przez zatwierdzone transakcje i wartość żadnej
danej, odczytywanej lub zapisywanej przez tę transakcję, nie zostanie zmieniona przez inną transakcję do
momentu zakończenia transakcji. Żadna inna transakcja nie może także dodać danych lub usunąć danych,
które spełniały by warunki wyszukiwania używane w którymkolwiek poleceniu transakcji SERIALIZABLE. Ten
poziom izolacji gwarantuje uszeregowalność wszystkich realizacji transakcji.
Blokady zakładane na zakres wartości kluczy pasujących to warunków wyszukiwania każdego polecenia
transakcji. To blokuje inne transakcje przez modyfikacją lub wstawianiem wierszy, które pasowałyby do
jakiegokolwiek zapytania wykonywanego przez tę transakcję. Oznacza to, że każde zapytanie w transakcji
wykonywane ponownie podczas tej transakcji zawsze będzie zwracało ten sam zestaw wierszy. Blokady te
są utrzymywane aż do zakończenia transakcji.
Implementacja w MS SQL Server
Do ustawiania poziomu izolacji transakcji służy polecenie SET TRANSACTION ISOLATION LEVER, które trzeba
wykonać przez rozpoczęciem transakcji.
SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE
READ | SNAPSHOT | SERIALIZABLE } ;
Poniżej przykład ustawiania poziomu izolacji dla transakcji:
USE AdventureWorks2012;
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
BEGIN TRANSACTION;
GO
SELECT *
FROM HumanResources.EmployeePayHistory;
GO
SELECT *
FROM HumanResources.Department;
GO
COMMIT TRANSACTION;
str. 9
GO
Włączenie możliwości korzystania z poziomów izolacji wykorzystujących SNAPSHOT:
ALTER DATABASE NazwaBazyDanych
SET ALLOW_SNAPSHOT_ISOLATION ON
W MS SQL Server domyślnie ustawiony jest poziom izolacji READ COMMITTED, jeśli chcemy wykonać
polecenie na poziomie izolacji READ UNCOMMITTED wystarczy w zapytaniu użyć opcji NOLOCK. Poniżej
przykład:
SELECT * FROM NazwaTabeli WITH(NOLOCK)
Zakreszczenie –(ang. Deadlock)
Metody likwidacji zakleszczeń:
•
•
•
Wycofać obie transakcje
System musi pozwolić wybrać którą transakcję lepiej wycofać, a która ma się dokończyć( ilość
zasobów zarezerwowanych, czas wykonania, ile już sie wykonało transakcji)
Niedopuszczenie do zakleszczenia ( z góry założyć co będzie potrzebne do zdefiniowania transakcji)
str. 10
Zadanie1.- przykład transakcji
Współbieżność: zeskanować str 188 -194 Helion Edukacja
1.
2.
3.
4.
5.
6.
Model optymistyczny, model pesymistyczny
Blokowanie danych- blokada s, blokada x
Zakleszczenia
Izolowanie transakcji
Poziomy izolowania transakcji
Widok (ang View) to tak naprawdę zwykła tabela „wirtualna”, którą tworzymy za pośrednictwem
normalnego zapytania. Z widoku korzystamy jak ze zwykłej tabeli, możemy więc wykonywać „na
nim” dowolne kwerendy. Jest jednak pewna różnica w stosunku do dotychczas używanych tabel.
Mianowicie widoki do póki nie zostanie utworzony dla nich indeks nie mają fizycznej reprezentacji
swoich danych.
str. 11
Widok (perspektywa) to logiczny byt (obiekt), osadzony na serwerze baz danych. Umożliwia
dostęp do podzbioru kolumn i wierszy tabel lub tabeli na podstawie zapytania w języku SQL, które
stanowi część definicji tego obiektu. Przy korzystaniu z widoku jako źródła danych należy
odwoływać się identycznie jak do tabeli. Operacje wstawiania, modyfikowania oraz usuwania
rekordów nie zawsze są możliwe ( np. w sytuacji gdy widok udostępnia część kolumn dwóch tabel
tb_A oraz tb_B bez kolumny z kluczem głównym tabeli tb_B ). W niektórych SZBD widok służy
wyłącznie do pobierania wyników i ograniczania dostępu do danych.
Składnia SQL do utworzenia widoku:
CREATE VIEW nazwa_widoku [(kolumna1, kolumna2,
AS
SELECT ...;
..., kolumnaN )]
DROP VIEW – usuniecie widoku
ALTER VIEW – modyfikacja widoku
Składnia SQL do pobrania danych z widoku:
SELECT * FROM nazwa_widoku;
Np. CREATE VIEW [dbo].[V_OFERTA]
AS
id_produktu, nr_produktu, nazwa, id_kategorii, cena_za_opakowanie,
SELECT
stan_magazynu, wycofany, foto
FROM
WHERE
dbo.produkt
(wycofany = 0) AND (stan_magazynu > 0)
GO
UWAGA
Przy tworzeniu widoków nie można używać klauzuli ORDER BY! Jeżeli potrzebujemy
posortowane dane, należy operację tą wykonać posługując się już stworzonym widokiem.
Do zapamiętania:
WIDOK - tabela wirtualna, nie jest pamiętana fizycznie i jest obliczana
dynamicznie
TABELA TYMCZASOWA - jest obliczana tylko raz i jest usuwana automatycznie po
zakoñczenie sesji
- widok pozwala na prezentowanie użytkownikowi danych z jednej lub wielu tabel,
danych wyliczanych (ulatwie odczytanie danych)
str. 12
- ogranicza dostep do poufnych danych, ukrywa strukture tabel (poufność
danych)
- ulatwia zarzadzanie uprawnieniami uzytkownikow
- widok nie może dotyczyć tabel tymczasowych
- widoki nie są usuwane razem z tabelą – trzeba je usunąć oddzielnie; mo¿na
dla nich tworzyæ triggery
- widoki pamiętają ograniczenia obowiązujące w tabelach bazowych
- możliwe jest (z pewnymi ograniczeniami) modyfikowanie danych w tabelach
bazowych poprzez widok
- definicja widoku nie moze zawierac ORDER BY (chyba ze
zawiera TOP n), COMPUTE, INTO
-- CREATE, ALTER, DROP VIEW
Indeksy
Indeksy są definiowane w celu zwiększenia prędkości wykonywania operacji na tabeli. Są to
uporządkowane struktury zawierające dane z wybranych kolumn tabeli. Zaletą stosowania
indeksów jest ograniczenie ilości danych odczytywanych z bazy, przyśpieszenie wyszukiwania
informacji oraz sortowanie danych. Ich wadą jest to, że zajmują na dysk dodatkowe miejsce, muszą
być na bieżąco aktualizowane, a każde wstawienie, usunięcie lub aktualizacja danych w tabeli
wiąże się z aktualizacją wszystkich zdefiniowanych dla nich indeksów.
Indeksy można budować na etapie tworzenia tabel lub definiować je już w istniejącej tabeli. Instrukcja
tworzenia indeksu ma postać:
CREATE INDEX nazwa_indeksu ON nazwa_tabeli (nazwa_kolumny)
Tworzenie indeksu w istniejącej tabeli:
CREATE INDEX indeks_tytul ON ksiazki (tytul);
Tworzenie unikatowego indeksu ma postać:
CREATE UNIQUE INDEX nazwa_indeksu ON nazwa_tabeli (nazwa_kolumny);
Tak w zaindeksowanej kolumnie powtarzające się wartości są niedozwolone.
Instrukcja tworzenia indeksów w innych serwerach bazodanowych może różnić się od podanej.
Aktualizacja tabeli z indeksami zajmuje więcej czasu niż aktualizacja tabeli bez indeksów. Dlatego
należy tworzyć indeksy tylko dla kolumn, które będą często przeszukiwane. Przed utworzeniem
indeksów warto przeanalizować zapytania i podjąć decyzję, gdzie i jakie indeksy utworzyć. Na
pewno indeksy powinny być utworzone dla pól kluczy głównych i kluczy obcych.
Do usuwania indeksu służy instrukcja DROP INDEX.
DROP INDEX nazwa_tabeli.nazwa_indeksu
1.
2.
3.
4.
Tworzenie i usuwanie baz danych- Plik danych i plik logów.
Tworzenie i usuwanie baz danych- Plik danych i plik logów.
Tworzenie i usuwanie baz danych- Plik danych i plik logów.
Tworzenie i usuwanie baz danych- Plik danych i plik logów.
str. 13
Tworzenie i usuwanie baz danych- Plik danych
i plik logów.
Pliki z danymi1
SQL Server przechowuje dane dotyczące baz danych w zwykłych plikach dyskowych. Każda baza
danych:
•
•
•
Zawiera jeden podstawowy plik z danymi (*.mdf)
Może zawierać dodatkowe pliki z danymi (*.ndf)
Zawiera plik z dziennikiem transakcji – transactional log (*.ldf)
Wszystkie dane z baz danych takie jak: tabele wraz z zawartością, definicje procedur składowanych,
wyzwalacze, uprawnienia i inne, są trzymane w plikach z danymi. Dodatkowym plikiem jest dziennik
transakcji, zwany często potocznie logiem transakcyjnym. Wszystkie transakcje wykonywane w bazie
danych są zapisywane najpierw w dzienniku transakcji, a dopiero później zapisywane w plikach z
danymi (zasada WAL: Write-Ahead Logging). Dzięki danym z logu serwer jest w stanie między innymi
wycofywać transakcje (ROLLBACK) oraz zachować spójność danych po awarii. Dziennik transakcji
pozwala również na odtworzenie stanu bazy danych do dowolnego punktu w czasie.
1
http://wss.geekclub.pl/baza-wiedzy/kurs-transact-sql-czesc-8-bazy-danych,1710
str. 14
Zakładanie bazy danych
Aby założyć bazę danych, wystarczy w narzędziu Management Studio wybrać opcję New Database
i określić podstawowe parametry tej bazy, w tym lokalizację plików z danymi i z dziennikiem.
Na pierwszej zakładane (General) podajemy nazwę bazy i określamy listę plików i ich parametry.
Każdy z plików posiada logiczną nazwę, po której będziemy odwoływać się do niego w
przyszłości. Nazwa ta nie musi być identyczna z fizyczną nazwą pliku, pod jaką będzie on
widoczny w systemie operacyjnym. Dla każdego pliku powinniśmy określić jego rozmiar
początkowy (Initial Size) i sposób, w jaki plik będzie się rozrastał (Autogrowth). Należy rozważnie
dobrać te parametry. Rozrastanie się pliku jest procesem obciążającym serwer, więc nie powinno
zdarzać się zbyt często. Z drugiej strony, nie ma sensu na zapas rezerwować bardzo dużej ilości
miejsca. Należy więc oszacować, jaki będzie początkowy rozmiar bazy (po utworzeniu tabel i
innych obiektów naszej aplikacji i imporcie początkowych danych) oraz ile danych będzie
przybywać w pewnym okresie czasu (np. tygodniowo).
Autogrowth
Aby zezwolić na powiększanie plików bazy danych i logu transakcyjnego, przechodzimy do
właściwości bazy danych i na stronie Files wciskamy przycisk […] w pozycji Autogrowth, a
następnie zaznaczamy opcje Enable Autogrowth.
Poniżej mamy możliwość określenia czy plik będzie powiększał się procentowo (In Percent) czy
będzie powiększał się w określoną ilość megabajtów (In Megabytes).
Możemy również określić maksymalny rozmiar pliku, zaznaczając opcję Restricted File Growth i
określając ilość megabajtów. Jeśli nie chcemy określać maksymalnego rozmiaru, zaznaczamy
Unrestricted File Growth.
str. 15
Jedną z najbardziej istotnych dostępnych tu opcji jest Recovery model. Określa on, w jaki sposób
serwer będzie korzystał z dziennika transakcji:
•
•
•
Full – w dzienniku transakcji znajdą się wszystkie operacje wykonane na bazie danych i nie będą z
niego usuwane automatycznie. Jest to ustawienie zalecane dla każdej bazy, w której priorytetem
jest bezpieczeństwo danych.
Bulk-logged – do dziennika nie zostaną zapisane niektóre operacje np. SELECT ... INTO ...
czy BULK INSERT.
Simple – po zapisaniu wyniku działania transakcji do pliku z danymi informacje są usuwane z
dziennika. Serwer zapisuje w logu tylko minimalną ilość informacji. Pozwala to zaoszczędzić nieco
zasobów serwera, jednak przy tym ustawieniu nie będziemy mogli przywracać bazy do dowolnego
punktu w czasie. Jest to ustawienie zalecane do baz testowych, w których nie zależy nam na
bezpieczeństwie danych, a nie chcemy zajmować się okresowym czyszczeniem dziennika (opisane
w wykładzie 8).
Bazę danych możemy założyć również z poziomu języka SQL. Przykład polecenia:
CREATE DATABASE Baza ON (
NAME = Baza_dat,
FILENAME = 'e:\data\baza.mdf',
SIZE = 2MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 5MB)
LOG ON (
NAME = 'Baza_log',
FILENAME = 'f:\data\bazalog.ldf',
SIZE = 2MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 5MB)
Polecenie to założy bazę danych o nazwie "Baza" z jednym plikiem z danymi i jednym plikiem z
dziennikiem transakcji. Podane foldery muszą istnieć, aby wykonanie tego polecenia się powiodło.
str. 16
2
Usuwanie bazy danych
Niepotrzebną bazę danych możemy usunąć używając opcji Delete na wybranej bazie lub wpisując
polecenie DROP DATABASE nazwa_bazy. Usunięcie nie powiedzie się, gdy do bazy są podłączeni
użytkownicy.
Logiczna struktura bazy danych podsumowanie
2
http://etacar.put.poznan.pl/tadeusz.pankowski/11-sql-programowanie.pdf
str. 17
Transact-SQL
jest rozszerzeniem języka SQL stosowanym dla serwerów MS SQL
Serwer. T-SQL oznacza transakcyjny SQL, czyli rozszerzenie języka SQL umożliwiające tworzenie
konstrukcji takich jak pętle, instrukcje warunkowe oraz zmienne. Jest używany do tworzenia
str. 18
wyzwalaczy, procedur i funkcji składowanych w bazie. W języku T-SQL ciąg poleceń
bezpośrednio kierowany do serwera powinien kończyć się słowem kluczowym GO.
Zmienne
Zmienne deklarowane przez użytkownika są zmiennymi lokalnymi i istnieją tylko w odrąbie
skryptu. Muszą być poprzedzone znakiem @. Deklaracja zmiennych jest realizowana za pomocą
instrukcji:
DECLARE @ zmienna typ_danych
Procedura jest serią poleceń zapisaną w języku programowania baz danych, służącą do
wykonywania obsługi na elementach bazy: tabelach, formularzach, raportach czy kwerendach.
Procedura składowana (ang. stored procedure) – to jeden z elementów implementacji bazy
danych. Procedura składowana jest umiejscowiona bezpośrednio w systemie bazy danych, a nie po
stronie klienta. Pozwala to na zmniejszenie liczby kroków wymiany danych pomiędzy klientem a
systemem zarządzania bazą danych, co może przyczynić się do wzrostu wydajności systemu.
Zastosowanie procedur składowanych pozwala również wprowadzić bardziej przejrzysty
interfejs pomiędzy bazą danych a aplikacjami z niej korzystającymi. W starszych systemach baz
danych procedury były prekompilowane, co stwarzało dalszy zysk wydajnościowy.
Procedury składowane mogą być wykonywane w podany sposób: EXECUTE nazwa_procedury lub
EXEC nazwa_procedury.
Przykład:
Procedura P_DodOpinia dodaje opinie do bazy danych.
CREATE PROCEDURE [dbo].[P_DodOpinia]
(@id_produktu AS int,@ocena_punktowa AS
int ,@ocena_slowna AS nvarchar(max))
AS
BEGIN
INSERT INTO [opinia]
([id_produktu],[ocena_punktowa],[ocena_slowna] )
(SELECT @id_produktu
,@ocena_punktowa
,@ocena_slowna )
END
GO
Wywołanie procedury:
str. 19
exec P_DodOpinia 5,6,'super smak'
Rezultat wywołanej procedury przedstawia rysunek nr 24.
Rezultat wywołanej procedury P_DodOpinia
Wyzwalacz (ang. trigger) – procedura wykonywana automatycznie jako reakcja na pewne
zdarzenia w tabeli bazy danych. Wyzwalacze mogą ograniczać dostęp do pewnych danych, rejestrować
zmiany danych lub nadzorować modyfikacje danych.
Istnieje kilka typów wyzwalaczy. Wyzwalacze BEFORE - wykonywane przed instrukcją
generującą zdarzenie. Wyzwalacze AFTER są wykonane po instrukcji generującej zdarzenie. W
niektórych bazach danych są również wyzwalacze INSTEAD OF - są one wykonywane zamiast
instrukcji generującej zdarzenie.
Istnieją trzy typowe zdarzenia powodujące wykonanie wyzwalaczy:
•
•
•
dopisanie nowego rekordu do bazy danych w wyniku wykonania instrukcji INSERT,
zmiana zawartości rekordu w wyniku wykonania instrukcji UPDATE oraz
usunięcie rekordu w wyniku wykonania instrukcji DELETE.
Główne cechy wyzwalaczy to:
•
•
•
nie mogą mieć parametrów (ale mogą zapisywać dane w tabelach tymczasowych)
nie mogą zatwierdzać transakcji (COMMIT) ani ich wycofywać (ROLLBACK) ponieważ działają w
kontekście instrukcji SQL, która spowodowała ich uruchomienie
mogą generować dodatkowe błędy, jeżeli są źle napisane.
str. 20
•
•
wierszy.
str. 21
Download