|
|
Integritnφ omezenφ
Ji₧ ve ΦtvrtΘm pokraΦovßnφ DatabßzovΘ abecedy jsme se v∞novali referenΦnφ integrit∞, jako specißlnφmu p°φpadu integritnφch omezenφ (IO). P°ipome≥me, ₧e IO jsou tvrzenφ, kterß majφ platit o datech v databßzi. Samoz°ejm∞, ₧e by m∞la b²t v ·zkΘm vztahu ke tvrzenφm na konceptußlnφ ·rovni, kterß platφ o objektech sv∞ta aplikace. P°i tvorb∞ IS se tedy setkßme s problΘmem, jak IO na konceptußlnφ ·rovni p°enΘst do IO na databßzovΘ ·rovni. V dneÜnφch mo₧nostech, kterΘ nabφzφ standard SQL92 zφskßvßme mo₧nost specifikovat IO neprocedurßln∞ p°φmo v definici databßze. Proto₧e tato mo₧nost z logickΘho hlediska prakticky nep°ekraΦuje mo₧nosti p°φkazu SELECT, tj. v principu relaΦnφ ·plnost, je z°ejmΘ, ₧e jistß IO musφ b²t ônaprogramovßnaö. To se v horÜφm p°φpad∞ d∞lß na ·rovni aplikaΦnφch program∙, v lepÜφm p°φpad∞ pomocφ ulo₧en²ch procedur, pravidel, Φi nejlΘpe trigger∙, kterΘ dokonce umo₧≥ujφ °eÜit ôzotavenφ z chybö, tj. specifikovat akce, kterΘ je t°eba p°i naruÜenφ integrity databßze automaticky provΘst. V dneÜnφ sloupci se budeme v∞novat neprocedurßlnφm mo₧nostem, kterß SQL nabφzφ. Proto₧e platn²m standardem je SQL92, budeme vyu₧φvat mo₧nosti tohoto standardu, p°esto₧e jeho implementace je dosud b∞₧n²mi databßzov²mi produkty napln∞na pouze ΦßsteΦn∞. Z logickΘho hlediska je IO tvrzenφ vyjßd°itelnΘ nap°. formulφ predikßtovΘho kalkulu 1. °ßdu. V SQL lze k IO p°istupovat strukturovan∞ji. IO lze rozd∞lit podle toho, vedou-li ke specifikaci:
ZaΦneme od domΘny. Podstatnou novinkou v SQL92 je mo₧nost definovat domΘnu, tj. jako mno₧inu hodnot ve smyslu p∙vodnφho Coddova RMD, pomocφ CREATE DOMAIN, a tu pak pou₧φt v definici sloupce tabulky. CREATE DOMAIN LETOS IS DATE DEFAULT 1996-12-31 CHECK (VALUE > 1996-01-01 AND VALUE < 1996-12-31) CREATE TABLE V▌P┘J╚KY_FILM┘ (╚_KOPIE INTEGER NOT NULL, N┴ZEV_KINA CHARACTER(20), CENA DECIMAL (4,2) NOT NULL CHECK(CENA > = 100), DATUM_VR┴CEN═ LETOS, PRIMARY KEY(╚_KOPIE) ) Podpora domΘn je ovÜem slabß. Melton a Simon ve svΘ knize Understanding the New SQL: A Complete Guide (Morgan Kaufmann, 1993) naz²vajφ domΘny SQL92 v²sti₧n∞ pseudo-typy. Jde vlastn∞ o pouhΘ makra, kterß p°ibli₧ujφ datov² model SQL p∙vodnφmu RMD. Na jednΘ stran∞ je u₧iteΦnΘ mφt pouze jeden zßpis definice domΘny, vyskytuje-li se ve vφce sloupcφch tabulek, na druhΘ stran∞ tu ale nenφ podpora silnΘ kontroly typ∙, nap°. p°i spojovßnφ tabulek. Ta se odehrßvß na zßkladnφch typech. IO pro sloupce tabulky zahrnuje mo₧nost blφ₧e specifikovat povolenΘ hodnoty pro dan² sloupec. Vedle ji₧ zmi≥ovanΘ referenΦnφ integrity lze specifikovat NOT NULL (neprßzdnß hodnota v ka₧dΘm °ßdku), UNIQUE (jedineΦnost hodnot v rßmci sloupce) a CHECK (rozsah hodnot). UNIQUE nenφ v SQL92 podmφn∞no pou₧itφm NOT NULL, jak je tomu b∞₧nΘ u souΦasn²ch databßzov²ch produkt∙, tj. s UNIQUE, nenφ-li °eΦeno NOT NULL, se m∙₧e v danΘm sloupci vyskytnout jedna hodnota NULL. Pro ·plnost dodejme, ₧e lze specifikovat i DEFAULT hodnotu sloupce. V definici tabulky je mo₧nΘ explicitn∞ pojmenovat IO za ·Φelem pozd∞jÜφho odkazovßnφ na n∞ nap°. v p°φkazu ALTER nebo p°i odlo₧enφ kontroly IO klauzulφ SET CONSTRAINTS OFF. (P°ipome≥me, ₧e p°φkazy SET CONSTRAINTS OFF a SET CONSTRAINTS ON umo₧≥ujφ v transakci zajistit potlaΦenφ Φi aktivaci kontroly danΘho IO.) IO pro sloupec CENA lze pojmenovat, tj. lze psßt nap°. CENA DECIMAL (4,2) CONSTRAINT IOCENA NOT NULL CHECK(CENA > = 100), a zachßzet pozd∞ji p°φmo s IOCENA. V²znamn²m prvkem SQL92 je rozÜφ°enφ klauzule CHECK. Za CHECK se m∙₧e vyskytnout slo₧it∞jÜφ v²raz obsahujφcφ odkazy i na jinΘ tabulky. IO bude spln∞no tehdy, nabude-li podmφnka za CHECK hodnoty TRUE nebo vede k hodnot∞ ônedefinovßnoö. Uva₧ujme tabulky FILM a P╪EDSTAVEN═. IO "Nebude se dßvat ₧ßdn² film re₧φrovan² TroÜkou" lze formulovat v tabulce P╪EDSTAVEN═ pro atribut JM╔NO_F jako CHECK (JM╔NO_F < > ANY (SELECT JM╔NO_F FROM FILM WHERE REÄIS╔R = ¢ TroÜka¢ ) ) Nepojmenovanou Φi pojmenovanou (s CONSTRAINT) klausuli CHECK lze usadit za definici sloupc∙. Toho lze vyu₧φt spφÜe pro IO t²kajφcφ se °ßdku tabulky nebo tabulky. Podobn∞ je mo₧nΘ pou₧φt UNIQUE, chceme-li definovat alternativnφ slo₧enΘ klφΦe, Φi PRIMARY KEY, jde-li o slo₧en² primßrnφ klφΦ. Pro ·plnost dodejme, ₧e za definicemi atribut∙ lze definovat i referenΦnφ integritu, co₧ mß nejv∞tÜφ smysl tehdy, jsou-li cizφ klφΦe slo₧enΘ. Specißlnφm d∙sledkem pojetφ IO v SQL (CONSTRAINTS a vÜechna ostatnφ) je, ₧e musφ b²t spln∞na i pro prßzdnou relaci. Jist∞ je smysluplnΘ tvrdit, ₧e kdy₧ se nehraje ₧ßdn² film, pak ani ne od TroÜky. To ovÜem m∙₧e vΘst k ne₧ßdoucφm efekt∙m. P°edstavme si IO ôV₧dy se dßvß n∞jak² filmö. Vyjßd°eme IO v SQL jako CONSTRAINT P╪EDSTAVEN═_VÄDY CHECK (SELECT COUNT(* ) FROM P╪EDSTAVEN═) > 0) Toto IO bude ale nab²vat hodnoty TRUE i tehdy, kdy₧ relace P╪EDSTAVEN═ bude prßzdnß. Tento nevhodn² efekt se stal motivacφ pro formulaci IO mimo relace, tj. asi tak, jak jsou chßpßna v zßkladnφ definici RMD. P°ipome≥me, ₧e tam se schΘma relaΦnφ databßze sklßdß z mno₧iny schΘmat relacφ a mno₧iny IO. V SQL92 lze specifikovat tvrzenφ (ASSERTION) pomocφ CREATE ASSERTION. Jde op∞t o pojmenovanΘ IO formulovanΘ za sv²m jmΘnem pomocφ CHECK Na rozdφl od p°edchozφch mo₧nostφ nenab²vß automaticky TRUE na prßzdnΘ tabulce! Tφm ovÜem dochßzφ k jistΘ redundanci zßpis∙ IO. Nap°. NOT NULL je specißlnφm p°φpadem pou₧itφ CHECK na jeden sloupec. Mo₧nosti CHECK jsou zase specißlnφm p°φpadem ASSERTION. Osamostatn∞nφ IO pomocφ ASSERTION klade ovÜem zv²ÜenΘ nßroky na implementaci. Teoreticky jde vlastn∞ o problΘm, co p°esn∞ je t°eba kontrolovat, dojde-li k aktualizaci databßze. Zatφmco u IO t²kajφcφch se sloupce Φi jednΘ tabulky jde o problΘm °eÜiteln² celkem ·sp∞Ün∞ ve v∞tÜin∞ souΦasn²ch relaΦnφch S╪BD, ômezitabulkovΘö vztahy danΘ IO mohou b²t natolik spletitΘ, ₧e naivnφ kontrola databßze p°i aktualizaci by mohla vΘst k ochromenφ jejφho provozu. Zdß se, ₧e s implementacφ ASSERTION (ale ani CHECK s odkazem na vφce tabulek) nikdo p°φliÜ nesp∞chß. SouΦasnΘ implementace S╪BD se zatφm zam∞°ily hlavn∞ na implementaci referenΦnφ integrity. P°φstup i k t∞m nejzßkladn∞jÜφm IO je dost r∙zn². Nap°. u v∞tÜiny S╪BD se pro atributy primßrnφho klφΦe automaticky vytvß°φ index (ne vÜak u SQLBase). N∞kterΘ systΘmy vÜak umo₧≥ujφ vytvo°it na tytΘ₧ atributy jeÜt∞ dalÜφ index pomocφ CREATE INDEX. DomΘny zatφm nejsou podporovßny, tj. vÜe o sloupci se musφ vejφt do definice sloupce v CERATE TABLE. Jistou nev²hodou deklarativnφch (neprocedurßlnφch) IO v SQL jako takovΘm je slab² aparßt pro reakci na chybu. Ta musφ b²t v∞tÜinou oÜet°ena v dalÜφch programech. Podstatn∞ v∞tÜφ mo₧nostφ nabφzφ koncepce triggeru. A ten si nechßme na p°φÜt∞. <seznam dφl∙ serißlu> <COMPUTERWORLD> |