Doba, kdy SQL Server vlastně byla Sybase a Microsoft mohl maximálně opravovat chyby je nenávratně pryč. Dneska se před touto databází třese i takový gigant jako je Oracle.
První beta verze nového vydání po verzi 7.0 byla k dispozici (alespoň
ze začátku) pouze omezenému počtu vývojářů již v září 1999
(připomeňme si, že verze 7.0 byla dána do prodeje v lednu 1999) a krátce
na to byl oznámen nový název, tedy MS SQL Server 2000. Důvod byl
víceméně marketingový: označení 8.0 by znamenalo „pouze“ další
verzi produktu z řadu BackOffice serverů, kdežto označení číslem roku
vydaní mělo vyjádřit nový přístup Microsoftu k tomuto produktu –
máme skvělý databázový server a není to pouze člen nějaké rodiny, ale
samostatný dospělý jedinec.
Ve skutečnosti je číslo 2000 opravu pouze marketingové. Jestliže si
necháte zjistit verzi (viz proměnná @@VERSION), dostanete mj. interní verzi
8.00.194.
Protože změn ve „strojovně“ SQL Serveru bylo minimálně, byla
uvolněna již jen jedna beta verze (duben 2000) a tentokráte ji Microsoft
ihned rozeslal velkému množství vývojářů. Finální build byl uvolněn
v srpnu 2000 a nyní máte možnost seznámit se s ním. Protože recenze SQL
Serveru verze 7 vyšla v SWN čísle 4/1999 a pak byl také zmíněn
v přehledu databázových serverů v čísle 2/2000, budu se věnovat hlavně
novinkám, které s verzí 2000 přicházejí.
Instalace
Výraznou novinkou nové verze SQL Serveru je jeho instalace, kterou můžete
provádět buďto na lokální počítač nebo na vzdálený server. To ovšem
není to podstatné. Pří instalaci totiž narazíte na volbu přidání nové
instance SQL Serveru. Co to vlastně je?
Pokud jste dříve potřebovali ladit vaše kódy na různých verzích SQL
Serveru, museli jste mít tolik počítačů, kolik jste měli verzí včetně
servisních balíčků. Tomu je ale od teď konec. Na jediný počítač si
totiž můžete nainstalovat libovolné množství instancí SQL Serveru, a to
tak, že každá instance může mít (ale nemusí) případné opravy. Takto
můžete fungovat včetně sedmé verze. Jen na okraj, slovo libovolné v tomto
případě znamená tolik, kolik je schopen utáhnout váš počítač.
Důležitým okamžikem v této chvíli je zvolení názvu nové instance.
Ten je totiž potřeba při připojování se k dané instanci.
Mohlo by se zdát, že pokud nainstalujete další instanci SQL Serveru, na
vašem disku ubude stejné množství volného místa jako při první
instalaci. Není to pravda. Věci, jako jsou Books Online, různé nástroje či
příklady se nainstalují pouze jednou a ostatní instance je používají.
Pouze se mi nelíbilo – a to je problém většiny produktů – že když
jsem řekl nainstalovat na disk H:, tak mi stejně na disku C:, kde mám
systém, ubrala instalace kolem 100 MB. Nevím jak vám, ale mě to normální
(a slušné) nepřipadá a zvykat si na to nechci.
Novinky v Transact-SQL
Není žádným tajemstvím, že Microsoft plně podporuje formát XML, proto
jeho podporu zabudoval přímo do SQL Serveru. K dispozici je několik
možností, z nich některé přišly až po uvolnění produktu do prodeje
(XML for SQL Server Web Release 1 či XML View Mapper 1.0 – jsou zdarma
dostupné na webu).
Zřejmě nejpoužívanější bude výběr množiny dat do XML. K tomu
slouží klauzule FOR XML příkazu SELECT. K dispozici je několik způsobů,
jak data získat. Můžete si vybrat, zda jednotlivé sloupečky budou jako
atributy elementu nebo jako zvláštní podelementy. Tento výsledek lze pak
s výhodou použít například v IIS (Internet Information Server) a
naformátovat jej pomocí kaskádových stylů.
Další novinkou v T-SQL jsou triggery (chcete-li spouště), respektive
triggery definované jako INSTEAD OF. V tomto případě totiž nedojde ke
standardní manipulaci s daty (INSERT, UPDATE, DELETE), ale vykoná se pouze
tento trigger. To je výhodné při provádění úprav dat, které uživatel
dostane například pomocí pohledu (VIEW). Pokud si vytvoříte triggery,
které se budou spouštět po operaci (AFTER) lze říct, v jakém pořadí se
vykonají. Co mi ovšem vadí je absence možnosti změn vkládaných či
pozměňovaných dat před vlastním zápisem do tabulky (viz
vložený text).
Při vytváření tabulek lze použít klauzule REFERENCES, která je
rozšířená o další možnosti: ON DELETE a ON UPDATE, ovšem má to jeden
háček, na který jsem narazil. Pokud chcete takto hlídat kaskádově více
než jeden sloupeček v jedné tabulce, máte prostě smůlu. SQL Server vám
vydá hlášení, které mi připadne neadekvátní (viz vložený text).
S novou verzí přichází také tři nové datové typy. BIGINT je
osmibytový celočíselný znaménkový a rozšiřuje základní číselné
typy. SQL_VARIANT je takový „paskvilní“ typ, který může obsahovat
libovolný datový typ. Nejzajímavější je ovšem typ TABLE, který obsahuje
tabulku a lze jej použít například v uživatelsky definovaných
funkcích – ano, již i SQL Server zná pojem funkce. Zdá se to
neuvěřitelné, že to byl pojem dříve zakázaný.
V databázovém světě věcí ojedinělou jsou indexy definovány nad
pohledy. Díky nim můžete používat složitější pohledy, které dříve
nebylo vhodné kvůli rychlosti do aplikací zavádět. Nevýhodou je, že tato
možnost je až v nejdražší variantě produktu, což je docela škoda.
Indexy je možné definovat také na vypočítávaných sloupcích a lze
určit zda budou sestavené jako vzestupné či sestupné. Příkazu CREATE
INDEX můžete nařídit, aby k vytvoření indexu použil databázi tempdb,
což má za následek zlepšení zápisu a čtení z disku a tedy i zrychlení
operace. Pomocí klauzule EXPAND či NOEXPAND lze potlačit či donutit server
používat indexy.
Novinky v nástrojích
Zřejmě nejvýraznější změnou, kterou si každý, kdo má zkušenosti
s předchozí verzí, všimne, je přidání Object Browseru do SQL Query
Analyseru (viz obrázek). K jednotlivým objektům lze získat seznam těch
objektů, na kterých závisí (podobně jako například v SQL Station pro
Oracle). Na pravé tlačítko nad objektem v Browseru můžete získat
jednoduše jeho zdrojový kód – do schránky, nového okna či souboru, lze
si vybrat.
V případě, že neustále píšete to samé (například triggery či
uložené procedury), můžete využít šablon a ušetřit i několik desítek
řádků kódu (jak v SQL Query Analyzeru tak v Enterprise Manageru).
Kromě toho, že můžete uložené procedury vytvářet, můžete je
i ladit. K dispozici je kromě bodů pozastavení (breakpoints) také možnost
nahlížet do zásobníku a na lokální či globální proměnné.
Změn doznaly taktéž Data Transformation Services. Kromě rozdělení do
jednotlivých fází je užitečné, že můžete přesně říct, jak se má
převod provést. K dispozici totiž máte převodní skript, takže – pokud
je to potřeba – lze naprogramovat různé chování při transformaci.
K napsání kódu jsou k dispozici Visual Basic Transformation Script a Java
Transformation skript, můžete si tedy vybrat. Pokud vám vadí, že editace
není uživatelsky nejpříjemnější (malé okno, nezvýrazněna syntaxe,
…), můžete zdrojový text napsat v jiném nástroji a pak jej pouze
načíst.
Převod lze uskutečnit opravdu z velkého množství zdrojů: od textových
souborů přes Paradox či dBase kolem Excelu a Accessu až k SQL Serveru nebo
Oracle (přes OLE DB providera). Cílem může být samozřejmě jedna
z položek právě uvedených v neúplném výčtu zdrojů.
Potřebujete-li převést data ze SQL Serveru verze 7 na verzi 2000, je
nápomocen průvodce Copy Database Wizard, který navíc dokáže převádět
data z jedné instance verze 2000 na jinou. Tuto akci lze provést ihned nebo
ji naplánovat buďto na určitý čas nebo tak, aby se prováděla
v definovaných intervalech. Toho se nechá využívat například při vývoji
aplikací, kdy se budou data z ostrého systému třeba každou půlnoc
převádět na testovací databáze.
Architektura
Verze Enterprise dokáže díky technologii Advanced Windows Extension (AWE)
pracovat až se 64 GB paměti (ovšem pouze za pomocí Windows 2000 Data
Center). Jádro samozřejmě používá 32-bitovou adresaci, ale díky
mapování lze dosáhnout uvedené hranice. Ono přechod na 64-bitovou
technologii nemá být dle vyjádření Microsoftu žádný problém, protože
interní struktury SQL Serveru jsou na to připravené a čeká se vlastně
pouze na nový 64-bitový procesor firmy Intel.
Pro neanglicky mluvící uživatele je důležité, aby server mohl nejen
ukládat, ale i řadit textová data s vlastní znakovou sadou. SQL Server
samozřejmě podporuje kolace (collations – češtináři prominou, ale tohle
je nepřeložitelné) již v dřívějších verzí a do stávající
přidává některé nové. Důležitou změnou je ale to, že již můžete
specifikovat kolaci i na jednotlivé sloupečky, což lze využít například
v aplikacích, které mají více jazykových mutací.
Ostatní
Ve výpisu novinek bychom mohli pokračovat na dalších stránkách, ale
nemá to cenu. Ty, které mi připadly nejvýraznější, jsem uvedl, zde si ve
stručnosti povězme o některých dalších.
Log Shipping umožňuje převést transakční protokol z jedné databáze
na druhou (i na jiný server) a tam pak pokračovat dál.
Změny doznal i SQL Profiler. jednak obsahuje nové události pro některé
činnosti a jednak byl rozšířen o možnost zajišťování auditu aktivit
SQL Serveru (je možné použití úrovně zabezpečení C2).
Vylepšením, které není na první pohled vidět, je velké množství
(nových) průvodců pro různé akce, které bylo dříve nutné dělat
ručně. Nyní stačí ke spokojenosti ve většině případů neustále
mačkat tlačítko Next a jen v minimálních případech provést pár
akcí navíc.
Nápověda SQL Serveru byla integrována s Books Online, což znamená, že
se vyvolá nápověda závislá na situaci v prostředí.
Tak si to zrekapitulujeme
Je jasné, že Microsoft touto verzí velmi důrazně „dejchá“ na záda
Oraclu, ba dokonce v mnoha testech Oracle zamlžuje zpětné zrcátko SQL
Serveru (ale zatím jen boční). Že se jedná o velmi kvalitní databázový
stroj nejvyšší třídy se můžete přesvědčit sami díky trial verzím,
které Microsoft poskytuje zdarma. Jsem velmi zvědav, jak se bude vývoj
ubírat nadále, zda-li se někdo (a kdo) dostane do výrazného vedení.
Nemá zřejmě cenu dělat velké závěry ze dvou důvodů. Pořádné
testování by muselo být provedeno s gigabytovými daty a tisíci přístupy
za minutu, na což bohužel redakce nemá prostředky. Druhý důvod je jistě
příjemnější – s testováním serveru jsme neskončili. V některém
z dalších letošních čísel popíšeme praktické zkušenosti při převodu
reálné aplikace z malé databáze právě na SQL Server.
Ačkoliv mám několik poznámek k Transact-SQL, jde o věci, na které je
potřeba si zvyknout. Jako kompenzaci dostanete velmi mocný nástroj, se
kterým můžete se svými daty dělat opravdu velká kouzla (zvláště díky
uživatelským funkcím). Jestliže používáte Oracle, zřejmě nemá cenu
přecházet na tuto databázi, ovšem používáte-li něco jiného či
začínáte nové projekty (a nejsou to zrovna telefonní čísla vašich
milenek/milenců), bude SQL Server 2000 to správnou volbou pro vaše data
nejen díky kvalitě, ale jistě také díky ceně.
Plusy, mínusy, závěr
Plusy
- Více instancí na jednom počítači
- Spousta nových průvodců
- Ladění uložených procedur
- Object Browser v Query Analyzeru
- Uživatelsky přítulné
Mínusy
- Některé nedotaženosti T-SQL
- Indexované pohledy až ve verzi Enterprise
Závěr
- Velmi kvalitní databázový stroj, který dokáže porazit v mnoha testech
Oracle. Lze nasadit na střední, ale i velké projekty.
Do rámečku
Problém číslo 1: změna dat v triggerech
Problém, který leckdy řešíme, je změna dat ještě před vlastním
uložením do tabulky. Například při vytvoření či změně záznamu chceme
znát, kdo a kdy jej vytvořil resp. změnil. V případě prvním si můžeme
sice pomocí DEFAULT klauzule při definici sloupce, ale při změně dat
příkazem UPDATE nám to už nepomůže. Navíc, pokud si uživatel řekne, že
místo přednastavené hodnoty chce mít něco jiného, máme smůlu. Na
některých databázových serverech se to řeší pomocí odkazů na nová a
stará data použitím klíčových slov NEW a OLD. Příkaz pak může vypadat
například takto:
NEW.LASTEDITEDBY = SUSER_SNAME()
Bohužel, tohle SQL Server nezná. Má sice virtuální tabulky inserted a
deleted, ale ty mají jednu velkou nectnost: jsou pouze ke čtení.
Jedno jednoduché řešení však existuje, ovšem za tu cenu, že zakážeme
rekursivní volání triggerů. Pak, například při UPDATE tabulky použijeme
tento příkaz ještě jednou v triggeru, tentokráte však, díky zakázanému
rekurentnímu volání se vše provede tak, jak potřebujeme:
SP_CONFIGURE 'NESTED TRIGGERS', 0
RECONFIGURE
GO
CREATE TRIGGER AU_MYTABLE
ON MYTABLE
AFTER UPDATE
AS
UPDATE MYTABLE
SET LASTEDITEDAT = GETDATE(),
LASTEDITEDBY = SUSER_SNAME()
WHERE ID IN (SELECT ID FROM INSERTED)
GO
Problém číslo 2: kaskádové změny dat
Představme si situaci, kdy máme tabulku OSOBA a k ní tabulku KRADEZ, kde
bude ID okradené osoby a ID osoby, která kradla. Nyní potřebujeme, aby
v případě změny primárního klíče v tabulce OSOBA došlo logicky, bez
velkého programování i ke změně v tabulce KRADEZ. Pomocí nově přidané
vlastnosti ON UPDATE můžeme upravit tabulku osoba takto:
ALTER TABLE KRADEZ
ADD FOREIGN KEY (IDOKRADENA)
REFERENCES OSOBA (IDOSOBA)
ON UPDATE CASCADE
ON DELETE NO ACTION
GO
ALTER TABLE KRADEZ
ADD FOREIGN KEY (IDOKRADLA)
REFERENCES OSOBA (IDOSOBA)
ON UPDATE CASCADE
ON DELETE NO ACTION
GO
První příkaz proběhne podle očekávání, druhý však – zcela
nelogicky – vyvolá chybu, která říká, že uvedený cizí klíč může
vyvolat cyklickou nebo násobnou kaskádovou cestu. Co se týče násobné
kaskádové cesty: no a co? To je přesně to, co potřebuji (ovšem pokud daná
relace je pouze neidentifikační, pak tam žádnou násobnost nevidím).
A cyklus? Ten mě napadá pouze ve spojení s triggerama, ale to je pak už
zřejmě chyba toho, kdo takhle triggery naprogramuje. Zde o jednoduchém
řešení nevím.
Obrázky
Tento článek byl napsán pro časopis Softwarové noviny 6/2001.
Upozornění: tento text neprošel redakční úpravou, takže je
tak, jak byl napsán včetně případných chyb. Žádná část tohoto
článku nesmí být použita bez předchozího souhlasu autora.
Seznam mých dalších článků je v tomto přehledu.