Kufafanua vikwazo vya kudhibiti uadilifu wa data. Vikwazo vya uadilifu. Mionekano ya Data

"Jedwali au mwonekano unaweza kuwa na ufunguo mmoja tu wa kipekee."
Rejea ya Oracle9i SQL kuhusu kuzuia matumizi ya Vizuizi vya Kipekee

Taarifa iliyowasilishwa kama epigraph imechukuliwa kutoka kwa hati ya Oracle, lakini mazoezi yote kabla ya kusoma hati yalionyesha kinyume. Kujaribu kwa kuunda jozi ya Vikwazo vya Kipekee kulithibitisha hili. Kuna hitilafu katika uhifadhi.

Ni nini kingine (kwa matumaini ya maelezo yasiyo na makosa) kinaweza kupatikana kutoka kwa hati kuhusu Vikwazo vya Uadilifu katika Oracle? Nilijaribu kuandika istilahi mbalimbali na vipengele vya utendaji Vikwazo vya uadilifu kama aina za mtu binafsi Vitu vya hifadhidata vya Oracle bila kuingia katika sintaksia na maelezo ya matumizi yao. Mambo mengi yalikuwa mapya kwangu, sitayaficha.

Hebu tuanze tangu mwanzo - Dhana za Hifadhidata ya Oracle9i Toleo la 2 (9.2). Nyaraka zinaonyesha dhana ya "Uadilifu wa Data", ambayo inahusishwa na utekelezaji wa sheria za biashara zinazohusiana na hifadhidata. Uadilifu wa Data umegawanywa katika aina tano za sheria, ambazo baadhi hutekelezwa na "Vikwazo vya Uadilifu" Oracle DBMS :

1. Kanuni NULL - SI kizuizi NULL;

2. maadili ya kipekee - vikwazo muhimu vya kipekee;

3. maadili muhimu ya msingi - vikwazo vya msingi;

4. sheria za uadilifu wa marejeleo - vikwazo vya ufunguo wa kigeni (au "vikwazo vya uadilifu rejeleo" - majina yote mawili yanaonekana katika hati ya Oracle);

5. kuangalia kizuizi changamano - Angalia-kizuizi.

(Hapa, upande wa kushoto wa mstari kuna sheria ya "Uadilifu wa Data", na kulia ni aina ya "Vikwazo vya Uadilifu" inayotekeleza sheria hii)

Aina ya nne ya sheria za "Uadilifu wa Data" ni mchanganyiko, na inahakikishwa kwa sehemu tu na "Vikwazo vya Uadilifu":

1. kuweka data tegemezi kwa NULL wakati wa kufuta data ya kumbukumbu;

2. kufutwa kwa kasi kwa data tegemezi wakati wa kufuta data ya marejeleo;

3. pamoja na kutokuwepo kwa hatua yoyote kwenye data tegemezi wakati wa kubadilisha au kufuta data ya marejeleo. (Hapa bado sijaeleweka kwangu katika suala la tofauti kati ya Kuzuia na Hakuna Hatua. Labda mmoja wa wasomaji atasaidia kugundua tofauti...)

Aina ndogo zilizobaki za nukta ya nne "Uadilifu wa data":

o kuweka data tegemezi kwa NULL wakati data ya kumbukumbu inabadilika;

o mabadiliko ya kasi katika data tegemezi wakati data ya kumbukumbu inabadilika;

o kuweka data tegemezi kwa chaguo-msingi wakati data ya marejeleo inabadilishwa au kufutwa;

Aina hizo za sheria za Uadilifu wa Data ambazo haziwezi kutekelezwa kwa kutumia aina zilizopo"Vikwazo vya uadilifu" vinaweza kutekelezwa kwa kutumia vichochezi. Hata hivyo, aina yoyote ya sheria za "Uadilifu wa Data" zinaweza kupangwa kwa kutumia vichochezi, njia hii tu ni ngumu zaidi na haizai zaidi.

Zaidi ya hayo, kwa ufupi na nje ya mazoea, nitatumia majina ya "Vikwazo vya Uadilifu" katika toleo la Kiingereza (uhusiano na majina ya Kirusi yaliyotajwa hapo juu, kwa maoni yangu, ni dhahiri), na badala ya "Vikwazo vya Uadilifu" I. itaandika Vizuizi kwa urahisi.

Kwa hiyo, KIPEKEEUfunguoKizuizi. Kizuizi hiki kinahitaji kwamba kila thamani katika sehemu ya ufunguo iwe ya kipekee. Wazo la "thamani" hapa linamaanisha thamani fulani, na thamani ya NULL ni ufafanuzi huu haihitimu, kwa hivyo sehemu moja, mbili, au hata sehemu zote katika Kizuizi cha Ufunguo wa KIPEKEE zinaweza kuwa NULL. Hii ni tofauti na kitufe cha PRIMARY Key Constraint, ambayo hairuhusu maadili NULL hata kidogo.

Wakati wa kuunda Vikwazo vya KIPEKEE vya Muhimu au Vikwazo MUHIMU MSINGI, faharasa ya kipekee inaundwa kwa njia isiyo dhahiri kwenye sehemu hizo za jedwali ambapo Kizuizi hiki kinatumika. Walakini, ikiwa faharisi fulani (bila kujali ya kipekee au isiyo ya kipekee) kwenye sehemu muhimu tayari inatumika, basi itatumika badala yake. uumbaji usio wazi mpya. Vikwazo hivi vinapofutwa, faharasa pia zitafutwa. Vikwazo vya Kipekee vilivyoundwa kwa sifa ya DEFERRABLE (tazama hapa chini) hutumia faharasa zisizo za kipekee kila wakati. Vikwazo hivyo vinapoondolewa, faharasa zisizo za kipekee hubakia.

Kizuizi cha Uadilifu cha Marejeleo inahitaji uwepo wa jedwali la mzazi (rejeleo). Kizuizi Muhimu cha KIPEKEE au Ufunguo WA MSINGI Kizuizi. Ikiwa hakuna Kizuizi cha NOT NULL kwenye sehemu yoyote iliyojumuishwa kwenye Kizuizi cha Uadilifu wa Marejeleo, katika sehemu hii.

thamani NULL inaruhusiwa, na Kizuizi kama hicho cha Uadilifu wa Marejeleo kitachukuliwa kuwa sawa.

  • Ikiwa hakuna index kwenye ufunguo wa kigeni. Kisha, wakati ufunguo wa msingi wa jedwali la mzazi umefutwa au kubadilishwa, Oracle itatoa kufuli kwenye jedwali la mtoto kwenye kiwango cha jedwali, ikitoa kufuli hii mara baada ya kuipata. Ikiwa ufunguo wa kigeni utafafanuliwa kama ON DELETE CASCADE , basi kufuta rekodi kutoka kwa jedwali kuu kutasababisha kufuli zisizo za kipekee kwenye jedwali la mtoto. Kufuli iliyoshirikiwa kwenye jedwali zima la mtoto pia itahitajika wakati wa kubadilisha sehemu hizo katika jedwali kuu ambazo zinarejelewa na sehemu katika jedwali la mtoto. Kufuli iliyoshirikiwa ni ya kusoma pekee, kwa hivyo hakuna uwekaji, ufutaji au urekebishaji wa data kwenye jedwali la mtoto utakaopatikana hadi shughuli iliyo kwenye jedwali kuu la mzazi ikamilike.
  • Ikiwa kuna faharasa kwenye ufunguo wa kigeni, basi hakutakuwa tena na kufuli kwenye kiwango cha jedwali, na kwa kufuta au kubadilisha data kwenye jedwali la wazazi, ni rekodi za kibinafsi tu zinazolingana zitafungwa kwenye jedwali la mtoto hadi muamala ufanyike. imekamilika (kufungia kipekee kwa kiwango cha safu).

ANGALIAUadilifuVikwazo. Inaruhusiwa kwenye sehemu ya jedwali moja au zaidi na inahitaji utimilifu wa hali fulani TRUE au HAIJULIKANI kwa kila safu mlalo ya jedwali kama matokeo. Ni vyema kutambua kwamba UJINSI ina maana ... NULL! Kwa maneno mengine, ikiwa kila mahali (angalau kufuata nyaraka sawa za Oracle) thamani ya NULL si sawa na chochote, ikiwa ni pamoja na yenyewe, basi hapa "inafanya kazi" kama TRUE. Inachekesha, sivyo?

Sifa za kipekee:

  • Usemi wa Boolean pekee ndio unaweza kutumika;
  • huwezi kutumia subqueries, kazi za SQL au mlolongo (nashangaa kwa nini?);
  • huwezi kutumia SYSDATE, UID, USE R, USERENV, LEVEL, ROWNUM.

Idadi ya ANGALIA Vikwazo vya Uadilifu haina kikomo, lakini mpangilio wao wa kuzima hautabiriki. Kweli, unapotumia maandishi ya maandishi au vitendaji vya SQL kama vile TO_CHAR, TO_DATE, TO_NUMBER na vigezo vya usaidizi wa utandawazi kama hoja, Oracle hutumia maadili chaguo-msingi ya vigezo hivi katika kiwango cha hifadhidata. Thamani hizi zinaweza kufutwa katika Kizuizi cha Uadilifu cha ANGALIA.

Vikwazo vyote vilivyoorodheshwa vilivyotekelezwa katika Orac le huruhusu ukiukaji wao katika kiwango cha taarifa, yaani, kwanza taarifa itatekelezwa kabisa (hata ikiwa itagusa angalau safu milioni), na kisha ukaguzi wa Vikwazo utaanza. Ingawa, hundi iliyoahirishwa ya Vikwazo inawezekana hadi muamala ukamilike (ambayo inajadiliwa hapa chini).

Hali WEKA VIKWAZO.

Taarifa ya SET CONTRAINTS hufanya Vikwazo AMA VILEVILE au MARA MOJA (VILIVYOAhirishwa na HAPO HAPO virejelee sifa za Vikwazo, vilivyojadiliwa baadaye) kwa sehemu ya muamala. Opereta huyu inaweza kutumika kuweka modi ama kwa orodha ya Vikwazo au Vikwazo vyote (ZOTE). Kitendo cha mwendeshaji huyu kinaisha na kukamilika kwa shughuli ya sasa, au kwa mwanzo wa hatua ya mwendeshaji mwingine sawa. Opereta huyu hapatikani katika vichochezi.

WEKA VIKWAZO ... MARA MOJA kwanza husababisha ukaguzi wa kuwepo kwa Vikwazo vilivyoahirishwa awali, na kisha Vikwazo vinavyosababishwa na utekelezaji wa taarifa katika shughuli ya sasa ya malipo huanzishwa. Ukiukaji wowote wa Vikwazo katika mchakato kama huo utaonyeshwa na kosa, na wakati COMMIT itafikiwa, itaitwa. urejeshaji kamili shughuli ya sasa. Taarifa ya ALTER SESSION pia inaweza kuwa na usemi wa SET CONTRAINTS, lakini kwa Vikwazo vyote pekee (haviwezi kuorodheshwa katika orodha). Hii ni sawa na kutekeleza taarifa ya SET CONSTRAINTS mwanzoni kabisa mwa kila muamala.

Utekelezaji wa VIZUIZI VILIVYOWEKA ... Taarifa ya papo hapo kabla tu ya muamala kukamilika hukuruhusu kubaini mafanikio ya COMMIT inayokuja na epuka kurudisha nyuma zisizo za lazima.

Nchi za Vikwazo.

Unaweza kutumia taarifa za CREATE TABLE au ALTER TABLE ili kuweka hali ya kila Kizuizi cha kiwango cha jedwali kwa kutumia maneno yafuatayo:

  • WASHA hakikisho kwamba pembejeo zote zinakidhi Kikwazo;
  • DISABLE huruhusu data ya ingizo kushindwa kukidhi Kikwazo;
  • VALIDATE inahakikisha kwamba data yote tayari kwenye jedwali inalingana na Kizuizi;
  • NOVALIDATE inaruhusu data iliyo tayari kwenye jedwali kutotimiza Kikwazo;

... na michanganyiko yao:

  • WASHA HALALISHA ni sawa na WASHA na inahakikisha kwamba rekodi zote (zilizowekwa tayari na kuingizwa) zinakidhi Kizuizi;
  • WASHA NOVALIDATE huhakikisha kwamba Kizuizi kimeridhika kwa data yote ya ingizo, lakini data ambayo tayari iko kwenye jedwali inaweza isikidhi Kizuizi;
  • DISABLE NOVALIDATE ni sawa na DISABLE . Utoshelevu wa Vikwazo vya data ya ingizo na zile ambazo tayari zinapatikana kwenye jedwali haujahakikishiwa;
  • LEMAZA VALIDATE huzima Kizuizi, huondoa faharasa ambayo juu yake ilijengwa, na inakataza mabadiliko yoyote kwenye sehemu zilizojumuishwa kwenye Kizuizi.

... na kidogo juu ya huduma za programu:

· usemi WA WEZESHA unamaanisha WASHA HALALISHA ;

· usemi LEMAZA unamaanisha LEMAZA NOVALIDATE ;

· HALALISHA na NOVALIDATE haimaanishi chochote kuhusu WEZESHA na KUZIMA (tuseme tu ni sehemu tegemezi ya usemi wa WEZESHA na KUZIMA );

· uundaji na ufutaji wa fahirisi tayari umetajwa;

· Wakati wa kubadilisha hali kutoka NOVALIDATE hadi VALIDATE, data yote kwenye jedwali inaangaliwa, ambayo inaweza kuchukua muda mrefu sana. Kinyume chake, wakati wa kubadilisha hali ya Vikwazo kutoka VALIDATE hadi NOVALIDATE, ni "imesahau" tu kwamba data zilizopo mara moja zilikutana na Kikwazo;

· kuhamisha kizuizi kimoja kutoka kwa hali ya WESHA NOVALIDATE hadi WESHA HALALISHA hali hakuzuii usomaji, kuandika au shughuli zingine za DDL; zinaweza kufanywa kwa usawa.

Na maelezo muhimu ya mwisho.

  • Wakati wa kuunda Kikwazo, unaweza kubainisha kama sifa ikiwa inawezekana baadaye wakati wa shughuli ya kuweka hundi iliyoahirishwa (DEFERRED) kwa kutumia taarifa ya SET CONSTRAINTS (tazama hapo juu) ya Kizuizi hiki. Chaguo-msingi HAIWEZEKANI (inamaanisha nini, nadhani, iko wazi). Baada ya kuunda Kizuizi, huwezi kubadilisha thamani ya sifa iliyowekwa isipokuwa kwa kuunda tena Kizuizi, kwa hivyo "fikiria mara mbili"!
  • INIT IALLY ni sifa ya ziada ya DEFERRABLE, ambayo inaweza kubatilishwa na taarifa ya SET CONSTRAINT (tena, tazama hapo juu), na ambayo inabainisha tabia chaguo-msingi wakati Vikwazo vinapoanzishwa. kuweka sifa INAYOACHELEWA. Wakati wa kuunda Kikwazo, mpangilio chaguomsingi ni INIT IALLY IMMEDIATE , basi Kizuizi kitaanzishwa kila wakati taarifa tofauti inapotekelezwa; INIT IALLY DEFERRED ikiwekwa, Kizuizi kitaanzishwa hadi mwisho wa kila muamala. NOT DEFERRABLE haihitaji sifa hiyo ya ziada, kwa kuwa ni INIT IALLY IMMEDIATE kwa ufafanuzi.
  • RELY kujieleza. Kwa chaguo-msingi, wakati wa kubadilisha Kikwazo (kwa kutumia ALTER TABLE au MODIFY kizuizi), imewekwa kwa NORELY. Maana yake ni hii: Je, Oracle inapaswa kuzingatia Kizuizi ambacho kiko katika hali ya NOVALIDATE ili kuandika upya hoja? RELY huwasha Kizuizi kilichopo katika hali (hati ya Marejeleo ya SQL hapa hutumia neno "mode", ingawa tayari nimetumiwa. kwa neno "hali" kutoka kwa Dhana, inaonekana iliandikwa watu tofauti, ukisahau kukubaliana na masharti) NOVALIDATE, ambayo itakuruhusu kuandika upya swali ambalo lingeweza kuandikwa upya tu kwa kikwazo cha hali ya VALIDATE. Kama hivyo. Maelezo zaidi wakati ujao.
  • EXCEPTIONS INTO hufafanua taratibu na jedwali ambalo ROWID zinazokiuka Kikwazo zitawekwa wakati hali yake (Kizuizi) inabadilika. Ikiwa hutataja schema na jina la jedwali, itachukuliwa kuwa unataka kutumia jedwali linaloitwa EXCEPTIONS kwenye schema ya sasa.
Ni hayo tu. Kwa leo.

Uadilifu wa data ni utaratibu wa kudumisha uthabiti wa hifadhidata na kikoa. KATIKA mfano wa uhusiano Kuna mahitaji mawili ya msingi ya uadilifu wa data yaliyofafanuliwa:

    uadilifu wa marejeleo

    uadilifu wa mahusiano.

Uadilifu wa mahusiano.

Kitu cha ulimwengu halisi kinawakilishwa katika hifadhidata ya uhusiano kama nakala ya uhusiano fulani. Mahitaji ya uadilifu wa uhusiano ni kama ifuatavyo:

Kila nakala katika uhusiano wowote lazima iwe tofauti na kila nakala nyingine katika uhusiano huo (yaani, uhusiano wowote lazima uwe na ufunguo msingi).

Ni dhahiri kabisa kwamba ikiwa hitaji hili halijafikiwa (yaani, nakala zilizo ndani ya uhusiano sawa sio za kipekee), basi hifadhidata inaweza kuhifadhi habari zinazokinzana kuhusu kitu kimoja. Kudumisha uadilifu wa vyombo huhakikishwa kwa njia ya mfumo wa usimamizi wa hifadhidata (DBMS). Hii inafanywa kwa kutumia vikwazo viwili:

    Wakati wa kuongeza rekodi kwenye jedwali, upekee wa funguo zao msingi huangaliwa

    Kubadilisha thamani za sifa zilizojumuishwa kwenye ufunguo msingi hairuhusiwi.

Unganisha uadilifu

Vitu changamano vya ulimwengu halisi vinawakilishwa katika hifadhidata ya uhusiano kama nakala za mahusiano kadhaa ya kawaida yaliyounganishwa. Ambapo:

    Miunganisho kati ya mahusiano haya yanaelezewa kwa suala la utegemezi wa kazi.

    Ili kuonyesha utegemezi wa utendaji kati ya nakala za mahusiano tofauti, kurudia kwa ufunguo wa msingi wa uhusiano mmoja (mzazi) hadi mwingine (mtoto) hutumiwa. Sifa ambazo ni nakala za funguo za uhusiano wa mzazi huitwa funguo za kigeni.

Kwa kila thamani ya ufunguo wa kigeni inayoonekana katika uhusiano wa mtoto, lazima kuwe na nakala katika uhusiano wa mzazi yenye thamani sawa ya msingi.

Hebu, kwa mfano, ipewe uhusiano IDARA ( N_IDARA, DEPARTMENT_NAME) na MFANYAKAZI ( MFANYAKAZI, N_IDARA, JINA LA MFANYAKAZI), ambayo huhifadhi taarifa kuhusu wafanyakazi wa biashara na idara wanazofanyia kazi. Uhusiano wa IDARA katika jozi hii ni uhusiano wa mzazi, kwa hivyo ufunguo wake mkuu ni "N_idara" aliyepo kwenye uhusiano wa mtoto MFANYAKAZI. Sharti la uadilifu wa marejeleo hapa linamaanisha kuwa jedwali la EMPLOYEE haliwezi kuwa na nakala yenye thamani ya sifa. "N_idara", ambayo haionekani kwenye jedwali la DEPARTMENT. Ikiwa hakuna thamani kama hiyo katika uhusiano wa IDARA, thamani ya ufunguo wa kigeni katika uhusiano wa MFANYAKAZI inachukuliwa kuwa haijafafanuliwa.

Kwa kawaida, kudumisha uadilifu wa marejeleo pia ni jukumu la mfumo wa usimamizi wa hifadhidata.

Zipo mikakati miwili ya msingi ya kudumisha uadilifu wa marejeleo :

    ZUIA - usiruhusu kufanya operesheni, na kusababisha ukiukaji wa uadilifu wa marejeleo. Hii ndiyo zaidi mkakati rahisi, ambayo inahitaji tu kuangalia ikiwa kuna nakala katika uhusiano wa mtoto ambazo zinahusiana na nakala fulani katika uhusiano wa mzazi.

    KESI - kuruhusu utekelezaji wa operesheni inayohitajika, lakini kufanya marekebisho muhimu katika mambo mengine ili kuzuia ukiukwaji wa uadilifu wa kumbukumbu na kuhifadhi miunganisho yote iliyopo. Mabadiliko huanza katika uhusiano wa mzazi na hupitia uhusiano wa mtoto. Kuna ujanja mmoja katika kutekeleza mkakati huu, ambao ni kwamba uhusiano wa mtoto wenyewe unaweza kuwa mzazi wa uhusiano wa tatu. Katika kesi hii, inaweza pia kuwa muhimu kutekeleza mkakati fulani wa unganisho hili, nk. Ikiwa shughuli zozote za kuteleza (kwa kiwango chochote) haziwezi kufanywa, basi ni muhimu kuachana na operesheni ya awali na kurudisha hifadhidata kwa hali yake ya asili. Huu ni mkakati mgumu zaidi, lakini jambo zuri ni kwamba hauvunji uhusiano kati ya nakala za mahusiano ya mzazi na mtoto.

Funguo za msingi na za kigeni

Kwa kuwa uhusiano ni seti, na seti kwa ufafanuzi hazina vipengele vinavyolingana, hakuna nakala mbili za uhusiano zinazoweza kuwa nakala za kila mmoja kwa njia yoyote isiyo ya kawaida. wakati huu wakati. Acha R iwe uhusiano na sifa A1, A2, ..., An. Seti ya sifa K=(Ai, Aj, ..., Ak) ya uhusiano R inasemekana kuwa ufunguo unaowezekana wa R ikiwa tu masharti mawili yanayojitegemea yatatimizwa:

    Upekee: kwa wakati wowote, hakuna nakala mbili tofauti R zenye thamani sawa kwa Ai, Aj, ..., Ak.

    Uchache: hakuna sifa yoyote ya Ai, Aj, ..., Ak inayoweza kutengwa na K bila kukiuka upekee.

Kila uhusiano una angalau ufunguo mmoja unaowezekana kwa sababu angalau mchanganyiko wa sifa zake zote unakidhi hali ya pekee. Moja ya funguo zinazowezekana(iliyochaguliwa kwa nasibu) inachukuliwa kama ufunguo wake wa msingi. Vifunguo vilivyobaki vinavyowezekana, ikiwa vipo, vinaitwa funguo mbadala.

Uhusiano unaweza kuwa na funguo nyingi. Moja ya funguo hutangazwa kila wakati msingi, maadili yake hayawezi kusasishwa. Vifunguo vingine vyote vya uhusiano vinaitwa funguo zinazowezekana.

Vitu anuwai vya kikoa, habari ambayo imehifadhiwa kwenye hifadhidata, huunganishwa kila wakati. Mahusiano kama haya yanaonyeshwa hifadhidata za uhusiano data kwa kutumia funguo za kigeni , kuunganisha mahusiano kadhaa.

Ufafanuzi rasmi.

Acha uhusiano upewe. Tutaita sehemu ndogo ya sifa za uhusiano ufunguo wa kigeni , Kama:

Maoni. Ufunguo wa kigeni, kama ufunguo unaowezekana, unaweza kuwa rahisi au mchanganyiko.

Maoni. Ufunguo wa kigeni lazima ufafanuliwe kwenye vikoa sawa na ufunguo wa msingi unaolingana wa uhusiano wa mzazi.

Maoni. Ufunguo wa kigeni ni kawaida haina mali ya upekee. Hivi ndivyo inavyopaswa kuwa, kwa sababu ... uhusiano wa mtoto unaweza kuwa na nakala nyingi zinazorejelea tupu moja katika uhusiano wa mzazi. Hii, kwa kweli, inatoa aina ya "moja-kwa-wengi" ya uhusiano.

Maoni. Ufunguo wa kigeni hauhitaji kuwa sehemu ya ufunguo fulani wa mgombea.

Dhana zilizo hapo juu na zingine za hisabati zilikuwa msingi wa kinadharia wa uumbaji DBMS ya uhusiano, kutengeneza zana zinazofaa za lugha na mifumo ya programu inayohakikisha utendaji wao wa juu, na kuunda misingi ya nadharia ya muundo wa hifadhidata. Walakini, kwa watumiaji wengi wa DBMS za uhusiano, sawa na zisizo rasmi za dhana hizi zinaweza kutumika kwa mafanikio:

Uhusiano - Jedwali (wakati mwingine Faili), Tuple - Safu (wakati mwingine Rekodi), Sifa - Safu, Shamba.

7. Vikwazo vya Uadilifu

Vikwazo vya uadilifu katika hifadhidata, madhumuni, uadilifu wa kikoa, uadilifu wa chombo, uadilifu wa marejeleo, uadilifu wa kutangaza na kiutaratibu, kushughulikia makosa katika ukiukaji wa uadilifu.

7.1 Vikwazo vya uadilifu ni nini

Vikwazo vya uadilifu vinaweza kufafanuliwa kama njia maalum katika hifadhidata, lengo kuu ambalo ni kuzuia data batili kuingia kwenye hifadhidata (kwa mfano, kuzuia makosa ya mtumiaji wakati wa kuingiza data).

Kwanza, nadharia kidogo.

Vizuizi vyote vya uadilifu vinaweza kugawanywa katika vikundi vitatu vikubwa:

· kategoria ya kwanza - njia za kuhakikisha uadilifu wa kikoa. Wana jukumu la kuhakikisha kuwa uwanja wa hifadhidata unaolingana una maadili halali. Kwa mfano, jina la ukoo, kama sheria, linapaswa kuwa na herufi, na msimbo wa posta- kutoka kwa nambari. Katika hifadhidata, uadilifu kama huo kawaida huhakikishwa na masharti juu ya thamani, marufuku maadili tupu, kuchochea na taratibu zilizohifadhiwa, pamoja na funguo;

· kategoria ya tatu - uadilifu wa rejea, unahakikishwa na mfumo wa funguo za msingi na za kigeni. Kwa mfano, kwa kutumia zana hizi tunaweza kuhakikisha kwamba hatuna maagizo yaliyowekwa kwa wateja ambao hawako kwenye hifadhidata.

Kuna aina mbili kubwa zaidi ambazo njia za kuhakikisha uadilifu zinaweza kugawanywa - njia za asili ya kutangaza na ya kiutaratibu. Njia za kutangaza huundwa kama sehemu za vitu wakati zinafafanuliwa kwenye hifadhidata (kwa mfano, hali ya thamani wakati wa kufafanua jedwali katika hifadhidata). Zana za utaratibu (vichochezi na taratibu zilizohifadhiwa) zinatekelezwa tofauti moduli za programu. Kwa ujumla, vikwazo vya kutangaza havifanyi kazi vizuri lakini vina ufanisi zaidi wa rasilimali na kinyume chake.

Ni lazima kusema kwamba kuwepo kwa mfumo ulioendelezwa wa vikwazo vya uadilifu kwa kiasi kikubwa huamua ukomavu wa database. Kawaida ni rahisi kuhakikisha mara moja kuwa maadili yasiyo sahihi hayaingii kwenye hifadhidata kuliko kuwaondoa kwenye hifadhidata baadaye.

Zaidi ya hayo, wakati wa kuunda vikwazo vya uadilifu, wasanidi lazima wahakikishe kwamba makosa yanayotokea kutokana na ukiukaji wa uadilifu yananaswa na maombi ya mteja.

Mali (C) - uthabiti wa shughuli imedhamiriwa na uwepo wa dhana ya uthabiti wa hifadhidata.

Ufafanuzi 2. Kizuizi cha Uadilifu ni baadhi ya taarifa ambayo inaweza kuwa kweli au uongo kulingana na hali ya hifadhidata.

Ufafanuzi 3. Hifadhidata iko ndani hali thabiti (muhimu). , ikiwa vikwazo vyote vya uadilifu vilivyobainishwa kwa hifadhidata vinatimizwa (imeridhika).

Pamoja na wazo la uadilifu wa hifadhidata huja wazo majibu ya mfumo kwa jaribio la kukiuka uadilifu . Mfumo lazima usiangalie tu ikiwa vikwazo vimekiukwa wakati wa utekelezaji shughuli mbalimbali, lakini pia kujibu ipasavyo ikiwa operesheni inasababisha ukiukaji wa uadilifu. Kuna aina mbili za majibu kwa jaribio la kukiuka uadilifu:

- Kukataa kufanya operesheni "haramu".

Utendaji kufidia Vitendo.

17.3. Uainishaji wa vikwazo vya uadilifu.

Vizuizi vya uadilifu vinaweza kuainishwa kwa njia kadhaa:

  • Kwa njia za utekelezaji.
  • Kwa wakati wa kuangalia.
  • Kwa upeo.

17.3.1. Uainishaji wa vikwazo vya uadilifu kwa mbinu za utekelezaji

Kila mfumo una njia zake za kuunga mkono vikwazo vya uadilifu. Kuna njia mbili za utekelezaji:

  • Usaidizi wa kutangaza kwa vikwazo vya uadilifu.
  • Usaidizi wa kiutaratibu kwa vikwazo vya uadilifu.

Ufafanuzi 4. Usaidizi wa kutangaza kwa vikwazo vya uadilifu inajumuisha kufafanua vikwazo kwa kutumia Lugha ya Ufafanuzi wa Data (DDL). Kwa kawaida, usaidizi wa uadilifu unaobainisha (ikiwa unapatikana katika DBMS) hufafanua vikwazo kwenye thamani za kikoa na sifa, uadilifu wa huluki (funguo zinazowezekana za uhusiano), na uadilifu wa marejeleo (uadilifu wa ufunguo wa kigeni). Vikwazo vya kutangaza uadilifu vinaweza kutumika wakati wa kuunda na kurekebisha majedwali kwa kutumia DDL au kama taarifa tofauti (ASSERTION).

Ufafanuzi wa 5. Usaidizi wa kiutaratibu kwa vikwazo vya uadilifu ni kutumia vichochezi na taratibu zilizohifadhiwa.

Sio vikwazo vyote vya uadilifu vinaweza kutekelezwa kwa kutangaza. Kimsingi, uwepo wa kizuizi cha uadilifu (ya kutangaza na ya kiutaratibu) Kila mara hupelekea kuundwa au matumizi ya baadhi msimbo wa programu, kutekeleza kizuizi hiki. Tofauti iko katika mahali ambapo nambari kama hiyo imehifadhiwa na jinsi inavyoundwa.

17.3.2. Uainishaji wa vikwazo vya uadilifu kwa muda wa uthibitishaji.

Kulingana na wakati wa kuangalia, vikwazo vimegawanywa katika:

  • Vikwazo vinavyoweza kuthibitishwa mara moja.
  • Vikwazo vilivyo na ukaguzi ulioahirishwa.

Ufafanuzi 6. Vikwazo vinavyoweza kukaguliwa mara moja huangaliwa mara moja wakati wa utekelezaji wa operesheni ambayo inaweza kukiuka kikwazo. Kwa mfano, upekee wa ufunguo wa mgombea huangaliwa wakati rekodi inapoingizwa kwenye jedwali. Ikiwa kizuizi kinakiukwa, basi operesheni inakataliwa. Shughuli ambayo dai la uadilifu linaloweza kuthibitishwa mara moja limekiukwa kwa kawaida hurejeshwa.



Ufafanuzi 7. Vikwazo vya kuangalia vilivyoahirishwa inaangaliwa wakati shughuli inafanywa na taarifa ya COMMIT WORK. Ndani ya muamala, kikwazo kinaweza kutoridhika. Ikiwa ukiukaji wa kizuizi cha hundi iliyoahirishwa hugunduliwa wakati muamala unafanywa, shughuli hiyo inarejeshwa.

17.3.3. Uainishaji wa vikwazo vya uadilifu kwa upeo.

Kwa upeo, vikwazo vimegawanywa katika:

  • Vizuizi vya kikoa
  • Vizuizi vya sifa
  • Vikwazo vya Tuple
  • Mapungufu ya uhusiano
  • Mapungufu ya Hifadhidata

17.3.3.1. Vizuizi vya kikoa.

Ufafanuzi 8. Vikwazo vya Uadilifu vya Kikoa kuwakilisha vikwazo vinavyotumika tu kwa thamani halali za kikoa. Kwa kweli, vikwazo vya kikoa lazima viwe sehemu ya ufafanuzi wa kikoa.

Kuangalia kizuizi. Vizuizi vya kikoa vyenyewe havijaangaliwa. Ikiwa sifa inategemea kikoa, basi kizuizi kwenye kikoa kinacholingana kinakuwa kikwazo kwa sifa hiyo.

17.3.3.2. Vizuizi vya sifa.

Ufafanuzi 9. Kizuizi cha uadilifu cha sifa inawakilisha vizuizi vilivyowekwa kwa thamani zinazoruhusiwa za sifa kwa sababu ya sifa kulingana na kikoa. Vizuizi vya sifa ni sawa kabisa na vizuizi vya kikoa kinacholingana. Tofauti kati ya vikwazo vya sifa na vikwazo vya kikoa ni vikwazo vya sifa zinakaguliwa.

Kuangalia kizuizi. Kizuizi cha sifa ni mara moja kuthibitishwa kizuizi. Hakika, kizuizi cha sifa haitegemei vitu vingine vya hifadhidata isipokuwa kikoa ambacho sifa hiyo imejikita. Kwa hiyo, hakuna mabadiliko kwa vitu vingine yanaweza kuathiri ukweli wa kizuizi.

17.3.3.3. Vikwazo vya tuple.

Ufafanuzi 10. Vizuizi vya Uadilifu vya Tuple inawakilisha vikwazo vilivyowekwa kwa maadili yanayoruhusiwa tofauti tuple ya uhusiano, na kutokuwa kizuizi cha uadilifu cha sifa. Mahitaji ambayo kizuizi kinatumika tofauti relation tuple inamaanisha kuwa kuiangalia haihitajiki hakuna habari kuhusu nakala zingine kwenye uhusiano.

Kuangalia kizuizi. Kufikia wakati kizuizi cha tuple kinakaguliwa, vizuizi vya uadilifu vya sifa zilizojumuishwa kwenye nakala hiyo lazima vikaguliwe.

Kizuizi cha tuple ni mara moja kuthibitishwa kizuizi. Hakika, kizuizi cha nakala haitegemei vitu vingine vya hifadhidata isipokuwa sifa ambazo ni sehemu ya nakala. Kwa hiyo, hakuna mabadiliko kwa vitu vingine yanaweza kuathiri ukweli wa kizuizi.

17.3.3.4. Mapungufu ya mtazamo.

Ufafanuzi 11. Vikwazo vya Uadilifu wa Mahusiano kuwakilisha vikwazo vilivyowekwa tu kwa maadili yanayoruhusiwa tofauti mahusiano, na kutokuwa kizuizi cha uadilifu tuple. Sharti kwamba kizuizi kiwe maalum kwa uhusiano mmoja inamaanisha kuwa uthibitishaji wake hauhitaji habari kuhusu mahusiano mengine (ikiwa ni pamoja na marejeleo). kwa ufunguo wa kigeni kwa tuples sawa uhusiano).

Kuangalia kizuizi. Kufikia wakati kizuizi cha uhusiano kinakaguliwa, vizuizi vya uadilifu vya nakala za uhusiano lazima vikaguliwe.

Kizuizi cha uhusiano kinaweza kuwa kama mara moja kuthibitishwa na hundi iliyoahirishwa.

Kizuizi cha uhusiano ambacho ni kizuizi kikuu cha mgombea ni kikwazo kinachoweza kuthibitishwa mara moja.

Kizuizi cha upatikanaji utegemezi wa kazi sifa pia ni kizuizi kinachoweza kukaguliwa mara moja.

Vizuizi vilivyoainishwa utegemezi wa thamani nyingi au vitegemezi vya muunganisho ni vizuizi vya kukagua vilivyoahirishwa. Hakika, vikwazo hivi vinahitaji kwamba tuples kuingizwa na kuondolewa vikundi vizima. Hili haliwezi kufanywa kwa kuangalia baada ya kila kichocheo kimoja au kufuta.

17.3.3.5. Mapungufu ya hifadhidata.

Ufafanuzi 12. Vikomo vya Uadilifu wa Hifadhidata kuwakilisha vizuizi vilivyowekwa kwa maadili ya mahusiano mawili au zaidi yaliyounganishwa (pamoja na uhusiano ambao unaweza kuhusishwa na yenyewe).

Kuangalia kizuizi. Kufikia wakati kizuizi cha hifadhidata kinakaguliwa, vizuizi vya uadilifu wa uhusiano lazima vikaguliwe.

Kikomo cha hifadhidata kinaweza kuwa kama mara moja kuthibitishwa kizuizi na kizuizi na hundi iliyoahirishwa.

Kizuizi cha uhusiano ambacho ni kikwazo cha ufunguo wa kigeni kinaweza kuwa kikwazo kilichothibitishwa mara moja au kikwazo kilichoahirishwa.

Vikomo vya Uadilifu wa Data hukuruhusu kuongeza mahitaji kwao ambayo ni ya ziada kwa kufuata aina. Vizuizi vya uadilifu vilivyotangazwa (vya mpangilio, rasmi, "tangazo") vimeandikwa ("vinatangazwa") katika mfumo wa masharti ambayo lazima yatimizwe. wazi kama vile, katika kiwango cha schema ya data, na hii inatofautiana na sheria za uadilifu zilizoundwa kwa njia ya ukaguzi uliopangwa (tazama hapa chini). Kwa hiyo, vinginevyo vikwazo vile vinaweza kuitwa "wazi". Neno asilia lina jina kamili "vizuizi vya data vya uadilifu" - "vikwazo kwa maadili ya data yaliyowekwa kwa zaidi. uhasibu sahihi mazingira eneo la somo ", lakini mara nyingi hufupishwa kuwa "vizuizi vya uadilifu" au hata "vikwazo" tu. Neno "uadilifu" ni vigumu kueleweka vyema kwa wingi wa watengenezaji.

Dhana yenyewe ya vikwazo vya uadilifu vilivyotangazwa katika SQL ilirithiwa kutoka kwa modeli ya uhusiano na ikawa ngumu zaidi kadiri kiwango kilivyokuzwa. Katika Oracle, nomenclature ya vizuizi vya uadilifu kwa ujumla inalingana na SQL -92 (ingawa wigo wa utekelezaji haujafikiwa), lakini haijaletwa kwa kiwango cha SQL:1999. Kwa hivyo, Oracle haikuruhusu kuanza kizuizi cha uadilifu katika kiwango cha hifadhidata (kwa kutumia neno la huduma ASSERTION ) na ni mdogo sana katika kuunda hali ya kuangalia maadili na muundo wa CHECK kwa kuwa hairuhusu ufikiaji wa data ya hifadhidata.

Neno ASSERTION kutoka kiwango cha SQL linapendekeza vikwazo vingine vya uadilifu vya tafsiri (na kuelewa) kama "vikwazo dhabiti vya uadilifu".

Vikwazo vya uadilifu vilivyotangazwa katika Oracle vinaweza kuwekwa katika viwango vifuatavyo:

  • shamba la safu tofauti kwenye meza;
  • mstari tofauti;
  • jozi za meza.

Kuangalia kwa kufuata vizuizi vya uadilifu vilivyotangazwa hivi sasa hufanywa na DBMS kiatomati na kila wakati, bila kujali chanzo cha mabadiliko, ambayo inahakikisha utii wao, tofauti na, sema, ukaguzi wa maadili ya pembejeo yaliyofanywa na programu za maombi ya mteja.

Oracle hukuruhusu kuunda vizuizi kama hivyo wakati wa kuunda jedwali na amri ya CREATE TABLE, na kwa meza zilizopo zinaweza kuongezwa na kughairiwa kwa amri zifuatazo:

  • ALTER TABLE ... READILISHA - kuongeza vikwazo vya aina zote na kuondoa kizuizi NOT NULL;
  • ALTER TABLE ... ADD/DROP - kuongeza na kuondoa vikwazo vya aina zote, isipokuwa NOT NULL .

Oracle inatoa majina kwa vizuizi vyote vya uadilifu vilivyoundwa kwenye schema. Ikiwa unatumia jina la CONSTRAINT kujenga wakati wa kuunda kizuizi, kizuizi kitapokea jina kutoka kwa programu, vinginevyo DBMS itaunda jina kwa hiari yake. Taarifa kuhusu kila mmoja kizuizi kilichopo inaweza kupatikana katika jedwali la kamusi ya marejeleo la USER_CONSTRAINTS kwa jina lake. Jina la kizuizi lisilofanikiwa linaweza kubadilishwa; Kwa mfano:

ALTER TABLE projx RENAME RENAME CONSTRAINT sys_c0011509 TO name_is_needed;

Aina za vikwazo vya uadilifu vilivyotangazwa

SI kikwazo NULL

Kizuizi cha NOT NULL kinahitaji safu au kikundi cha safuwima kuwa na thamani kila wakati (ikiwa ni kikundi, basi katika angalau sehemu moja). Sharti la kwamba safu isiwe tupu ni ya kuhitajika sana, kwani humwondolea mpanga programu kutoka kwa wasiwasi mwingi unaohusishwa na upekee wa kushughulikia NULL. Kwa bahati mbaya, mahitaji ya kikoa na baadhi ya vitendo vya SQL (kwa mfano, GROUP BY ROLLUP ...) hairuhusu kuondoa kabisa safu wima na sifa ya NULL.

Hiki ndicho kikwazo pekee cha uadilifu ambacho kimehifadhiwa sio tu katika jedwali la USER_CONSTRAINTS, lakini pia katika jedwali la USER_TAB_COLUMNS kama sifa ya safu wima. (Wakati mmoja, kipengele cha NULL/NOT NULL kilizingatiwa rasmi kama sifa ya safu, si kizuizi cha uadilifu.) Kwa sababu hii, kuongezwa na kuondolewa kwa kizuizi hiki ni rasmi kulingana na sheria za kubadilisha mali ya safu, tu kupitia neno kuu BADILISHA:

ALTER TABLE proj kurekebisha (bajeti SIYO BATILI); -- kuunda kizuizi na jina la mfumo; mabano ni ya hiari ALTER TABLE proj MODIFY (bajeti NULL); -- kukomesha vikwazo; mabano ni ya hiari ALTER TABLE proj MODIFY (CONSTRAINT ya bajeti ni_lazima SIO BATILI); -- kuunda kikwazo kwa jina lililotajwa na programu

KATIKA matoleo ya kisasa Kizuizi huru cha Oracle NOT NULL kitarasimishwa kitaalamu kama kikwazo CHECK na hali ya kuangalia: bajeti HAINA BATILI na wakati huo huo itawekwa katika USER_CONSTRAINTS kwa thamani NULLABLE = "Y" . Sifa ya NOT NULL inayotokana na kanuni ya ufunguo msingi itaonyeshwa tu katika USER_CONSTRAINTS .

Funguo za Msingi

Safu wima zilizoteuliwa kuwa ufunguo msingi zinahitajika ziwe na thamani katika sehemu za safu mlalo zote ambazo ni za kipekee na zipo kila wakati (kwa ufunguo wa safu wima nyingi, angalau sehemu moja lazima iwe na thamani). Mifano ya kuunda na kufuta:

ALTER TABLE proj ONGEZA UFUNGUO MSINGI (projno, pname); -- tengeneza kikwazo (ufunguo msingi kulingana na safu wima mbili) kwa jina la mfumo ALTER TABLE proj DROP PRIMARY KEY; -- kuondoa kikwazo ALTER TABLE proj ADD CONSTRAINT pk_proj PRIMARY KEY (projno); -- kuunda kikwazo kwa jina lililotajwa na programu

Thamani katika sehemu za msingi lazima ziwepo kila wakati.

Baadhi ya aina za safu haziruhusiwi kabla ya kuunda ufunguo msingi (kwa mfano, LOB au TIMESTAMP ILIYO NA ENEO LA SAA).

Upekee wa maadili katika safu wima

Safu wima ambazo zimeteuliwa kuwa za kipekee zinahitajika ili thamani ziwe za kipekee katika sehemu zake kwenye safu mlalo zote. Upekee katika SQL uko karibu zaidi na dhana ya "mbadala", "mgombea" au "ufunguo" tu katika muundo wa uhusiano.

Mfano wa Uumbaji:

ALTER TABLE proj ADD UNIQUE (jina la jina);

Kumbuka kuwa safu wima ya PNAME hairuhusu thamani zinazokosekana. Kulingana na kiwango cha SQL, upekee unafuatiliwa inapatikana maadili ya safu. Ikiwa kwa kuongeza unaweka kizuizi kwenye safu kama hiyo

ALTER TABLE proj modIFY (jina SI TUPU);

itaweza kucheza nafasi ya ufunguo katika modeli ya uhusiano na kutangazwa kuwa ya msingi (kwa kubadilisha vikwazo viwili: UNIQUE na NOT NULL na UFUNGUO mmoja WA MSINGI ). Ikiwa kikundi cha safuwima kinatangazwa kuwa cha kipekee, kipe sifa za ufunguo kwa kutumia SQL ngumu zaidi (mahitaji ya angalau thamani moja katika kundi la kipekee yanaweza kuhitajika na kizuizi cha fomu CHECK ).

Tofauti nyingine kati ya kizuizi cha upekee na ufunguo wa msingi ni kwamba kadhaa ya zamani inaweza kutengenezwa kwenye jedwali, wakati ya mwisho iko kwenye umoja tu. Oracle haizuii tamko la umoja sio tu kwa vikundi vilivyotengana vya safu wima, lakini hata kwa nakala mbili. Mlolongo wa amri zifuatazo Sivyo itasababisha makosa:

JEDWALI Alter t ONGEZA KIZUIZI xx KIPEKEE (a, b); -- Hitilafu!

Funguo za kigeni

Safu wima zimetangazwa ufunguo wa kigeni, wanatakiwa (a) kurejelea safu wima za aina moja kutoka kwa jedwali lingine au jedwali lile lile, mradi tu marudio ni ufunguo msingi au kundi la kipekee la safu wima, na (b) kukubali tu thamani ambazo zipo kwa sasa katika safu wima lengwa. Mfano wa Uumbaji:

ALTER TABLE proj ADD (ldept NUMBER (2)) ; ALTER TABLE proj ONGEZA UFUNGUO WA KIGENI (ldept) idara ya MAREJELEO (deptno) ;

Kulingana na sheria muhimu za kigeni katika safu ya LDEPT Sivyo maadili kukosa ni marufuku. Kiwango cha SQL kinahitaji DBMS kuangalia ufuasi wa maadili katika safu wima lengwa za jedwali pekee. inapatikana maadili muhimu ya kigeni; kwa maneno mengine, thamani katika sehemu muhimu za kigeni zinaweza kukosa.

Vifunguo kadhaa vya kigeni vinaweza kufafanuliwa kwenye jedwali. Kwa mfano, katika uundaji wa uangalifu zaidi wa mfano wa idara ya mfanyakazi, pamoja na ufunguo wa kigeni uliopo wa DEPTNO wa jedwali la EMP, safu wima ya JOB inaweza kutangazwa kuwa ufunguo wa kigeni, na kuifanya kurejelea jedwali tofauti lenye maelezo ya kazi.