E N C Y K L O P E D I E
SQL Server 2005 KOMPENDIUM ZNALOSTÍ PRO ZAČÁTEČNÍKY I PROFESIONÁLY
Velká kniha T-SQL & SQL Server 2005 je určena všem programátorům webových aplikací a administrátorům, kteří potřebují pracovat s Transact SQL a SQL Serverem 2005. Zahrnuje totiž prakticky všechny oblasti, se kterými se můžete ve své praxi setkat. Kniha vás formou přehledných návodů vede od naprostých začátků (jako je např. zvládnutí příkazů select, insert, update a delete) k transakcím, tabulkám, indexům, pohledům, uloženým procedurám, uživatelsky definovaným funkcím, typům a triggerům, aby samozřejmě neopomenula různá pokročilá témata jako jsou webové služby, možnosti pro zpracování chyb, integrace s CRL, účastníci, šifrování, optimalizace databází, zrcadlení databází, distribuované dotazy či ladění výkonu. Nechybí také důležité informace o konfiguraci SQL serveru, či témata věnovaná zálohování a obnově databáze.
JOSEPH SACK je nezávislý konzultant z Minneapolis ve státě Minnesota. Od roku 1997 zajišťuje zákaznickou podporu a vývoj aplikací v prostředí SQL Serveru pro klienty z různých oblastí. Patří mezi ně například finanční služby, distribuce multimédií, informační technologie, výroba zboží či nákup a prodej nemovitostí. Je držitelem certifikátu MCDBA (Microsoft Certified Database Administrator).
© Foto: Jiří Heller www.heller.cz
Pod tímto logem vycházejí publikace určené pro každého, kdo se zajímá o tvorbu webových stránek. Od ryze praktických příruček a průvodců až po komplexní publikace o všem, co potřebuje webdesignér při každodenní práci. Na vydavatelský plán a výhody, které můžete získat, se informujte na adrese vydavatelství.
www.zoner.cz Fotografie z nabídky fotobanky HELLER.CZ
E N C Y K LO P E D I E W E B D E S I G N E R A
Věrným čtenářům je určen výhodný PRÉMIOVÝ PLUS PROGRAM. DOPORUČENÁ CENA: 670 KČ KATALOGOVÉ ČÍSLO: ZR618
Zoner Press tel.: 532 190 883 fax: 543 257 245 e-mail: knihy@zoner.cz http://www.zonerpress.cz
ISBN
978-80-86815-57-2
ZONER software, s.r.o., Nové sady 18, 602 00 Brno
VELKÁ KNIHA
O autorovi
Joseph Sack
VELKÁ KNIHA kompendium pro začátečníky i profesionály
T-SQL &
ZONER software, s.r.o. významný producent software v oblasti digitální fotografie, počítačové grafiky a multimédií, poskytovatel internetových služeb, souvisejících s prezentací na internetu a e-komercí, a nakladatelství odborné literatury.
T-SQL & SQL Server 2005
ENCYKLOPEDIE WEBDESIGNERA
Joseph Sack
V E L K Á K N I HA
W E B D E S I G N E R A
T-SQL &
SQL Server 2005 KOMPENDIUM ZNALOSTÍ PRO ZAČÁTEČNÍKY I PROFESIONÁLY
© Foto: Jiří Heller
Joseph Sack
www.zonerpress.cz 9 7 8 8 0 8 6
8 1 5 5 7 2
VELKÁ KNIHA
T-SQL & SQL Server 2005 KOMPENDIUM ZNALOSTÍ PRO ZAČÁTEČNÍKY I PROFESIONÁLY
Joseph Sack
SQL Server 2005 T-SQL Recipes: A Problem-Solution Approach Joseph Sack Original English language edition published Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2005 by Apress L.P. Czech language edition copyright © 2007 by ZONER software, s.r.o. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Apress L.P. Originální anglické vydání vydal Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2005 Apress L.P. České vydání vydal ZONER software, s.r.o., copyright © 2007. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslovného svolení Apress L.P.
Velká kniha T-SQL & SQL Server 2005 kompendium znalostí pro začátečníky i profesionály Autor: Joseph Sack Copyright © ZONER software, s.r.o. Vydání první v roce 2007. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZR618 ZONER software, s.r.o. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP: Filip Božoň © Cover foto: Jiří Heller, HELLER.CZ s.r.o, www.heller.cz Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, s.r.o. Nové sady 18, 602 00 Brno tel.: 532 190 883, fax: 543 257 245 e-mail: knihy@zoner.cz http://www.zonerpress.cz
ISBN 978-80-86815-57-2
Stručný obsah Kapitola 1
SELECT
25
Kapitola 2
INSERT, UPDATE, DELETE
95
Kapitola 3
Transakce, uzamykání, blokování a mrtvé zámky
121
Kapitola 4
Tabulky
149
Kapitola 5
Indexy
203
Kapitola 6
Fulltextové vyhledávání
223
Kapitola 7
Pohledy
243
Kapitola 8
Funkce SQL Serveru
263
Kapitola 9
Podmíněné zpracování, řízení toku, kurzory
313
Kapitola 10
Uložené procedury
333
Kapitola 11
Uživatelsky definované funkce a typy
353
Kapitola 12
Triggery
381
Kapitola 13
Integrace s CLR
411
Kapitola 14
XML
431
Kapitola 15
Webové služby
453
Kapitola 16
Zpracování chyb
471
Kapitola 17
Účastníci
487
Kapitola 18
Subjekty a povolení
517
Kapitola 19
Šifrování
549
Kapitola 20
Service Broker
579
Kapitola 21
Konfigurace a prohlížení voleb SQL Serveru
617
Kapitola 22
Vytváření a konfigurace databází
623
Kapitola 23
Integrita a optimalizace databáze
679
Kapitola 24
Údržba databázových objektů a závislosti objektů
699
Kapitola 25
Zrcadlení databáze
705
Kapitola 26
Momentky databáze
727
Kapitola 27
Propojené servery a distribuované dotazy
735
Kapitola 28
Vylaďování výkonu
753
Kapitola 29
Zálohy a zotavení
801
Obsah O autorovi
23
O odborném recenzentovi
23
Poděkování
23
Úvod
24
Zdrojové soubory
24
Kapitola 1
SELECT
Základní tvar příkazu SELECT
25 25
Výběr konkrétních sloupců pro všechny řádky
26
Výběr všech sloupců pro všechny řádky
27
Selektivní dotazy se základní klauzulí WHERE
28
Použití WHERE pro specifikaci řádků, které se mají vrátit v sadě výsledků
28
Kombinace vyhledávacích podmínek
29
Negace vyhledávací podmínky
30
Klauzule WHERE pište jednoznačně
31
Jak se používají operátory a výrazy
32
Použití operátoru BETWEEN pro hledání data od-do
34
Porovnávání
34
Kontrola hodnot NULL
35
Vracení řádků na základě seznamu hodnot
36
Zástupné symboly s operátorem LIKE
36
Řazení výsledků
38
Klauzule ORDER BY
38
Řazení výsledků s využitím klíčového slova TOP
40
Seskupování dat
42
Klauzule GROUP BY
42
Klauzule GROUP BY ALL
44
Selektivní získávání skupin pomocí HAVING
45
Techniky pro klauzuli SELECT
46
Odstranění duplicitních hodnot pomocí DISTINCT
46
DISTINCT v agregačních funkcích
47
Aliasy sloupců
48
Použití SELECT pro vytvoření skriptu
49
Spojování řetězců v dotazu
50
Dotaz SELECT, který vytvoří seznam hodnot oddělených čárkami
51
Klauzule INTO
52
Poddotazy
53
Testy existence shodujících se řádků pomocí poddotazů Dotazy na více zdrojů dat
53 54
Vnitřní spojení
55
Vnější spojení
57
Kartézské součiny
58
Samospojení
58
Odvozené tabulky
60
Kombinování sad výsledků s UNION
61
Vyvolání tabulkové funkce pro každý řádek pomocí APPLY
62
Klauzule CROSS APPLY
63
Klauzule OUTER APPLY
65
Pokročilé techniky pro zdroje dat Vrácení náhodných řádků pomocí TABLESAMPLE
67 67
Jak se s PIVOT vyrábějí kontingenční tabulky
68
Normalizování dat s UNPIVOT
71
Návrat odlišných nebo shodujících se řádků s EXCEPT a INTERSECT
73
Souhrny dat
76
Souhrny dat s WITH CUBE
76
Použití funkce GROUPING s WITH CUBE
78
Souhrny dat s WITH ROLLUP
78
Potlačení plánu vykonání dotazu
79
Pokyny pro operaci spojení
80
Použití pokynů pro dotaz
82
Pokyny pro tabulku
85
Společné tabulkové výrazy
86
Nerekurzivní společné tabulkové výrazy
87
Rekurzivní společné tabulkové výrazy
90
Kapitola 2
INSERT, UPDATE, DELETE
INSERT
95 95
Vkládání řádků do tabulky
96
Vložení řádku pomocí výchozích hodnot
97
Explicitní vkládání hodnot do sloupce s atributem IDENTITY
98
Vložení řádku do tabulky se sloupcem datového typu uniqueidentifier
100
Vkládání řádků příkazem INSERT...SELECT
101
Vkládání dat prostřednictvím uložené procedury
102
UPDATE
104
Aktualizace jediného řádku
104
Aktualizace řádků na základě klauzulí FROM a WHERE
105
Aktualizace sloupců, které mají datové typy pro objemná data
107
Vkládání nebo aktualizace souboru s obrázkem s OPENROWSET a BULK
109
DELETE
112
Odstraňování řádků
112
Vyprázdnění tabulky
114
Klauzule OUTPUT Klauzule OUTPUT v příkazech INSERT, UPDATE a DELETE
115 115
Modifikace dat po etapách pomocí TOP
118
Odstraňování řádků po etapách
119
Kapitola 3
Transakce, uzamykání, blokování a mrtvé zámky
Řízení transakcí
121 121
Explicitní transakce
123
Zobrazení nejstarší aktivní transakce s DBCC OPENTRAN
126
Uzamykání
128
Prohlížení aktivity zámků Transakce, uzamykání a souběžné zpracování Příkaz SET TRANSACTION ISOLATION LEVEL Blokování
130 132 134 138
Identifikace a vyřešení blokujících procesů
139
Příkaz SET LOCK TIMEOUT
142
Mrtvé zámky
143
Identifikace mrtvého zámku pomocí indikátorů sledování
143
Nastavení priority mrtvého zámku
147
Kapitola 4
Tabulky
Základy práce s tabulkami
149 149
Vytvoření tabulky
152
Přidání nového sloupce do existující tabulky
153
Změna definice sloupce
154
Vytvoření vypočítávaného sloupce
155
Odstranění sloupce tabulky
156
Získání informací o tabulce
157
Odstranění tabulky
157
Základy kolace
158
Prohlížení metadat kolace
158
Vyznačení kolace sloupce
160
Klíče
160
Vytvoření tabulky s primárním klíčem
162
Přidání omezení primárního klíče do existující tabulky
163
Vytvoření tabulky s odkazem cizího klíče
163
Přidání cizího klíče do existující tabulky
164
Vytváření rekurzivních cizích klíčů
165
Povolení kaskádových změn v cizích klíčích
167
Náhradní klíče
169
Použití IDENTITY během vytváření tabulky
170
Zobrazení a oprava hodnot IDENTITY s DBCC CHECKIDENT
171
Vlastnost ROWGUIDCOL
173
Omezení
174
Omezení UNIQUE
174
Přidání omezení UNIQUE do existující tabulky
175
Omezení CHECK
176
Přidání omezení CHECK do existující tabulky
177
Vypínání a zapínání omezení
178
Přidání omezení DEFAULT během vytváření tabulky
180
Přidání omezení DEFAULT do existující tabulky
181
Odstranění omezení z tabulky
182
Dočasné tabulky a tabulkové proměnné
182
Dočasná tabulka pro opakované vyhledávání v dávce
184
Vytvoření tabulkové proměnné, která obsahuje dočasnou sadu výsledků
185
Jak zvládnout velmi rozsáhlé tabulky
186
Implementace horizontálního členění tabulky na oblasti
189
Určení oblasti, ve které se nacházejí data
192
Přidání nové oblasti
194
Odstranění oblasti
196
Přesun oblasti do jiné tabulky
197
Odstraňování funkcí a schémat členění
199
Umístění tabulky do skupiny souborů
199
Kapitola 5
Indexy
Přehled indexů
203 203
Vytvoření indexu tabulky
206
Vynucení jedinečnosti ve sloupcích, které nejsou částí klíče indexu
208
Vytvoření složeného indexu
209
Určení směru řazení sloupce indexu
210
Prohlížení metadat indexu
211
Vypnutí indexu
212
Odstraňování indexů
213
Změna existujícího indexu s DROP_EXISTING
214
Řízení výkonu a souběžného zpracování při budování indexu
214
Přechodné vytváření indexů v Tempdb
215
Řízení plánu paralelního vykonání pro vytvoření indexu
215
Přístup k tabulce během vytváření indexu
216
Volby indexu
216
Index s vloženými sloupci
217
Volby PAD_INDEX a FILLFACTOR
218
Vypnutí uzamykání stránek a řádků indexu
219
Správa velmi velkých indexů
220
Vytvoření indexu ve skupině souborů
220
Jak se implementuje členění indexu do oblastí
221
Kapitola 6
Fulltextové vyhledávání
Fulltextové indexy a katalogy
223 223
Vytvoření fulltextového katalogu
224
Vytvoření fulltextového indexu
225
Modifikace fulltextového katalogu
227
Modifikace fulltextového indexu
229
Odstranění fulltextového katalogu
231
Odstranění fulltextového indexu
232
Výpis metadat fulltextového katalogu a indexu
232
Základy fulltextového vyhledávání Prohledávání fulltextově indexovaných sloupců pomocí FREETEXT
234 234
Hledání slov pomocí CONTAINS Pokročilé vyhledávání
235 236
Hledání CONTAINS se zástupnými symboly
237
Hledání gramatických tvarů slova s CONTAINS
237
Hledání CONTAINS na základě blízkosti slov
238
Hledání s přidělováním pořadí
239
Vrácení výsledků vyhledávání s pořadím podle významu
239
Vrácení vážených výsledků vyhledávání podle přiděleného pořadí
241
Kapitola 7
Pohledy
Normální pohledy
243 244
Vytvoření normálního pohledu
244
Dotazy na definici pohledu
246
Výpis informací o pohledech uložených v databázi
247
Aktualizace definice pohledu
249
Modifikace pohledu
249
Odstranění pohledu
250
Modifikace dat prostřednictvím pohledu
250
Zašifrování pohledu Jak na zašifrování pohledu Indexované pohledy
251 252 252
Vytvoření indexovaného pohledu
253
Jak donutit optimalizátor, aby u indexovaného pohledu použil index
256
Členěné pohledy Vytvoření distribuovaného členěného pohledu
Kapitola 8
Funkce SQL Serveru
Agregační funkce
257 257
263 263
Výpočet aritmetického průměru
264
Výpočet počtu řádků
264
Nalezení nejmenší a největší hodnoty výrazu
265
Výpočet součtů hodnot
266
Statistické agregační funkce
266
Matematické funkce Jak se používají matematické funkce Funkce pro práci s řetězci
267 268 269
Převod znaků na kódy ASCII a zpět
271
Převody mezi celočíselnými a znakovými hodnotami Unicode
271
Nalezení počáteční pozice řetězce v jiném řetězci
272
Nalezení počáteční pozice řetězce v jiném řetězci pomocí zástupných symbolů
272
Určení podobnosti řetězců
273
Získání části řetězce zleva nebo zprava
274
Určení počtu znaků nebo bajtů v řetězci
275
Nahrazení části řetězce jiným řetězcem
275
Vsunutí řetězce do jiného řetězce
276
Převod písmen řetězce na malá, velká, nebo první ve slovech velká
277
Odstranění vedoucích a koncových mezer
279
Opakování výrazu
280
Opakování mezer
280
Výstup výrazu s opačným pořadím znaků
281
Vrácení části znakového výrazu
281
Jak se pracuje s hodnotami NULL
282
Náhrada hodnot NULL alternativní hodnotou
282
Flexibilní hledání pomocí ISNULL
282
Vrácení první hodnoty, která není NULL
284
Vrácení NULL při shodě dvou výrazů (jinak vrátit první výraz)
284
Funkce pro práci s datem a časem
285
Získání aktuálního data a času
286
Přičítání k datu, odečítání od data
286
Rozdíl mezi dvěma daty
288
Zobrazení řetězce vyjadřujícího část data
288
Zobrazení celočíselné hodnoty vyjadřující část data pomocí DATEPART
289
Zobrazení celočíselných částí data pomocí YEAR, MONTH a DAY
290
Převody datových typů pomocí Convert a Cast
290
Převody datových typů
291
Převody hodnot vyjadřujících datum
291
Je výraz datum nebo číslo?
293
Funkce přidělující pořadí
293
Očíslování řádků
294
Vrácení řádků podle přidělených pořadí
295
Vrácení řádků podle souvislé řady přidělených pořadí
297
Funkce NTILE
298
Systémové funkce pro sondování serveru, nastavení serveru a připojení
299
Nastavení pro první den týdne SQL Serveru
299
Jazyk používaný v aktuální relaci
300
Výpis a nastavení prodlevy pro uvolnění zámků v aktuální relaci
300
Zobrazení úrovně vnoření kontextu uložené procedury
301
Název aktuální instance SQL Serveru a verze SQL Serveru
301
ID relace aktuálního připojení
302
Počet otevřených transakcí
302
Kolik řádků ovlivnil předchozí příkaz?
303
Systémové statistické funkce
304
Jak se zobrazí nastavení databáze a SQL Serveru
306
Získání ID a názvu aktuální databáze
306
Získání ID a názvu databázového objektu
307
Jak se zjistí aplikace a hostitel aktuální uživatelské relace
307
Výpis informací o aktuálním uživateli a přihlašovacím kontextu
308
Prohlídka voleb uživatelského připojení
309
Funkce pro práci s IDENTITY a uniqueidentifier
309
Zjištění poslední hodnoty ve sloupci s atributem IDENTITY
309
Zjištění hodnot základu a přírůstku sloupce s atributem IDENTITY
311
Vytvoření nové hodnoty datového typu uniqueidentifier
311
Kapitola 9
Podmíněné zpracování, řízení toku, kurzory
Podmíněné zpracování
313 313
Vyhodnocení jediného vstupního výrazu s CASE
314
Vyhodnocování booleovských výrazů s CASE
315
Příkaz IF...ELSE
317
Řízení toku
319
Návrat s RETURN
319
Příkaz WHILE
321
Příkaz GOTO
323
Příkaz WAITFOR
325
Kurzory
327
Vytváření a používání kurzorů Transact-SQL
Kapitola 10
Uložené procedury
Základní informace o uložených procedurách
329
333 333
Vytvoření jednoduché uložené procedury
335
Vytvoření parametrizované uložené procedury
336
Výstupní parametry uložené procedury
339
Modifikace uložené procedury
340
Odstraňování uložených procedur
341
Automatické vykonávání uložených procedur při startu SQL Serveru
341
Výpis metadat uložené procedury
343
Dokumentace uložených procedur
344
Uložené procedury a bezpečnost
344
Zašifrování uložené procedury
345
Specifikace bezpečnostního kontextu procedury s EXECUTE AS
346
Rekompilace a ukládání do cache
349
Překompilování uložené procedury vždy, když se vykoná
349
Vyprázdnění cache procedur
351
Kapitola 11
Uživatelsky definované funkce a typy
Základy uživatelsky definovaných funkcí Skalární uživatelsky definované funkce
353 353 354
Přímé tabulkové uživatelsky definované funkce
358
Vícepříkazové uživatelsky definované funkce
360
Modifikace uživatelsky definovaných funkcí
364
Prohlížení metadat UDF
366
Odstraňování uživatelsky definovaných funkcí
366
Zisky plynoucí z uživatelsky definovaných funkcí
367
Udržování opětovně využitelného kódu ve skalárních UDF
367
Využití skalárních UDF pro křížové odkazy na hodnoty přirozených klíčů
369
Vícepříkazové UDF místo pohledů
373
Základy uživatelsky definovaných typů
375
Vytváření a používání uživatelsky definovaných typů
375
Identifikace sloupců a parametrů, které používají uživatelsky definované typy
378
Odstraňování uživatelsky definovaných typů
379
Kapitola 12
Triggery
Triggery DML
381 382
Trigger DML typu AFTER
383
Trigger DML typu INSTEAD OF
387
Triggery DML a transakce
390
Řízení triggerů DML na základě modifikovaných sloupců
393
Výpis metadat triggeru DML
394
Triggery DDL
395
Vytvoření triggeru DDL, který sleduje databázové události
396
Vytvoření triggeru DDL, který sleduje události na úrovni serveru
399
Prohlížení metadat triggeru DDL
400
Správa triggerů
401
Modifikace triggeru
401
Zapínání a vypínání triggerů
402
Limit pro hloubku vnořování triggerů
404
Řízení rekurze triggeru
405
Nastavení pořadí odpalování triggeru
406
Odstranění triggeru
408
Kapitola 13
Integrace s CLR
411
Přehled CLR
412
Kdy používat assembly (a kdy ne)
413
Přehled objektů CLR
414
Vytváření databázových objektů CLR
415
Zapnutí podpory CLR v SQL Serveru 2005
415
Napsání assembly pro uloženou proceduru CLR
416
Kompilace assembly do souboru DLL
419
Načtení assembly do SQL Serveru
420
Vytvoření uložené procedury CLR
421
Vytvoření skalární uživatelsky definované funkce CLR
423
Vytvoření triggeru CLR
426
Administrace assembly
428
Výpis metadat assembly
428
Modifikace povolení assembly
428
Odstranění assembly z databáze
429
Kapitola 14
XML
431
XML a příbuzné technologie
432
Práce s nativním XML
434
Vytváření sloupců datového typu XML
434
Vkládání dat XML do sloupce
436
Ověřování platnosti dat XML pomocí schémat
437
Získávání dat XML
439
Modifikace dat XML
442
Indexy XML
443
Konverze mezi dokumenty XML a relačními daty
445
Klauzule FOR XML
445
Příkaz OPENXML
450
Kapitola 15
Webové služby
453
Technologie webových služeb
454
Koncové body HTTP
455
Vytvoření koncového bodu HTTP
458
Správa bezpečnosti koncového bodu HTTP
461
Modifikace koncového bodu HTTP
463
Odstranění koncového bodu HTTP
465
Rezervace jmenných prostorů
465
Vytvoření klienta .NET, který používá webovou službu
Kapitola 16
Zpracování chyb
Systémové a uživatelsky definované chybové zprávy
466
471 471
Výpis informací, které poskytují systémové chybové zprávy
471
Vytvoření uživatelsky definované chybové zprávy
473
Odstranění uživatelsky definované chybové zprávy
475
Příkaz RAISERROR Vyvolání chybové zprávy pomocí RAISERROR Příkaz TRY...CATCH
475 476 478
Staromódní zpracování chyb
480
Zpracování chyb s TRY...CATCH
482
Zpracování chyb s TRY...CATCH, aniž se musí přepsat uložená procedura
483
Vnořené konstrukce TRY...CATCH
484
Kapitola 17
Účastníci
Účastníci Windows
487 487
Jak se vytvoří přihlášení Windows
489
Výpis přihlášení Windows
490
Změny v přihlášení Windows
490
Jak se odstraní přihlášení Windows
492
Jak se uživateli Windows nebo skupině Windows odepře přístup k SQL Serveru
493
Účastníci SQL Serveru
493
Jak se vytvoří přihlášení SQL Serveru
495
Výpis přihlášení SQL Serveru
496
Změny v přihlášení SQL Serveru
496
Jak se odstraní přihlášení SQL
499
Správa členů serverových rolí
499
Výpis informací o fixních serverových rolích
500
Databázoví účastníci
502
Vytváření databázových uživatelů
503
Výpis informací o databázových uživatelích
504
Modifikace databázového uživatele
505
Odstranění databázového uživatele z databáze
506
Oprava osiřelých databázových uživatelů
506
Výpis informací o fixních databázových rolích
508
Správa členství ve fixních databázových rolích
510
Správa uživatelsky definovaných databázových rolí
511
Správa aplikačních rolí
513
Kapitola 18
Subjekty a povolení
Přehled povolení Výpis povolení SQL Serveru 2005, která lze přiřazovat
517 518 519
Subjekty a povolení s oborem server
522
Správa serverových povolení
524
Subjekty a povolení s oborem databáze
525
Správa databázových povolení
527
Subjekty a povolení s oborem schéma
528
Správa schémat
531
Správa povolení schématu
532
Povolení objektů Správa povolení na úrovni objektů Správa povolení přes obory subjektů
534 538 539
Zjištění povolení aktuálního připojení k nějakému subjektu
539
Výpis povolení účastníka podle oboru subjektů
541
Změna vlastnictví subjektu
544
Jak povolit přihlášením SQL přístup ke zdrojům mimo SQL Server?
546
Kapitola 19
Šifrování
549
Šifrování podle šifrovací fráze
549
Šifrování podle šifrovací fráze pomocí funkce Hlavní klíče
550 552
Záloha a obnova hlavního klíče služby
553
Vytvoření, regenerace a odstranění hlavního databázového klíče
554
Záloha a obnova hlavního databázového klíče
555
Odstranění šifrování hlavním klíčem služby z hlavního databázového klíče
557
Šifrování asymetrickým klíčem
558
Vytvoření asymetrického klíče
558
Výpis informací o asymetrických klíčích v aktuální databázi
559
Změna hesla pro privátní klíč asymetrického klíče
560
Šifrování a dešifrování dat pomocí asymetrického klíče
560
Odstranění asymetrického klíče
563
Šifrování symetrickým klíčem
563
Vytvoření symetrického klíče
564
Výpis symetrických klíčů, které jsou v aktuální databázi
565
Změna způsobu šifrování symetrického klíče
565
Šifrování a dešifrování symetrickým klíčem
567
Odstranění symetrického klíče
571
Šifrování certifikátem
571
Vytvoření databázového certifikátu
571
Prohlížení certifikátů uložených v databázi
572
Zálohování a obnova certifikátu
573
Správa privátního klíče certifikátu
574
Šifrování a dešifrování pomocí certifikátu
576
Kapitola 20
Service Broker
579
Ukázkový scénář: online knihkupectví
580
Vytvoření základní aplikace Service Broker
580
Zapnutí aktivit Service Broker v databázích
581
Vytvoření hlavního databázového klíče pro šifrování
582
Typy zpráv
582
Vytváření kontraktů
584
Vytváření front
586
Vytváření služeb
588
Zahájení dialogové konverzace
590
Dotaz na příchozí zprávy ve frontě
592
Získání zprávy a odpověď na ni
593
Ukončení konverzace
595
Vytvoření uložené procedury pro zpracování zpráv Vytvoření uložené procedury Implementace Service Broker na vzdálených serverech
597 598 601
Bezpečnost transportu
603
Bezpečnost dialogové konverzace
606
Vytvoření tras a vazeb vzdálené služby
608
Notifikace událostí Zachycování přihlašovacích příkazů
Kapitola 21
Konfigurace a prohlížení voleb SQL Serveru
Prohlížení konfigurace SQL Serveru Změny konfiguračních nastavení SQL Serveru
Kapitola 22
Vytváření a konfigurace databází
Vytváření, modifikace a odstraňování databází
612 612
617 617 620
623 623
Vytvoření databáze s výchozí konfigurací
624
Prohlížení informací o databázi
624
Vytvoření databáze pomocí voleb souborů
626
Vytvoření databáze s uživatelsky definovanou skupinou souborů
629
Nastavení uživatelského přístupu k databázi
632
Přejmenování databáze
634
Odstranění databáze
636
Odpojení databáze
636
Připojení databáze
638
Konfigurace databázových voleb
639
Výpis databázových voleb
640
Konfigurace voleb ANSI SQL
641
Konfigurace automatických voleb
643
Vytvoření nebo modifikace databáze tak, aby umožňovala externí přístup
645
Specifikace jiné kolace pro databázi, než je výchozí kolace serveru
647
Konfigurace voleb kurzoru
648
Volba DATE_CORRELATION_OPTIMIZATION
650
Modifikace chování parametrizace v databázi
651
Jak se zapne konzistentní čtení pro transakci
654
Konfigurace modelů zotavení databáze
656
Jak se nakonfiguruje kontrola datových stránek
657
Řízení přístupu k databázi a vlastnictví
659
Změna stavu databáze na online, offline nebo emergency
659
Změna vlastníka databáze
660
Správa databázových souborů a skupin souborů
662
Přidání datového souboru nebo souboru protokolu do existující databáze
662
Odstranění datového souboru nebo souboru transakčního protokolu z databáze
664
Změna umístění datového souboru nebo souboru transakčního protokolu
665
Změna logického názvu souboru
666
Zvýšení velikosti databázového souboru a modifikace jeho voleb růstu
667
Přidání skupiny souborů do existující databáze
668
Nastavení výchozí skupiny souborů
669
Odstranění skupiny souborů
670
Nastavení databáze nebo skupiny souborů pouze ke čtení
671
Prohlížení a správa prostoru, který zabírá databáze na disku
672
Jak databáze využívá prostor na disku
672
Jak se srazí velikost databáze nebo databázového souboru
674
Kapitola 23
Integrita a optimalizace databáze
Kontroly databáze
679 679
Kontrola konzistence struktur pro alokaci místa na disku s DBCC CHECKALLOC
680
Kontrola alokace a strukturální integrity objektů databáze s DBCC CHECKDB
682
Tabulky a omezení
685
Kontrola alokace a strukturální integrity všech tabulek ve skupině souborů s DBCC ...
685
Kontrola integrity dat tabulek a indexovaných pohledů s DBCC CHECKTABLE
687
Kontrola integrity tabulky příkazem DBCC CHECKCONSTRAINTS
690
Kontrola konzistence systémových tabulek s DBCC CHECKCATALOG
692
Údržba indexů
692
Přebudování indexů
693
Defragmentace indexů
696
Kapitola 24
Údržba databázových objektů a závislosti objektů
Údržba databázového objektu
699 699
Změna názvu uživatelsky vytvořeného databázového objektu
699
Změna schématu objektu
701
Závislosti objektu
702
Výpis informací o závislostech databázového objektu
702
Prohlížení definice objektu
703
Kapitola 25
Zrcadlení databáze
705
Zrcadlení databáze v kontextu
706
Architektura zrcadlení databáze
707
Příprava pro zrcadlení databáze
708
Vytvoření koncových bodů zrcadlení
709
Vytvoření zálohy hlavní databáze a její obnova
713
Vytvoření databázové relace se zrcadlením
716
Shrnutí příprav pro zrcadlení databáze
719
Tři módy zrcadlení databáze
720
Změna operačního módu
721
Přepínání rolí hlavní a zrcadlové databáze
722
Jak se pozastaví a opět rozběhne relace se zrcadlením
723
Jak se zastaví relace se zrcadlením a odstraní koncové body
723
Monitorování a konfigurace voleb
724
Monitorování stavu zrcadla
724
Zkrácení doby potřebné na přepnutí databází
725
Nastavení prodlevy připojení
726
Kapitola 26
Momentky databáze
Základní informace o momentkách
727 727
Jak se vytvoří momentka databáze a jak se na ni kladou dotazy
728
Odstranění momentky databáze
730
Zotavení dat pomocí databázové momentky
730
Kapitola 27
Propojené servery a distribuované dotazy
Základní informace o propojených serverech Vytvoření propojeného serveru k jiné instanci SQL Serveru
735 736 736
Konfigurace vlastností propojeného serveru
738
Výpis informací o propojeném serveru
739
Odstranění propojeného serveru
740
Přihlášení propojeného serveru
740
Jak se mapuje přihlášení na propojený server
741
Výpis propojených přihlášení
742
Odstranění mapování na propojený server
743
Vykonávání distribuovaných dotazů
743
Vykonání distribuovaných dotazů nad propojeným serverem
743
Vytvoření a používání aliasu čtyřdílného názvu propojeného serveru
745
Vykonávání distribuovaných dotazů s OPENQUERY
746
Vykonávání jednorázových dotazů s OPENROWSET
747
Čtení dat ze souboru pomocí OPENROWSET BULK
748
Kapitola 28
Vylaďování výkonu
753
Tipy pro vyšší výkon dotazů
754
Zachycení a vyhodnocení výkonu dotazu
756
Jak se nástrojem SQL Server Profiler zachytí pomalé dotazy
756
Zachycení vykonávajících se dotazů se sys.dm_exec_requests
760
Grafický plán vykonání dotazu
761
Zobrazení odhadnutého plánu vykonání dotazu s příkazy Transact-SQL
765
Vynucené použití konkrétního plánu dotazu v SQL Server 2005
769
Výpis informací o vykonání dotazu
771
Výpis výkonových statistik plánů uložených do cache
774
Statistiky
775
Ruční vytváření statistik
776
Aktualizace statistik
777
Generování a aktualizace statistik pro všechny tabulky
778
Výpis informací o statistikách
780
Odstraňování statistik
781
Vylaďování indexů
781
Výpis fragmentace indexů
783
Výpis využití indexů
786
Nástroj Database Engine Tuning Advisor
788
Různé další techniky Alternativa k dynamickému SQL
794 794
Použití pokynů, aniž by se musela modifikovat aplikace SQL
Kapitola 29
Zálohy a zotavení
796
801
Vytvoření plánu záloh a zotavení
801
Zálohy
803
Základní úplná záloha
806
Pojmenujte a popište své zálohy a zálohovací média
809
Konfigurace doby, po kterou se zálohy uchovávají
810
Zálohování po pruzích
812
Pojmenované zálohovací zařízení
813
Zrcadlení sad záloh
815
Zálohování transakčního protokolu
817
Sady záloh vytvářené s volbou COPY_ONLY
819
Diferenční zálohy
820
Zálohování jednotlivých souborů nebo skupin souborů
820
Částečné zálohování
823
Výpis metadat zálohy
824
Obnova databáze
827
Obnova databáze z úplné zálohy
827
Obnova databáze ze zálohy transakčního protokolu
832
Obnova databáze z diferenční zálohy
836
Obnova souboru nebo skupiny souborů
837
Obnova po částech
838
Obnova stránky
840
Rejstřík
843
23
O autorovi JOSEPH SACK je nezávislý konzultant z Minneapolis ve státě Minnesota. Od roku 1997 vyvíjí a podporuje prostředí SQL Serveru pro klienty z různých oblastí. Patří mezi ně například finanční služby, distribuce multimédií, informační technologie, výroba zboží či nákup a prodej nemovitosti. Joseph získal titul bakaláře v oboru psychologie na Minnesotské univerzitě. Je autorem publikace SQL Server 2000 Fast Answers for DBAs and Developers a je také držitelem certifikátu MCDBA (Microsoft Certified Database Administrator). Chcete-li se ho na něco zeptat, nebo s ním něco konzultovat, je dosažitelný na joe.sack@gmail.com.
O odborném recenzentovi EVAN TERRY už přes 15 let pracuje na různých pozicích v odvětví informačních technologií (pro státní i privátní sektor) jako programátor analytik, systémový inženýr, konzultant softwaru, vývojář, analytik dat a architekt dat. Upřímně věří, že máme-li jako profesionálové z oblasti IT uspět při vývoji složitých systémů, musíme dokonale rozumět věcné problematice procesů, které podporujeme. Evan se také snaží přemostit propast dělící odborníky od laické veřejnosti, protože chápe perspektivy obou skupin a pomáhá jim, aby jejich vzájemná komunikace byla efektivní. Evan je také spoluautorem publikace Beginning Relational Data Modeling vydavatelství Apress.
Poděkování Tato kniha je věnována Davidu Hatchovi, protože díky tomu, že mi neúnavně pomáhal, dodával důvěru, poskytoval cenné rady a podporu, se všechno dotáhlo do úspěšného konce. Děkuji Tony Davisovi za jeho schopnost dívat se na věci s nadhledem, za jeho vhled a jasná stanoviska, a že mi také pomohl najít vhodný vypravěčský styl. Tony mi dodal opravdovost, takže výsledkem je to nejlepší, čeho jsem byl schopen. Díky zasluhuje také Evan Terry, který věnoval neskutečně mnoho péče tomu, aby se kladl důraz nejen na odbornou stránku knihy, ale také na vše, co je v ní obsaženo. Evan má talent na jasné formulace a umí klást správné otázky. Bylo příjemné vědět, že mě Tony i Evan z povzdálí pozorně sledují. Děkuji také Beth Christmasové za její báječný způsob myšlení, za její nadání umět udržet věci v běhu, a za její promptní reakce na mé naléhavé otázky. Beth se starala právě tak úporně jako já, aby se plán prací na knize dodržel, za což jsem jí moc vděčný. Dík patří také velmi talentované Julii Smithové, která mi pomáhala nacházet správná slova, abych byl důsledný, a aby tok vyprávění plynul hladce. Podobně jako Evan, i Julie dělala daleko víc, než měla v náplni práce, vyhodnocovala text na mnoha úrovních. Díky patří také Katie Stenceové, Kari Brooksové a zbytku týmu Apress – z některými z nich se mi nepodařilo seznámit, ale děkuji za jejich příspěvky, které jsem obdržel. Je příjemné vědět, že na mně záleží tolika lidem. A konečně – děkuji Gary Cornellovi, který zakoupil práva k mé poslední knize, má výbornou reputaci díky svým předchozím vydavatelských závazkům, je čestný, poctivý, a podporuje i mé budoucí projekty. Kéž by všechny vydavatelské firmy zaměstnávaly lidi jako je Gary! Bylo by mnohem více spokojených autorů odborných publikací!
24
Úvod Když dojde na lámání chleba a začnete skutečně prakticky řešit své každodenní úlohy SQL Serveru, odborná dokumentace vám obvykle sděluje mnohem víc, než potřebujete vědět. Řekněme, že jste v časové tísni a potřebujete do nějaké tabulky přidat nějaké omezení na jedinečnost dřív, než někdo do tabulky vloží duplicitní hodnotu. Kde najdete, jak na to? Jednou z prvních voleb jsou online knihy o SQL Serveru (SQL Server Books Online). Vzhledem k tomu, jak obrovské množství užitečných informací obsahují, bezpečně víte, že odpověď na vaši otázku tam někde je. Bohužel – než se vám ji podaří najít, pravděpodobně budete nějakou dobu bezradně klikat sem a tam, nebo se rovnou vydáte po falešné stopě. Až se pak konečně dostanete na správnou stránku, možná zjistíte, že potřebná informace je zasazena do rozsáhlého bloku syntaxe a že se popisovaná funkcionalita, a ani uvedené příklady nevztahují k tomu, co hledáte. Tuto knihu jsem psal se záměrem, abychom se jednou provždy vypořádali s potřebou nacházet, získávat a používat informace co nejrychleji. Jednotlivá témata se prezentují ve formě úloh. U každého tématu získáte nezbytné základy, abyste mohli začít pracovat, pak uvidíte jeden nebo více praktických příkladů, a nakonec se stručně a výstižně vysvětlí, jak to celé funguje. Ať už si potřebujete oprášit nějaké téma, které jste nechali nějakou dobu ležet ladem, nebo prostě teprve začínáte s Transact-SQL, budete moci snadno a rychle vytipovat a zvolit oblasti, v nichž potřebujete něco udělat nebo vylepšit. Tato kniha zahrnuje základní i pokročilejší témata a předvádí složitější techniky, které nabízí hit SQL Serveru 2005, Transact-SQL. Chcete se dozvědět více o tom, co je nového v SQL Serveru 2005? Nové schopnosti Transact-SQL i funkcionalita zaváděná nově v SQL Serveru 2005 se v této knize předvádějí také, takže si budete moci nové schopnosti otestovat rychle a s minimálním úsilím. Protože je kniha napsaná tak, aby byla přívětivá k přímému přístupu k informacím v ní obsažených, nemusíte ji číst od začátku, jednu kapitolu za druhou. Ať už jste začátečníci, mírně pokročilí, nebo příležitostní uživatelé SQL Serveru, věřím, že tato kniha vám poskytne bleskově všechna fakta, která potřebujete, abyste mohli snadno vyřešit své každodenní úkoly.
Zdrojové soubory Zdrojové soubory k této knize je možné stáhnout z následující adresy: http://www.zonerpress.cz/download/transact-sql.zip
Velikost souboru je 58 kB.
Kapitola 3
Transakce, uzamykání, blokování a mrtvé zámky V předchozích dvou kapitolách jsem probral jazyk modifikace dat (Data Modification Language) a poskytl návody k příkazům SELECT, INSERT, UPDATE a DELETE. Než přejdeme k jazyku definice dat (Data Definition Language, který slouží pro vytváření, úpravy a odstraňování tabulek, indexů, pohledů a dalších věci), proberu v této kapitole návody, v nichž uvidíte, jak se zpracovávají transakce, monitorují zámky, a jak se dá vypořádat s blokováním a s mrtvými zámky. Předvedu vám novou úroveň izolace v SQL Serveru 2005 (tzv. "momentka" neboli snapshot) a také dynamické správní pohledy (dynamic management views), jimiž se monitorují mrtvé zámky a pomáhají řešit problémy s blokováním.
Řízení transakcí Transakce jsou integrální součástí relačního databázového systému a pomáhají definovat jednolitou jednotku práce. Ta se může skládat z jednoho nebo několika příkazů Transact-SQL, které se buď potvrdí, nebo anulují (jako jediný celek). Tato funkcionalita "všechno nebo nic" pomáhá zabránit částečným aktualizacím a nestabilním stavům. K částečným aktualizacím dochází, když se některá z vzájemně závislých částí nějakého procesu anuluje nebo stornuje, aniž by se anulovaly (resp. vrátily zpět) i všechny ostatní části procesu, jež jsou na sobě závislé. Transakce se popisuje čtyřmi charakteristickými rysy, na které se odkazuje zkratkou ACID, z anglických termínů Atomicity, Consistency, Isolation (nebo Independence) a Durability:
• Atomicity (nerozložitelnost) znamená, že je transakce nedělitelnou entitou – vykonají se buď všechny její kroky, nebo žádný z nich.
• Consistency (důslednost) zajišťuje, že jsou data platná před transakcí i po ní. V platném stavu se stále musí udržovat integrita dat (například odkazy na cizí klíče) i interní datové struktury.
• Isolation (izolovanost) je požadavek na to, aby transakce nebyly závislé na jiných transakcích, které se mohou případně vykonávat souběžně (buď ve stejné době nebo se překrývat). Daná transakce nemůže vidět průběžná (nestabilní) data jiné transakce – vidí je buď v takovém stavu, v jakém byla, než transakce začala, nebo poté, co transakce skončila.
• Durability (stálost) znamená, že účinky transakce jsou trvalé, jakmile se transakce potvrdí, veškeré změny přečkají i výpadky systému. V této kapitole předvedu a proberu mechanismy a funkcionalitu SQL Serveru 2005, jimiž se zajišťuje soulad s principy ACID, konkrétně uzamykání a transakce.
122
Kapitola 3 – Transakce, uzamykání, blokování a mrtvé zámky
V SQL Serveru 2005 existují tři možné typy transakcí: potvrzované automaticky, implicitní a explicitní. Transakce s automatickým potvrzováním (autocommit) je výchozí chování SQL Serveru 2005, kdy se každý separátní příkaz Transact-SQL potvrzuje automaticky ihned poté, co skončí. Pokud například vykonáte za sebou dva příkazy INSERT, z nichž ten první se nezdaří a druhý uspěje, změny provedené druhým příkazem se uchovají, protože každý příkaz INSERT je automaticky obsažen ve své vlastní transakci. Přestože tento mód uvolňuje vývojáři ruce, protože se nemusí starat o explicitní transakce, může být závislost na tomto druhu transakčních činností chybou. Máte-li například dvě transakce, z nichž jedna připisuje na účet nějakou částku, a druhá z téhož účtu nějakou částku odepisuje, a ta první se nezdaří, z ničeho nic jste dlužníkem. To by jistě potěšilo banku, ale už asi ne zákazníka, jemuž z účtu náhle zmizí finanční prostředky! Automatické potvrzování je dokonce poněkud nebezpečné i pro jednoúčelové administrativní změny — pokud například omylem odstraníte všechny řádky z nějaké tabulky, bude už pozdě, až na to konečně přijdete, protože nemáte možnost transakci vrátit zpět (anulovat její účinky). K implicitním transakcím dochází tehdy, když je nějaká relace SQL Serveru v implicitním transakčním módu, a když se poprvé vykoná kterýkoliv z těchto příkazů: ALTERTABLE
FETCH
REVOKE
CREATE
GRANT
SELECT
DELETE
INSERT
TRUNCATETABLE
DROP
OPEN
UPDATE
Jakmile se vykoná jeden z výše uvedených příkazů, automaticky se vytvoří (otevře) nová transakce a zůstane otevřená tak dlouho, dokud se nevydá buď příkaz ROLLBACK, nebo příkaz COMMIT. Příkaz vyvolávající transakci se považuje za její součást. Implicitní mód se aktivuje v dotazovací relaci příkazem: SET IMPLICIT_TRANSACTIONS ON
Chcete-li tento mód vypnout (a vrátit se do explicitního módu), vydejte příkaz: SET IMPLICIT_TRANSACTIONS OFF
Implicitní mód může být velmi těžko zvládnutelný v rutinním provozu, protože designéři aplikací (i koneční uživatelé) mohou zapomínat transakce potvrzovat, takže je ponechávají otevřené velmi dlouho, čímž blokují jiná připojení (o blokování se více dozvíte v této kapitole později). Explicitní transakce jsou ty, které definujete sami. Je to zdaleka nejdoporučovanější mód práce v situacích, kdy databázová aplikace modifikuje data. Je to proto, že máte explicitní kontrolu nad tím, které jednotlivé modifikační operace patří do jediné transakce, i nad tím, co se má dít, dojde-li k nějaké chybě. Modifikace seskupíte dohromady do jediné entity pomocí svých vlastních instrukcí. Při práci s explicitními transakcemi se používají příkazy a klíčová slova Transact-SQL, která jsou podrobně popsaná v tabulce 3.1: Tabulka 3.1. Příkazy pro explicitní transakce Příkaz
Popis
BEGIN TRANSACTION
Nastavuje počátek explicitní transakce.
Velká kniha T-SQL & SQL Server 2005
123
Tabulka 3.1. Příkazy pro explicitní transakce Příkaz
Popis
ROLLBACK TRANSACTION
Obnoví původní data, která transakce modifikovala. Převede data zpět do takového stavu, v jakém byla na začátku transakce. Prostředky, které měla transakce v držení, se uvolní.
COMMIT TRANSACTION
Ukončí transakci, pokud při ní nedošlo k žádným chybám, a potvrdí natrvalo provedené změny. Prostředky, které měla transakce v držení, se uvolní.
BEGIN DISTRIBUTED TRANSACTION
Umožňuje definovat počátek distribuované transakce, kterou bude spravovat koordinátor distribuovaných transakcí společnosti Microsoft (MS DTC, Microsoft Distributed Transaction Coordinator). MS DTC musí běžet lokálně a vzdáleně.
SAVE TRANSACTION
SAVE TRANSACTION určuje ukládací bod uvnitř transakce. Umožňuje definovat místo, kam se může transakce vrátit, jestliže se její část anulovala. Transakce se musí anulovat nebo potvrdit okamžitě poté, co se vrátila zpět do ukládacího místa.
@@TRANCOUNT
Vrací počet aktivních transakcí daného připojení. BEGIN TRANSACTION zvyšuje @@TRANCOUNT o 1, ROLLBACK TRANSACTION a COMMIT TRANSACTION snižují @@TRANCOUNT o 1. ROLLBACK TRANSACTION do ukládacího místa ji neovlivňuje.
Explicitní transakce V tomto návodu si předvedeme, jak se pomocí explicitních transakcí potvrzují nebo anulují modifikace dat v závislosti na tom, zdali se z dávky příkazu vrátí nějaká chyba: -- Zjistíme počet oddělení SELECT COUNT(*) BeforeCount FROM HumanResources.Department -- Sem si uložíme celočíselný kód poslední chyby DECLARE @Error int BEGIN TRANSACTION INSERT HumanResources.Department (Name, GroupName) VALUES ('Accounts Payable', 'Accounting') SET @Error = @@ERROR IF (@Error<> 0) GOTO Error_Handler INSERT HumanResources.Department (Name, GroupName) VALUES ('Engineering', 'Research and Development') SET @Error = @@ERROR IF (@Error <> 0) GOTO Error_Handler COMMIT TRAN Error_Handler:
124
Kapitola 3 – Transakce, uzamykání, blokování a mrtvé zámky
IF @Error <> 0 BEGIN ROLLBACK TRANSACTION END -- Zjistíme, jaký je počet oddělení po transakci SELECT COUNT(*) AfterCount FROM HumanResources.Department
Vrátí se následující: BeforeCount ----------16 (1 row(s) affected) (1 row(s) affected) Msg 2601, Level 14, State 1, Line 15 Cannot insert duplicate key row in object 'HumanResources.Department' with unique index 'AK_Department_Name'. The statement has been terminated. AfterCount ----------16 (1 row(s) affected)
Jak to funguje Prvním příkazem zjistíme, kolik řádků tabulka HumanResources.Department obsahuje. Dozvěděli jsme se, že jich je 16: -- Zjistíme počet oddělení SELECT COUNT(*) BeforeCount FROM HumanResources.Department
Pak vytvoříme lokální proměnnou, do které uložíme hodnotu funkce @@ERROR (ta zachytí nejnovější chybový stav nějakého příkazu SQL): -- Sem si uložíme celočíselný kód poslední chyby DECLARE @Error int
Pak zahájíme explicitní transakci: BEGIN TRANSACTION
Další příkaz (INSERT) se pokusí vložit řádek do tabulky HumanResources.Department. Tabulka obsahuje omezení na jedinečný název oddělení. Protože však dodaný název v tabulce ještě není, nový řádek se vloží a operace skončí úspěšně: INSERT HumanResources.Department (Name, GroupName) VALUES ('Accounts Payable', 'Accounting')
Velká kniha T-SQL & SQL Server 2005
125
Pak tu máme zpracovatele chyb příkazu INSERT: SET @Error = @@ERROR IF (@Error <> 0) GOTO Error_Handler
Tento řádek kódu vyhodnotí funkci @@ERROR. Systémová funkce @@ERROR vrátí celočíselnou hodnotu poslední chyby naposledy vykonaného příkazu uvnitř oboru aktuálního připojení. Příkaz IF říká, že pokud došlo k nějaké chybě, má kód skočit (pomocí GOTO) do sekce Error_Handler kódu.
Poznámka Informace o příkazu GOTO naleznete v kapitole 9. Informace o @@Error jsou v kapitole 16. V kapitole 16 se také seznámíte s novou konstrukcí pro zpracování chyb – TRY...CATCH. GOTO je klíčové slovo, které pomáhá řídit tok vykonávání příkazů. Identifikátor, který uvedete za GOTO, zde Error_Handler, je uživatelsky definovaná sekce kódu. Pak se v kódu pokoušíme vložit další nový
řádek, ale tentokrát se jedná o oddělení, jehož název už v tabulce existuje. Protože tabulka má omezení jedinečnosti na sloupec s názvy (Name), vložit řádek se nám nepodaří: INSERT HumanResources.Department (Name, GroupName) VALUES ('Engineering', 'Research and Development')
Nezdar způsobí, že funkce @@ERROR uvedená za příkazem INSERT se nastaví na nějakou nenulovou hodnotu. Příkaz IF se proto vyhodnotí na TRUE, takže se použije příkaz GOTO, nevykoná se COMMIT TRAN a skočí se rovnou do sekce Error_Handler: SET @Error = @@ERROR IF (@Error <> 0) GOTO Error_Handler COMMIT TRAN
Za návěštím Error_Handler se vykoná ROLLBACK TRANSACTION: Error_Handler: IF @Error <> 0 BEGIN ROLLBACK TRANSACTION END
Poté, co se transakce anuluje, musíme ověřit, kolik řádků je nyní v tabulce oddělení. Zjistíme, že jich je stále jen 16. Je to proto, že oba příkazy INSERT byly součástí jediné transakce a jeden z nich se nezdařil. Protože se transakce chovají ve stylu "všechno nebo nic", nevloží se žádný řádek: -- Zjistíme, jaký je počet oddělení po transakci SELECT COUNT(*) AfterCount FROM HumanResources.Department
Kapitola 12
Triggery V této kapitole budeme prezentovat návody na vytváření a používání triggerů jazyka pro definici dat (Data Definition Language, DDL) i triggerů jazyka pro manipulaci s daty (Data Manipulation Language, DML). Triggery DML obsahují kód Transact-SQL, který reaguje na operace INSERT, UPDATE nebo DELETE vykonávaných nad tabulkou nebo pohledem. Triggery DDL reagují na události serveru nebo databáze, nikoliv na modifikace dat. Například se dá vytvořit trigger DDL, který zapíše informace do nějaké tabulky sloužící pro potřeby pozdějších auditů vždy, když uživatel databáze vydá příkaz CREATE TABLE nebo příkaz DROP TABLE. Když se triggery využívají řádně, poskytují pohodlné automatické reakce na specifické akce. Jsou příhodné v situacích, kdy musíte na věcné úrovni vytvářet reakce na jisté činnosti. Triggery by se neměly používat místo omezení (například místo omezení primárního klíče nebo omezení na jedinečnost hodnot), protože omezení poskytují lepší výkon a lépe se hodí pro operace tohoto druhu. Také byste měli být dobře informováni o tom, jakým kódem Transact-SQL je trigger nadefinovaný, a pečlivě zajistit, aby byl řádně optimalizovaný. Jestliže vykonání triggeru trvá několik sekund pro každý příkaz UPDATE, může to dosti negativně ovlivnit celkový výkon. Podle mých osobních zkušeností se zdá, že kdykoliv dojde na řešení potíží s výkonem, úplně se zapomíná na existenci triggerů. Často slyším stížnosti na to, s jak mizerným výkonem se provádějí modifikace dat a kolik času se strávilo jejich optimalizacemi, aby se nakonec zjistilo, že příčinou všech potíží s výkonem byl pouze nějaký špatně vyladěný trigger. Je to jeden z hlavních důvodů, proč já používám triggery DML pouze zřídka – a když už je použiji, dávám si zatraceně pozor, aby byly rychlé a bez závad. Nicméně požadavky vaší aplikace mohou diktovat, že musíte použít nějaký trigger DML. Nemluvě o tom, že triggery DLL v SQL Serveru 2005 otevírají celý nový rozsah funkcionality, který nebyl k dispozici v předchozích verzích. Triggery totiž poskytují schopnosti, které nejde snadno nahradit jinými databázovými objektovými typy. V této kapitole probereme následující témata:
• Jak se vytvoří trigger AFTER DML. • Jak se vytvoří trigger INSTEAD OF
DML.
• Jak se vytvoří trigger DDL. • Jak se modifikuje nebo odstraní existující trigger. • Jak se zapínají a vypínají triggery.
382
Kapitola 12 – Triggery
• Jak se omezí vnořování triggerů, jak se nastaví jejich pořadí, v němž se mají odpalovat, a jak se řídí rekurze.
• Jak se prohlížejí metadata triggeru. Nejprve ovšem začneme úplně od začátku, základními informacemi o triggerech DML.
Poznámka V této kapitole se dozvíte, jak se triggery vytvářejí pomocí Transact-SQL. V kapitole 13 se ale také probírá, jak se dají triggery vytvářet pomocí nové funkcionality společného runtime jazyků (Common Language Runtime, CLR).
Triggery DML Triggery DML reagují na uživatelské operace INSERT, UPDATE nebo DELETE prováděné nad tabulkou nebo pohledem. Když dojde k nějaké události modifikace dat, trigger vykoná akce, které jsou v něm nadefinované. Triggery se v tomto ohledu podobají uloženým procedurám, protože jsou vytvářeny pomocí jazyku Transact-SQL a umožňují provádět úplný rozsah činností. Trigger DML se dá konkrétně definovat pro aktualizaci, vkládání nebo odstraňování (FOR UPDATE, FOR INSERT, FOR DELETE) nebo pro libovolnou jejich kombinaci. Aktualizační (UPDATE) triggery reagují na modifikace v jednom nebo několika sloupcích tabulky, triggery pro vkládání (INSERT) reagují na nová data, která byla přidaná do databáze, a konečně – odstraňovací (DELETE) triggery reagují na data odstraňovaná z databáze. Existují dva typy triggerů DML, které se vykonají buď "po něčem" (AFTER) nebo "místo něčeho" (INSTEAD OF). Triggery AFTER jsou povoleny pouze pro tabulky a vykonávají se až po dokončené modifikaci dat v tabulce. Triggery INSTEAD OF se vykonávají místo původně plánované modifikace dat a dají se vytvářet pro tabulky i pro pohledy. Triggery DML umožňují reagovat na modifikace dat prováděné v tabulce. Například můžete vytvořit trigger, který plní nějakou tabulku pro audity na základě toho, jaká operace se provedla. Pomocí triggeru také můžete snižovat objem zboží na skladě. Přestože je to velmi mocná schopnost, je tu několik věcí, které bystě měli mít na zřeteli, než začnete v hojné míře triggery používat:
• Triggery se často stávají skrytými, takže se na ně postupně zapomene. Když se pak řeší potíže s výkonem nebo s logikou, administrátoři databáze často zapomenou na to, že na pozadí se vykonávají nějaké triggery. Zajistěte, aby triggery byly ve vaší dokumentaci vždy "dobře vidět".
• Můžete-li zajistit, aby všechny modifikace dat protékaly nějakou uloženou procedurou, důrazně se doporučuje, abyste všechny své činnosti prováděli v takové uložené proceduře, nikoliv pomocí triggeru. Například – potřebujete-li aktualizovat množství něčeho v nějaké tabulce spojené relací poté, co vložíte záznam o prodeji, proč tuto logiku raději nestrčit do uložené procedury? Výhodou je lepší údržba (máte jediné místo, kam je potřeba se dívat) a lepší řešení potíží (máte jediné místo, kde se bude muset něco řešit), až bude zapotřebí danou proceduru modifikovat nebo řešit její neočekávané chování.
Velká kniha T-SQL & SQL Server 2005
383
• Vždycky mějte v prvé řadě na mysli výkon, což znamená psát takové triggery, které se vykonají rychle. Dlouho běžící triggery mohou významně zpomalit modifikační operace dat. Zejména dávejte pozor, umisťujete-li triggery do nějaké databáze, kde se data modifikují velmi často.
• Neprotokolované aktualizace neodpalují triggery DML (například WRITETEXT, TRUNCATE TABLE a dávkové vkládací operace).
• Omezení obvykle běží rychleji než trigger DML, takže lze-li požadavky věcné logiky splnit pomocí omezení, použijte omezení. Triggery AFTER se vykonají až po dokončení modifikací dat, takže nemohou sloužit jako prevence proti porušení stanovených omezení.
• Nedovolte, aby se z triggeru vracely sady výsledků na základě příkazu SELECT. Většina aplikací to nebude umět elegantně zpracovat, nehledě na fakt, že vložené dotazy mohou snižovat výkon triggeru. Budete-li mít při tvorbě triggerů stále na mysli tato všeobecná vodítka a budete-li triggery používat řádně, stanou se z nich vynikající prostředky, jak si v databázi vynutit požadovaná pravidla věcné logiky.
Trigger DML typu AFTER Trigger DML typu AFTER se vykoná až poté, co se nad tabulkou úspěšně dokončí modifikační operace INSERT, UPDATE nebo DELETE. Specifická syntaxe triggeru DML s AFTER vypadá takto: CREATE TRIGGER [ název_schématu . ]název_triggeru ON název:tabulky [ WITH <volba_triggeru_dml> [ ...,n ] ] AFTER { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { příkaz_sql [ ...n ]}
Argumenty příkazu jsou popsané v tabulce 12.1. Tabulka 12.1. Argumenty pro CREATE TRIGGER Argument
Popis
[ název_schématu . ]název_triggeru
Nepovinný název schématu a povinný uživatelsky definovaný název nového triggeru.
název_tabulky
Název tabulky, na kterou se trigger bude aplikovat.
<volba_triggeru_dml> [ ...,n ]
Umožňuje specifikovat klauzuli ENCRYPTION a (nebo) klauzuli EXECUTE AS. ENCRYPTION zašifruje definici Transact-SQL triggeru, takže nebude možné jej prohlížet pomocí systémových tabulek. EXECUTE AS umožňuje definovat bezpečnostní kontext, pod kterým se bude trigger vykonávat.
[ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ]
Definuje, na kterou událost, či jaké události DML bude trigger reagovat. Jsou to INSERT, UPDATE a DELETE. Jediný trigger může reagovat na jednu nebo více těchto akcí nad tabulkou.
384
Kapitola 12 – Triggery
Tabulka 12.1. Argumenty pro CREATE TRIGGER Argument
Popis
NOT FOR REPLICATION
Specifikuje, že trigger se nesmí vykonávat, když se nad tabulkou vykonává replikační modifikace.
příkaz_sql [ ...n ]
V triggeru je povolen jeden nebo více příkazů Transact-SQL, které mohou vykonávat všelijaké akce, jako například ověřit platnost změn DML nebo provádět akce DML nad jinými tabulkami.
Než budeme pokračovat konkrétním návodem, je důležité upozornit na to, že SQL Server vytváří dvě "virtuální" tabulky, které jsou speciálně dostupné triggerům. Je to tabulka odstraněných řádků (deleted) a tabulka vložených řádků (inserted). Tyto dvě tabulky zachycují stav řádků před modifikacemi a po nich. Jak tyto jednotlivé tabulky ovlivňují operace DML ukazuje tabulka 12.2. Tabulka 12.2. Vkládané a odstraňované virtuální tabulky Operace DML
Co obsahuje tabulka vložených řádků
Co obsahuje tabulka odstraněných řádků
INSERT
Vložené řádky
-
UPDATE
Nové řádky (aktualizované řádky)
Staré řádky (stav před aktualizací)
DELETE
-
Odstraněné řádky
Pomocí tabulek vložených a odstraněných řádků se dá v triggeru přistupovat k datům ve stavu, v jakém byla před modifikacemi, nebo po modifikacích, které způsobily, že se trigger odpálil. Do těchto tabulek se ukládají data aktualizací zasahujících jediný řádek i více řádků. Nezapomínejte vždy programovat triggery pro oba druhy aktualizací (jediný řádek, více řádků). Například operace DELETE může mít dopad buď na jeden jediný řádek, nebo na padesát řádků, takže dávejte pozor na to, aby trigger byl naprogramován vždy tak, aby správně zvládl oba případy. V tomto návodu předvedu, jak se pomocí triggeru sleduje vkládání řádků a odstraňování řádků z tabulky Production.ProductInventory: -- Sleduje všechny operace Insert a Delete CREATE TABLE Production.ProductInventoryAudit (ProductID int NOT NULL , LocationID smallint NOT NULL , Shelf nvarchar(10) NOT NULL , Bin tinyint NOT NULL , Quantity smallint NOT NULL , rowguid uniqueidentifier NOT NULL , ModifiedDate datetime NOT NULL , InsOrUPD char(1) NOT NULL ) GO -- Vytvoří trigger, který naplní tabulku Production.ProductInventoryAudit CREATE TRIGGER Production.trg_uid_ProductInventoryAudit ON Production.ProductInventory
Velká kniha T-SQL & SQL Server 2005
385
AFTER INSERT, DELETE AS SET NOCOUNT ON -- Vložené řádky INSERT Production.ProductInventoryAudit (ProductID, LocationID, Shelf, Bin, Quantity, rowguid, ModifiedDate, InsOrUPD) SELECT DISTINCT i.ProductID, i.LocationID, i.Shelf, i.Bin, i.Quantity, i.rowguid, GETDATE(), 'I' FROM inserted i -- Odstraněné řádky INSERT Production.ProductInventoryAudit (ProductID, LocationID, Shelf, Bin, Quantity, rowguid, ModifiedDate, InsOrUPD) SELECT d.ProductID, d.LocationID, d.Shelf, d.Bin, d.Quantity, d.rowguid, GETDATE(), 'D' FROM deleted d GO -- Vloží nový řádek INSERT Production.ProductInventory (ProductID, LocationID, Shelf, Bin, Quantity) VALUES (316, 6, 'A', 4, 22) -- Odstraní řádek DELETE Production.ProductInventory WHERE ProductID = 316 AND LocationID = 6 -- Zkontroluje tabulku sloužící pro potřeby auditů SELECT ProductID, LocationID, InsOrUpd FROM Production.ProductInventoryAudit
Vrátí se následující: (1 row(s) affected) (1 row(s) affected) ProductID
LocationID InsOrUpd
----------- ---------- -------316
6
I
316
6
D
(2 row(s) affected)
Jak to funguje Návod jsme zahájili tím, že jsme vytvořili novou tabulku, která se bude využívat při následných auditech. Budou se v ní sledovat veškeré operace vkládání řádků do tabulky Production.ProductInven-
386
Kapitola 12 – Triggery
tory nebo odstraňování řádků z této tabulky. Schéma nové tabulky se shoduje se schématem původní tabulky, nicméně přidali jsme nový sloupec s názvem InsOrUPD, který indikuje, zdali se v řádku jednalo
o operaci vkládání nebo o aktualizační operaci: CREATE TABLE Production.ProductInventoryAudit (ProductID int NOT NULL , LocationID smallint NOT NULL , Shelf nvarchar(10) NOT NULL , Bin tinyint NOT NULL , Quantity smallint NOT NULL , rowguid uniqueidentifier NOT NULL , ModifiedDate datetime NOT NULL , InsOrUPD char(1) NOT NULL ) GO
Pak jsme příkazem CREATE TRIGGER vytvořili trigger DML typu AFTER. V prvním řádku příkazu jsme vyznačili vlastnické schéma a název nového triggeru: CREATE TRIGGER Production.trg_uid_ProductInventoryAudit
Pak jsme v klauzuli ON uvedli název tabulky (její aktualizace způsobí, že se trigger odpálí): ON Production.ProductInventory
Budeme monitorovat dvě činnosti DML – vkládání a odstraňování: AFTER INSERT, DELETE
Tělo triggeru začíná za klíčovým slovem AS: AS
SET NOCOUNT jsme nastavili na ON, abychom potlačili informativní zprávy "rows affected", které se nyní
nebudou vracet volající aplikaci vždy, když se trigger odpálí: SET NOCOUNT ON
První příkaz vloží nový řádek do sledovací tabulky pro ty řádky, které existují ve virtuální tabulce vložených řádků (inserted): INSERT Production.ProductInventoryAudit (ProductID, LocationID, Shelf, Bin, Quantity, rowguid, ModifiedDate, InsOrUPD) SELECT DISTINCT i.ProductID, i.LocationID, i.Shelf, i.Bin, i.Quantity, i.rowguid, GETDATE(), 'I' FROM inserted i
Druhý příkaz vloží nový řádek do sledovací tabulky pro ty řádky, které existují ve virtuální tabulce odstraněných řádků (deleted), ale nikoliv v tabulce vložených řádků: INSERT Production.ProductInventoryAudit
Velká kniha T-SQL & SQL Server 2005
387
(ProductID, LocationID, Shelf, Bin, Quantity, rowguid, ModifiedDate, InsOrUPD) SELECT d.ProductID, d.LocationID, d.Shelf, d.Bin, d.Quantity, d.rowguid, GETDATE(), 'D' FROM deleted d GO
Poté, co jsme vytvořili trigger, vložili jsme do tabulky Production.ProductInventory jeden řádek, a hned potom jsme zase tentýž řádek odstranili, abychom mohli daný trigger otestovat. -- Vloží nový řádek INSERT Production.ProductInventory (ProductID, LocationID, Shelf, Bin, Quantity) VALUES (316, 6, 'A', 4, 22) -- Odstraní řádek DELETE Production.ProductInventory WHERE ProductID = 316 AND LocationID = 6
Jak jste pak sami viděli – když se vykonal dotaz nad sledovací tabulkou, vrátily se nám dva řádky, protože do tabulky se zaznamenaly operace vložení a odstranění řádku, které jsme provedli nad tabulkou Production.ProductInventory: SELECT ProductID, LocationID, InsOrUpd FROM Production.ProductInventoryAudit
Trigger DML typu INSTEAD OF Triggery DML typu INSTEAD OF se vykonávají místo původní modifikace dat, která trigger odpálila, a jsou povoleny jak pro tabulky, tak i pro pohledy. Triggery INSTEAD OF se často používají ke zpracování modifikací dat u pohledů, které přímé modifikace dat nepovolují (přehled pravidel, jež musí pohled splňovat, aby byl aktualizovatelný, naleznete v kapitole 7). Triggery DML typu INSTEAD OF mají následující syntaxi: CREATE TRIGGER [ název_schématu . ] název_triggeru ON { název:tabulky | název_pohledu } [ WITH <volba_triggeru_dml> [ ...,n ] ] INSTEAD OF { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { příkaz_sql [ ...n ] }
Argumenty příkazu jsou popsané v tabulce 12.3.
Kapitola 22
Vytváření a konfigurace databází V této kapitole najdete směsici návodů, které se točí okolo vytváření a konfigurace databáze SQL Serveru. Mezi činnosti, které se naučíte dělat s Transact-SQL, patří:
• Vytvoření nové databáze. • Přidávání souborů do databáze a odstraňování souborů nebo skupin souborů z databáze. • Prohlížení a modifikace databázových nastavení (včetně několika nových nastavení zavedených v SQL Serveru 2005).
• Zvýšení nebo snížení velikosti databáze nebo databázového souboru. • Odstranění databáze z instance SQL Serveru. • Odpojení databáze od instance SQL Serveru a její opětovné připojení k instanci. Proberu také všelijaká nastavení stavu – např. jako nakonfigurovat databázi, aby se z ní dalo jen číst, nebo jak přepnout databázi do módu jediného uživatele.
Poznámka Nová funkcionalita zrcadlení databáze (database mirroring) SQL Serveru 2005 se probírá v kapitole 25, databázové momentky (database snapshots) v kapitole 26.
Vytváření, modifikace a odstraňování databází V první sadě návodů proberu, jak se v instanci SQL Serveru vytvoří, modifikuje a odstraní databáze. Konkrétně ukážu, jak se:
• Vytvoří databáze na základě výchozí konfigurace systémové databáze model. • Prohlížejí informace týkající se konfigurace databáze. • Vytvoří databáze pomocí explicitních voleb databázového souboru (což znamená, že nebude závislá na systémové databázi model).
• Vytvoří databáze, která používá uživatelsky definovanou skupinu souborů (filegroup). • Změní název existující databáze.
Kapitola 22 – Vytváření a konfigurace databází
624
• Odstraní databáze z instance SQL Serveru. • Odpojí databáze od instance SQL Serveru, takže zbudou jen soubory podkladových dat a protokolů, a jak se pomocí stejných souborů databáze opět připojí. Prvořadé příkazy, které budete používat při vytváření a modifikaci databází, jsou CREATE DATABASE a ALTER DATABASE. Obdobně jako při výkladu příkazu SELECT v kapitole 1, i zde v každém návodu použiji některé relevantní komponenty, které budeme potřebovat k vyřešení aktuální úlohy, a nebudu prezentovat syntaxi v jediném obrovském bloku.
Vytvoření databáze s výchozí konfigurací Tento návod předvádí, jak se vytvoří databáze ve své nejjednodušší formě, a to pomocí výchozí konfigurace založené na systémové databázi model. Databáze model je systémová databáze, která se nainstaluje s SQL Serverem a definuje šablonu pro všechny ostatní databáze, jež se budou vytvářet v dané instanci SQL Serveru. Vytvoříte-li databázi, aniž byste specifikovali jiné volby než je název databáze, bude nová databáze založená na systémové databázi model. Syntaxe pro vytvoření databáze na základě šablony model vypadá takto: CREATE DATABASE název_databáze
Příkaz CREATE DATABASE se ve své nejjednodušší formě spokojí jen s jediným argumentem – názvem nové databáze. V tomto návodu vytvoříme novou databázi s názvem BookStore: USE master GO CREATE DATABASE BookStore GO
Jak to funguje V návodu jsme vytvořili novou databázi s názvem BookStore, aniž bychom uvedli nějaké další volby kromě názvu databáze. Když vynecháme podrobnosti, jako umístění, velikost a volby pro růst souborů, vytvoří se nová databáze na základě systémové databáze model. Databáze bude obsahovat všechny uživatelsky definované objekty, které jste dříve umístili do databáze model, a jmenná konvence pro názvy souborů bude založena na zadaném názvu databáze. Přestože se takto vytvoří nová databáze velmi rychle, nemáte při tomto způsobu kontrolu nad několika volbami, které popíšu v průběhu této kapitoly.
Prohlížení informací o databázi Tento návod předvede, jak se vypisují informace o databázových vlastnostech a souborech pomocí systémové uložené procedury sp_helpdb: EXEC sp_helpdb 'BookStore' GO
Velká kniha T-SQL & SQL Server 2005
625
Vrátí se dvě sady výsledků (které jsem musel trochu smrsknout, aby se vešly na šířku stránky knihy): name
db_size
BookStore 1.68 MB
name
owner
dbid created
JOEPROD\ 8 Owner
status
compatibility_level
Sep 30 2005 Status=ONLINE, Upda- 90 teability=READ_WRITE, UserAccess=MULTI_ USER, Recovery=FULL, Version=611, Collation=SQL_Latin1_General_CP1_CI_AS, SQLSortOrder=52, IsAutoCreateStatistics, IsAutoUpdateStatistics, IsFullTextEnabled
fileid filename
filegroup size
maxsize
BookStore 1
C:\Program Files\ Microsoft SQL Server\ MSSQL.1\MSSQL\DATA\ BookStore.mdf
PRIMARY
1216 KB Unlimited
BookStore_log
C:\Program Files\ Microsoft SQL Server\ MSSQL.1\MSSQL\DATA\ BookStore_log.LDF
NULL
504 KB
2
growth usage 1024 KB data only
2147483648 KB 10%
log only
Jak to funguje Vlastnosti databáze jsme si prohlédli pomocí systémové uložené procedury sp_helpdb. Přebírá jediný nepovinný parametr – v tomto případě je to název databáze: EXEC sp_helpdb 'BookStore'
Pokud bychom název databáze neuvedli, vrátily by se informace o všech databázích na dané instanci SQL Serveru. Systémová uložená procedura sp_helpdb vrací tyto informace:
• Název a vlastníka databáze. • Datum, kdy byla databáze vytvořena. • Různá databázová nastavení a volby, jako jsou výchozí kolace databáze nebo informace, zdali databáze je (nebo není) nakonfigurována tak, aby automaticky aktualizovala statistiky (to je skupina databázových voleb, které proberu v kapitole později).
• Seznam souborů, z nichž se skládá databáze, také jejich velikosti, skupiny souborů, kam patří, a volby růstu.
Kapitola 22 – Vytváření a konfigurace databází
626
Výstup také obsahuje úroveň kompatibility databáze. Například – databáze SQL Serveru 2005 má standardně úroveň kompatibility 90. Kompatibilita SQL Serveru 2000 by měla úroveň 80, SQL Serveru 7.0 70 a SQL Serveru 6.5 úroveň 65. Úroveň kompatibility umožňuje udržovat v SQL Serveru 2005 databáze, které zůstanou kompatibilní s předchozími verzemi SQL Serveru. To také znamená, že u databází kompatibilních s SQL Serverem 2000 nemůžete používat ta rozšíření Transact-SQL, která byla zavedena v SQL Serveru 2005. Úroveň kompatibility můžete nastavit systémovou uloženou procedurou sp_dbcmptlevel.
Vytvoření databáze pomocí voleb souborů Vytvářet nové databáze pomocí výchozích voleb systémové databáze model je užitečné, když jednoduše potřebujete co nejrychleji vytvořit nějakou testovací databázi, nicméně v produkčním prostředí budete obvykle klást větší důraz na volby, které se týkají umístění, velikosti a voleb růstu databázových souborů pro data a protokoly. Následující návod proto předvádí, jak se při vytváření databází dají zadávat explicitní volby pro databázové soubory. Zkrácená syntaxe příkazu CREATE DATABASE, jakou budeme používat v tomto návodu, je tato: CREATE DATABASE název_databáze [ ON [ <specifikace souborů> [ ,...n ] ] ] [ [ LOG ON { <specifikace souborů> [ ,...n ] } ] ]
Argumenty této syntaxe jsou stručně popsané v tabulce 22.1. Tabulka 22.1. Argumenty pro příkaz CREATE DATABASE Argument
Popis
název_databáze
Název nové databáze.
[ ON [ <specifikace_souborů> [ ,...n ] ] ]
Vyznačuje pro databázi jeden nebo více explicitně definovaných datových souborů.
[ LOG ON { <specifikace_souborů> [ ,...n ] } ]
Vyznačuje pro databázi jeden nebo více explicitně definovaných souborů transakčního protokolu.
Syntaxe argumentu specifikace_souborů pro vytvoření datového souboru a souboru protokolu vypadá takto: [ PRIMARY ] ( [ NAME =logický_název_souboru ,] FILENAME ='fyzický_název_souboru' [ ,SIZE =velikost [ KB | MB | GB | TB ] ] [ ,MAXSIZE ={ maximální_velikost
[ KB | MB | GB | TB ] | UNLIMITED } ]
[ ,FILEGROWTH =inkrement_růstu [ KB | MB | % ] ] )[ ,...n ]
Prvky argumentu specifikace_souborů jsou popsané v tabulce 22-2.
Velká kniha T-SQL & SQL Server 2005
627
Tabulka 22.2. Argumenty specifikace_souborů Argument
Popis
PRIMARY
Nepovinné klíčové slovo. V argumentu specifikace_souborů specifikuje, že se jedná o primární datový soubor (vstupní bod databáze, obsahuje ukazatele na ostatní soubory a typicky má příponu názvu souboru .mdf ). Pro danou databázi může existovat jen jeden primární soubor, a pokud se nevyznačí explicitně, bude se za primární datový soubor považovat první datový soubor uvedený v příkazu CREATE DATABASE.
logický_název_souboru
Logický název databázového souboru.
fyzický_název_souboru
Fyzická cesta a název databázového souboru.
velikost [ KB | MB | GB | TB ]
Počáteční velikost souboru v jednotkách podle specifikovaného atributu (kilobajty, megabajty, gigabajty, terabajty).
MAXSIZE = { maximální_velikost [ KB | MB | GB | TB ] | UNLIMITED }
Maximální povolená velikost souboru. Zvolíte-li UNLIMITED, bude moci soubor růst neomezeně, a může zabrat veškerý dostupný prostor na dané fyzické jednotce.
FILEGROWTH = inkrement_růstu [ KB | MB | % ]
O kolik soubor naroste (zvětší se jeho velikost), když požaduje další prostor. Dá se vyznačit buď počet kilobajtů či megabajtů, nebo procento velikosti existujícího souboru, o které má soubor narůst. Vyberete-li 0, soubor neporoste.
[ ,...n ]
Specifikuje, že se dá definovat více souborů (až 32 767 na jednu databázi).
V tomto návodu vytvořím novou databázi s názvem BookStoreArchive pomocí voleb příkazu CREATE DATABASE zmíněných výše: USE master GO CREATE DATABASE BookStoreArchive ON PRIMARY ( NAME = 'BookStoreArchive', FILENAME = 'F:\MSSQL\DATA\BookStoreArchive.mdf' , SIZE = 3MB , MAXSIZE = UNLIMITED, FILEGROWTH = 10MB ), (
NAME = 'BookStoreArchive2', FILENAME = 'G:\MSSQL\DATA\BookStoreArchive2.ndf' , SIZE = 1MB , MAXSIZE = 30, FILEGROWTH = 5% )
LOG ON (
NAME = 'BookStoreArchive_log',
628
Kapitola 22 – Vytváření a konfigurace databází
FILENAME = 'H:\MSSQL\TLOG\BookStoreArchive_log.LDF' , SIZE = 504KB , MAXSIZE = 100MB , FILEGROWTH = 10%) GO
Jak to funguje V tomto návodu jsme vytvořili novou databázi s názvem BookStoreArchive. Klíčovým slovem PRIMARY jsme specifikovali první soubor jako primární datový soubor: CREATE DATABASE BookStoreArchive ON PRIMARY
Následovala v závorkách definice prvního souboru. Logický název souboru bude BookStoreArchive: (
NAME = 'BookStoreArchive',
Fyzický název souboru říká, že soubor bude na jednotce F:. V produkčních scénářích pravděpodobně budete dávat své datové soubory na jednotky s jinými písmeny (možná budete podporovat pole disků RAID 5 nebo RAID 10, Redundant Array of Independent Disks): FILENAME = 'F:\MSSQL\DATA\BookStoreArchive.mdf' ,
Pak jsme nastavili počáteční velikost souboru na tři megabajty: SIZE = 3MB ,
Maximální velikost souboru jsme nastavili na UNLIMITED, což znamená, že bude moci růst tak dlouho, dokud bude na jednotce F: nějaké volné místo: MAXSIZE = UNLIMITED,
Přírůstek pro růst jsme nastavili tak, že soubor se bude zvětšovat vždy o 10 megabajtů. Kdykoliv bude pro soubor třeba přidat další prostor, zvětší se o 10 megabajtů: FILEGROWTH = 10MB ),
Předchozí definice souboru končí čárkou a následuje definice druhého datového souboru: (
NAME = 'BookStoreArchive2', FILENAME = 'G:\MSSQL\DATA\BookStoreArchive2.ndf' ,
Druhý datový soubor dostal jiný logický i jiný fyzický název souboru. Fyzický název souboru má příponu .ndf. Přestože se tato konkrétní přípona souboru nepožaduje, snadněji se podle ní identifikuje účel souborů, budete-li pro primární soubor používat příponu .mdf a pro všechny sekundární datové soubory příponu .ndf. Specifikujete-li více souborů, které navíc rozprostřete po jednotkách s různými písmeny, můžete – za předpokladu, že všechny tyto jednotky podporují pole disků RAID a jsou na separátních kanálech – po nich rozložit vstupní a výstupní operace, a potenciálně tak u rozsáhlejších databází s velkým provozem zvýšit výkon.
Velká kniha T-SQL & SQL Server 2005
629
Velikost druhého souboru jsme nastavili na jeden megabajt, a maximální velikost jsme nastavili na 30 megabajtů. Růst souboru jsme stanovili na pětiprocentní přírůstek, nikoliv v megabajtech jako u prvního datového souboru: SIZE = 1MB , MAXSIZE = 30, FILEGROWTH = 5% )
Za definicí dvou datových souborů uvozují klíčová slova LOG ON definici souboru transakčního protokolu: LOG ON (
NAME = 'BookStoreArchive_log',
Fyzický název souboru dostal příponu .ldf, což je standard pro soubory transakčních protokolů: FILENAME = 'H:\MSSQL\TLOG\BookStoreArchive_log.LDF' ,
Počáteční velikost jsme nastavili na 504 kilobajtů, maximální velikost souboru transakčního protokolu pak na 100 megabajtů s desetiprocentní mírou růstu. SIZE = 504KB , MAXSIZE = 100MB , FILEGROWTH = 10%)
Jakmile se příkaz CREATE DATABASE vykoná, automaticky se na serveru vytvoří patřičné soubory, přičemž databáze je pak připravena a můžete s ní začít pracovat. V pozdějších návodech této kapitoly se dozvíte, jak se dají modifikovat vlastnosti existujících souborů, i jak se přidávají do databáze nové datové soubory nebo soubory transakčních protokolů.
Vytvoření databáze s uživatelsky definovanou skupinou souborů Databáze musí mít přinejmenším jeden datový soubor a jeden soubor transakčního protokolu. Tyto soubory patří do jediné databáze, a proto nejsou sdíleny s jinými databázemi. Standardně, když se databáze vytvoří, patří datové soubory do primární skupiny souborů. Skupina souborů (filegroup) je pojmenované seskupení souborů pro administrační a rozmisťovací účely. Primární skupina souborů obsahuje primární datový soubor, i další datové soubory, které nebyly explicitně přiřazené do jiné skupiny souborů. Do skupin souborů patří datové soubory (ale už nikoliv soubory transakčního protokolu). Kromě primární skupiny souborů (kterou mají všechny databáze v SQL Serveru) můžete vytvářet sekundární uživatelsky definované skupiny souborů, do nichž pak umisťujete své soubory. Uživatelsky definované skupiny souborů se často používají u velmi velkých databází (VLDB), protože umožňují rozčlenit databázi na několik oblastí. Správa zálohování databáze pak probíhá na úrovni skupiny souborů, nikoliv na úrovni celé databáze.
Kapitola 22 – Vytváření a konfigurace databází
630
Poznámka Do skupin souborů se dají umisťovat i jednotlivé tabulky a indexy. To, jak se umístí tabulka do konkrétní skupiny souborů, naleznete v kapitole 4, jak index viz kapitola 5.
V tomto návodu předvedu, jak se vytvoří databáze se soubory umístěnými v uživatelsky definované skupině souborů. Syntaxe, kterou k tomu budeme potřebovat, vypadá takto: CREATE DATABASE název_databáze [ ON FILEGROUP název_skupiny_souborů [ DEFAULT ] <specifikace souborů> [ ,...n ] ] [ [ LOG ON { <specifikace souborů> [ ,...n ] } ] ]
Argumenty této syntaxe jsou popsané v tabulce 22.3. Tabulka 22.3. Argumenty CREATE DATABASE Argument
Popis
název_databáze
Název databáze.
FILEGROUP název_skupiny_souborů [DEFAULT ]
Vyznačuje logický název skupiny souborů. Následuje-li klíčové slovo DEFAULT, bude tato skupina souborů výchozí skupinou souborů databáze (což znamená, že standardně do ní patří všechny objekty zde vytvářené).
<specifikace souborů> [ ,...n ]
Vyznačuje jeden nebo více explicitně definovaných datových souborů pro databázi.
[ LOG ON { <specifikace souborů> [ ,...n ] } ]
Vyznačuje jeden nebo více explicitně definovaných souborů transakčního protokolu pro databázi.
V tomto návodu vytvoříme novou databázi s názvem BookStoreInternational, která bude používat dvě skupiny souborů. Jednou z nich bude požadovaná primární skupina souborů, druhou bude nová, uživatelsky definovaná skupina souborů FG2. Obě skupiny souborů vytvoříme jedním příkazem CREATE DATABASE: USE master GO CREATE DATABASE BookStoreInternational ON PRIMARY (
NAME = 'BookStoreInternational', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ BookStoreInternational.mdf' , SIZE = 3MB ,
Velká kniha T-SQL & SQL Server 2005
631
MAXSIZE = UNLIMITED, FILEGROWTH = 5MB ), FILEGROUP FG2 DEFAULT (
NAME = 'BookStoreInternational2', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\BookStoreInternational2.mdf' , SIZE = 1MB , MAXSIZE = UNLIMITED, FILEGROWTH = 1MB )
LOG ON (
NAME = 'BookStoreInternational_log', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\BookStoreInternational_log.LDF' , SIZE = 504KB , MAXSIZE = 100MB , FILEGROWTH = 10%)
GO
Jak to funguje V tomto návodu jsme vytvořili novou databázi se dvěma datovými soubory a jedním souborem protokolu o transakcích. První datový soubor jsme vytvořili na primární (PRIMARY) skupině souborů: CREATE DATABASE BookStoreInternational ON PRIMARY (
NAME = 'BookStoreInternational', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\BookStoreInternational.mdf' , SIZE = 3MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB ),
Druhý databázový datový soubor jsme vytvořili pomocí klíčového slova FILEGROUP v nové uživatelsky definované skupině souborů, kterou jsme nazvali FG2. Tuto skupinu souborů jsme označili jako výchozí, takže všechny nově vytvářené objekty v databázi se budou vytvářet v této skupině souborů: FILEGROUP FG2 DEFAULT (
NAME = 'BookStoreInternational2', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\BookStoreInternational2.mdf' , SIZE = 1MB , MAXSIZE = UNLIMITED, FILEGROWTH = 1MB )
632
Kapitola 22 – Vytváření a konfigurace databází
Protože se protokoly o transakcích neumisťují do skupin souborů, použili jsme v definici specifikace_souborů klíčová slova LOG ON: LOG ON (
NAME = 'BookStoreInternational_log', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\BookStoreInternational_log.LDF' , SIZE = 504KB , MAXSIZE = 100MB , FILEGROWTH = 10%)
GO
V tomto návodu jsme do skupiny souborů FG2 umístili jediný soubor (mohli byste ale do ní umístit i více souborů). Když skupina souborů obsahuje několik souborů, SQL Server plní soubory současně, nikoliv tak, že by nejprve naplnil jeden soubor a pak přešel k dalšímu.
Nastavení uživatelského přístupu k databázi SQL Server 2005 poskytuje tři módy uživatelského přístupu k databázi, které mají vliv na to, jací uživatelé mohou přistupovat k databázi (a kolik jich může být): SINGLE_USER, RESTRICTED_USER a MULTI_USER. Volby SINGLE_USER a RESTRICTED_USER jsou metody, při nichž se "zabouchnou dveře" jiným uživatelům, aby nemohli provádět žádné činnosti v databázi. Často je to prospěšné tehdy, když provádíte takové změny v konfiguraci databáze, u nichž je žádoucí, aby jiní uživatelé v té době nemohli pracovat s databází. Tyto volby se používají také tehdy, potřebujete-li vrátit zpět nějakou změnu v datech, nebo chcete vyloučit uživatele do té doby, dokud se plně nedokončí modernizace systému nebo aplikace. Podrobněji jsou jednotlivé volby popsané v nadcházející tabulce Syntaxe pro modifikaci uživatelského přístupu je následující: ALTER DATABASE název_databáze SET { SINGLE_USER | RESTRICTED_USER | MULTI_USER } [WITH { ROLLBACK AFTER celé_číslo [ SECONDS ] | ROLLBACK IMMEDIATE | NO_WAIT } ]
Argumenty této syntaxe jsou popsané v tabulce 22.4. Tabulka 22.4. Argumenty ALTER DATABASE Argument
Popis
název_databáze
Název existující databáze, ve které chcete modifikovat uživatelský přístup.
Velká kniha T-SQL & SQL Server 2005
633
Tabulka 22.4. Argumenty ALTER DATABASE Argument
Popis
SINGLE_USER | RESTRICTED_USER | MULTI_USER
Vyberete-li SINGLE_USER, bude moci v daném čase přistupovat k databázi jen jediný uživatel. Když se vybere tahle volba, a nepoužijí se ukončovací volby (jejich popis viz další argument), plánované modifikace tohoto jediného uživatele budou blokovány tak dlouho, dokud se z databáze neodpojí všichni ostatní uživatelé. Vyberete-li RESTRICTED_USER, budou moci přistupovat k databázi jen členové skupin s rolí sysadmin, dbcreator nebo db_owner. Při MULTI_USER mohou k databázi přistupovat všichni uživatelé, kteří k tomu mají udělena patřičná povolení.
ROLLBACK AFTER celé_číslo [ SECONDS ]
Ukončovací volby umožňují během příkazu ALTER DATABASE anulovat v databázi nedokončené transakce. Nepoužijete-li žádnou ukončovací volbu, bude váš příkaz ALTER muset čekat možná dost dlouho, než uzamykající připojení dokončí své úkoly. Ukončovací volby se ve skutečnosti mohou používat s jakoukoli klauzulí SET, ovšem nejčastěji se používají, když se přístup k databázi mění na mód SINGLE_USER nebo RESTRICTED_USER.
ROLLBACK IMMEDIATE | NO_WAIT
ROLLBACK AFTER celé_číslo [SECONDS] specifikuje, že otevřené databázové transakce se budou anulovat, až uplyne uvedený počet sekund. ROLLBACK IMMEDIATE anuluje otevřené transakce okamžitě. Uvedete-li NO_WAIT, způsobí to, že příkaz se nezdaří, pokud se nemůže okamžitě úspěšně dokončit (aby mohl příkaz s touto volbou uspět, nesmějí být v databázi otevřeny žádné transakce).
Následující návod předvede, jak se změní mód databáze AdventureWorks na SINGLE_USER, jak se stornují všechny otevřené transakce, a jak se databáze přepne zpět do módu MULTI_USER: SELECT user_access_desc FROM sys.databases WHERE name = 'AdventureWorks' ALTER DATABASE AdventureWorks SET SINGLE_USER WITH ROLLBACK IMMEDIATE SELECT user_access_desc FROM sys.databases WHERE name = 'AdventureWorks' ALTER DATABASE AdventureWorks SET MULTI_USER SELECT user_access_desc FROM sys.databases WHERE name = 'AdventureWorks'
Vrátí se: user_access_desc
634
Kapitola 22 – Vytváření a konfigurace databází
-----------------------------------------------------------MULTI_USER (1 row(s) affected) user_access_desc -----------------------------------------------------------SINGLE_USER (1 row(s) affected) user_access_desc -----------------------------------------------------------MULTI_USER (1 row(s) affected)
Jak to funguje V návodu jsme se nejprve dotázali systémového katalogového pohledu sys.databases na aktuální mód uživatelského přístupu. Pak jsme mód databáze změnili na SINGLE_USER, a použili volbu, která znamenala okamžité anulování všech otevřených transakcí v ostatních uživatelských relacích: ALTER DATABASE AdventureWorks SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Opět jsme pohledem sys.databases zkontrolovali uživatelský přístup, a databázi jsme zase přepnuli do módu MULTI_USER: ALTER DATABASE AdventureWorks SET MULTI_USER
Pak jsme přes pohled sys.databases ještě jednou zkontrolovali mód databáze: SELECT user_access_desc FROM sys.databases WHERE name = 'AdventureWorks'
Je důležité připomenout, že budete-li anulovat otevřené transakce tímto způsobem, můžete si ve vaší aplikaci přivodit jisté potíže. Závisí to na tom, jak aplikace zpracovává nedokončené procesy. Vždy, když je to možné, snažte se měnit uživatelský přístup v době, kdy s databází nikdo nepracuje, nebo když nejsou aktivní žádné transakce. Do módu SINGLE_USER je nutné nastavit databázi, chcete-li vykonat jisté operace, jako například volby READ_ONLY a READ_WRITE. Jinou příčinou, proč je potřeba uzavřít všechna aktuální uživatelská připojení, může být například to, že potřebujete napravit nějakou mimořádnou událost, aniž byste se museli potýkat s blokováním nebo s chybami z volající aplikace.
Přejmenování databáze V návodu předvedu, jak se pomocí příkazu ALTER DATABASE změní název existující databáze. Syntaxe: ALTER DATABASE název_databáze MODIFY NAME = nový_název_databáze
Velká kniha T-SQL & SQL Server 2005
635
Dva argumenty tohoto příkazu jsou původní název databáze a nový název databáze. Tento návod konkrétně předvede, jak se změní název databáze BookWarehouse na BookMart. Vykonáme také příkaz ALTER DATABASE...SET SINGLE USER, abychom vymetli jakákoliv jiná souběžná připojení k databázi: USE master GO ALTER DATABASE BookWarehouse SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO ALTER DATABASE BookWarehouse MODIFY NAME = BookMart GO ALTER DATABASE BookMart SET MULTI_USER GO
Vrátí se (výsledky mohou být různé, závisí to na činnostech, které se v databázi prováděly během ukončování připojení): Nonqualified transactions are being rolled back. Estimated rollback completion: 100%. The database name 'BookMart' has been set.
Jak to funguje V tomto návodu jsme přejmenovali databázi z BookWarehouse na BookMart. Než jsme to ale udělali, změnili jsme kontext relace dotazu na databázi master (protože není možné změnit název databáze v připojení k téže databázi): USE master GO
Databázi jsme pak přepnuli do módu jediného uživatele a anulovali všechny otevřené transakce v této databázi (kromě transakcí, které existovaly v aktuální relaci): ALTER DATABASE BookWarehouse SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO
Pak jsme příkazem ALTER DATABASE s klauzulí MODIFY NAME změnili název databáze: ALTER DATABASE BookWarehouse MODIFY NAME = BookMart GO
Přestože jsme databázi přepnuli do módu jednoho uživatele pod starým názvem, zůstane v módu jediného uživatele tak dlouho, dokud ji explicitně nedáte zpět do módu MULTI_USER:
636
Kapitola 22 – Vytváření a konfigurace databází
ALTER DATABASE BookMart SET MULTI_USER GO
Odstranění databáze Uživatelskou databázi můžete z SQL Serveru odstranit příkazem DROP DATABASE. Příkaz DROP DATABASE odstraní odkazy na databázi ze systémových tabulek SQL Serveru. Jsou-li podkladové soubory online, odstraní se také fyzické soubory ze stroje SQL Serveru. Syntaxe je následující: DROP DATABASE název_databáze
V tomto návodu odstraníme databázi BookStoreArchive_Czech (vytváří se v jednom z pozdějších oddílů této kapitoly): USE master GO ALTER DATABASE BookStoreArchive_Czech SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO DROP DATABASE BookStoreArchive_Czech GO
Jak to funguje Návod jsem zahájil tím, že jsem přepnul aktuální kontext relace dotazu na databázi master, protože databázi nemůžete odstranit v době, kdy jste k ní připojeni. V návodu jsem také přepnul databázi do módu jediného uživatele a vynutil si, aby se okamžitě anulovaly všechny otevřené transakce. A nakonec – v rámci téže relace dotazu, jsem příkazem DROP DATABASE databázi odstranil.
Odpojení databáze Když databázi odstraníte, zmizí z instance SQL Serveru nejen ona, ale i její fyzické soubory. Pokud byste sice odstranili databázi z instance SQL Serveru, ale zachovali její fyzické soubory (kvůli archivaci, nebo pokud chcete s databází migrovat do jiné instance SQL Serveru), nemusíte databázi odstranit – stačí ji odpojit (detach). Databázi můžete také přemístit z jedné instance SQL Serveru na jinou tak, že ji z jedné instance odpojíte a ke druhé připojíte. Chcete-li nějakou databázi odpojit, zavolejte systémovou uloženou proceduru sp_detach_db. Ta má následující syntaxi: sp_detach_db [ @dbname= ] 'název_databáze' [ , [ @skipchecks= ] 'přeskočit_kontroly' ] [ , [ @KeepFulltextIndexFile= ] 'zachovat_soubor_fulltextového_indexu' ]
Parametry procedury jsou popsané v tabulce 22.5.