国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      在數(shù)據(jù)庫(kù)系統(tǒng)中強(qiáng)化實(shí)施參照約束的制作方法

      文檔序號(hào):6405919閱讀:296來(lái)源:國(guó)知局
      專(zhuān)利名稱(chēng):在數(shù)據(jù)庫(kù)系統(tǒng)中強(qiáng)化實(shí)施參照約束的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明總體上講涉及數(shù)字計(jì)算機(jī)的數(shù)據(jù)庫(kù)系統(tǒng),特別是涉及一種在數(shù)據(jù)庫(kù)改變時(shí)強(qiáng)化實(shí)施參照約束的系統(tǒng)和方法。
      為了提高數(shù)字計(jì)算機(jī)系統(tǒng)中數(shù)據(jù)庫(kù)的存取速度,包括數(shù)據(jù)庫(kù)存取指令的源文件可以編譯為存取方案。這種存取方案包括低級(jí)過(guò)程語(yǔ)句,以便有效地存取數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)管理程序運(yùn)行期間不是解釋數(shù)據(jù)庫(kù)存取指令,而是執(zhí)行存取方案,以改善系統(tǒng)性能。
      為了保持?jǐn)?shù)據(jù)庫(kù)的參照完整性,當(dāng)更新數(shù)據(jù)庫(kù)時(shí),必須滿(mǎn)足眾多的約束條件。參照完整性是指整個(gè)數(shù)據(jù)庫(kù)中的一種一致性狀態(tài)。參照完整性是通過(guò)對(duì)數(shù)據(jù)庫(kù)的所有變化進(jìn)行檢驗(yàn)以確保這些變化滿(mǎn)足一致性的要求而實(shí)施的。
      在現(xiàn)行的系統(tǒng)中,當(dāng)數(shù)據(jù)庫(kù)中的一張表發(fā)生變化時(shí),就要確定與這種變化有關(guān)的所有的約束。受這些約束影響的其它表被識(shí)別,并且執(zhí)行程序去完成必要的一致性檢驗(yàn)。確定有關(guān)的一致性檢驗(yàn)及識(shí)別包含的表所用的時(shí)間是值得注意的,它降低了整個(gè)系統(tǒng)的性能。
      這就希望在數(shù)據(jù)庫(kù)系統(tǒng)中提供一種系統(tǒng)和方法,當(dāng)數(shù)據(jù)庫(kù)發(fā)生變化時(shí),能夠最大限度地減少完成一致性檢驗(yàn)的時(shí)間。
      因此,本發(fā)明的一個(gè)目的是提供一種當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)更新時(shí)用于完成一致性檢驗(yàn)的系統(tǒng)和方法。
      本發(fā)明的另一個(gè)目的是提供的這種系統(tǒng)和方法,能最大限度地減少一致性檢驗(yàn)所需的時(shí)間。
      本發(fā)明還有一個(gè)目的是提供的這種系統(tǒng)和方法能實(shí)現(xiàn)數(shù)據(jù)庫(kù)系統(tǒng)的參照完整性。
      因此根據(jù)本發(fā)明的一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中強(qiáng)化實(shí)現(xiàn)參照完整性的系統(tǒng)和方法,能夠在存取方案的編譯期間確定有關(guān)的參照約束。當(dāng)取存方案產(chǎn)生時(shí),與數(shù)據(jù)庫(kù)的數(shù)據(jù)變化有關(guān)的全部參照約束被標(biāo)識(shí)。完成參照約束檢驗(yàn)所必需的代碼在編譯期間被直接插入存取方案,消除了運(yùn)行時(shí)確定有關(guān)約束的必要性?;旧峡梢圆捎门c已經(jīng)用于實(shí)行數(shù)據(jù)庫(kù)存取的存取方案中的低級(jí)過(guò)程語(yǔ)句相同的語(yǔ)言來(lái)完成約束檢驗(yàn)。
      本發(fā)明新穎的有效特征在所附的權(quán)利要求書(shū)中提出。然而本發(fā)明自身,及其最佳應(yīng)用方式、進(jìn)一步的目的和優(yōu)點(diǎn),將通過(guò)參照以下結(jié)合附圖對(duì)實(shí)施例所做的詳細(xì)描述,獲得最好的理解,其中

      圖1是說(shuō)明一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的高層框圖;
      圖2是一個(gè)存取部分的框圖;
      圖3是說(shuō)明存取方案的編譯過(guò)程的流程圖;
      圖4至圖11說(shuō)明為了完成約束檢驗(yàn)而將低級(jí)代碼語(yǔ)句插入存取部分的情況;以及圖12是一張流程圖,說(shuō)明在自參照表中進(jìn)行刪除,以級(jí)聯(lián)刪除規(guī)則強(qiáng)化實(shí)施參照約束時(shí),插入存取方案的低級(jí)代碼的功能。
      定義一些在以下描述中使用的重要詞匯和概念,對(duì)理解本發(fā)明是有幫助的。
      主關(guān)鍵詞是表中的一組列,必須包含獨(dú)有的非空值,一張表不能多于一個(gè)主關(guān)鍵詞。外來(lái)關(guān)鍵詞是表中的一組列,它的值需要與一張表的主關(guān)鍵詞的值匹配。參照約束是一種必要的條件,指明的外來(lái)關(guān)鍵詞的非空值只有當(dāng)它們也作為指明的表的主關(guān)鍵詞的值出現(xiàn)時(shí),才是有效的。如果它的任何部分是空的話(huà),外關(guān)鍵詞的值是空的。由參照約束限定的關(guān)系是單張表或兩張不同的表的行之間由一個(gè)主關(guān)鍵詞和一個(gè)外來(lái)關(guān)鍵詞的值確定的一組連接。
      雙親表是在聯(lián)系中包含主關(guān)鍵詞的表。一張表可以是任何數(shù)目的聯(lián)系中的雙親表。從屬表是在聯(lián)系中包含外來(lái)關(guān)鍵詞的表一張表可以是任何數(shù)目的聯(lián)系的從屬表。一張表既可以是雙親表,又可以是從屬表。
      從屬行是從屬表中的行,該表的外來(lái)關(guān)鍵詞的值與雙親表的主關(guān)鍵詞的值相匹配。外來(lái)關(guān)鍵詞的值這樣便代表了自從屬行至雙親行的一個(gè)參照。雙親行是雙親表的行,該行至少有一行從屬行。
      刪除規(guī)則與每個(gè)參照約束相關(guān)。刪除規(guī)則能限制(防止)刪除雙親行,或指定刪除從屬行的作用。其作用可以是刪除從屬行(級(jí)聯(lián)刪除),或?qū)膶傩兄械耐鈦?lái)關(guān)鍵詞置空值。
      更新規(guī)則也與每個(gè)參照約束相關(guān)。使用更新規(guī)則的一個(gè)途徑是限制更新雙親行中的主關(guān)鍵詞。另一個(gè)途徑是指定更新從屬行的作用,以致于使例如級(jí)聯(lián)更新成為可能。
      每次改變數(shù)據(jù)庫(kù),必須滿(mǎn)足全部有關(guān)的參照約束。如果任何一項(xiàng)不滿(mǎn)足,就不允許改變數(shù)據(jù)庫(kù)。對(duì)外來(lái)關(guān)鍵詞強(qiáng)化實(shí)施以下規(guī)則,能保證數(shù)據(jù)庫(kù)的參照完整性。
      插入規(guī)則當(dāng)在一張從屬表中插入一行時(shí),被插入行中每個(gè)非空外來(lái)關(guān)鍵詞的值必須與相關(guān)的雙親表中主關(guān)鍵詞的某一值相匹配。如果任何參照約束被插入操作所破壞,那么就會(huì)出現(xiàn)錯(cuò)誤,并且沒(méi)有行被插入。
      刪除規(guī)則當(dāng)從一張雙親表中刪除一行時(shí),進(jìn)行檢驗(yàn)以確定在從屬表中是否還有從屬行。從屬行是具有外來(lái)關(guān)鍵詞的行,其值與將要?jiǎng)h除的行的主關(guān)鍵詞匹配。如果發(fā)現(xiàn)任何從屬行,便由刪除規(guī)則規(guī)定所采取的行動(dòng),該刪除規(guī)則是對(duì)從屬表中的外來(lái)關(guān)鍵詞規(guī)定的。
      可以對(duì)一個(gè)外來(lái)關(guān)鍵詞規(guī)定三種刪除規(guī)則。如果規(guī)則是RESTRICT(限制),如果發(fā)現(xiàn)任何從屬行,就會(huì)出現(xiàn)錯(cuò)誤,并且沒(méi)有行被刪除。如果刪除規(guī)則是CASCADE(級(jí)聯(lián)),刪除從屬表中的任何從屬行,對(duì)從屬表中被刪除行的任何其它參照約束也必須得到滿(mǎn)足,否則就會(huì)出現(xiàn)錯(cuò)誤,并且沒(méi)有行被刪除。如果刪除規(guī)則是SET NULL(置空值),如果在從屬表中發(fā)現(xiàn)任何從屬行,那么外來(lái)關(guān)鍵詞的所有可置空值的部分都置空值。
      更新規(guī)則當(dāng)在一張雙親表中更新一行時(shí),進(jìn)行檢驗(yàn)以確定在從屬表中是否還有從屬行。從屬行是具有外來(lái)關(guān)鍵詞的行,其值與將要更新的行的主關(guān)鍵詞匹配。如果發(fā)現(xiàn)任何從屬行,便由更新規(guī)則規(guī)定所采取的行動(dòng),該更新規(guī)則是對(duì)從屬表中的外來(lái)關(guān)鍵詞指定的。
      可以對(duì)一個(gè)外來(lái)關(guān)鍵詞規(guī)定三種更新規(guī)則。如果規(guī)則是RESTRICT(限制),如果發(fā)現(xiàn)任何從屬行,就會(huì)出現(xiàn)錯(cuò)誤,并且沒(méi)有行被更新。如果更新規(guī)則是CASCADE(級(jí)聯(lián)),對(duì)從屬表的任何從屬行中的外來(lái)關(guān)鍵詞進(jìn)行更新,使其成為對(duì)應(yīng)的主關(guān)鍵詞部分。對(duì)從屬表中被更新行的任何其它參照約束也必須得到滿(mǎn)足,否則就會(huì)出現(xiàn)錯(cuò)誤,并且沒(méi)有行被更新。如果更新規(guī)則是SET NULL(置空值),如果在從屬表中發(fā)現(xiàn)任何從屬行,那么外來(lái)關(guān)鍵詞的所有可置空值的部分都置空值。
      更新外來(lái)關(guān)鍵詞規(guī)則當(dāng)在一張從屬表中更新一個(gè)外來(lái)關(guān)鍵詞時(shí),如果外來(lái)關(guān)鍵詞不是空值,它的新值必須與相關(guān)的雙親表中主關(guān)鍵詞的某一值相匹配。如果任何參照約束被更新操作所破壞,那么就會(huì)出現(xiàn)錯(cuò)誤,并且沒(méi)有行被更新。
      參照?qǐng)D1,數(shù)據(jù)庫(kù)10是由數(shù)據(jù)庫(kù)管理程序12存取的。為了對(duì)數(shù)據(jù)庫(kù)10進(jìn)行存取,由應(yīng)用程序(未示出)調(diào)用數(shù)據(jù)庫(kù)管理程序12。除了通過(guò)數(shù)據(jù)庫(kù)管理程序12,不允許對(duì)數(shù)據(jù)庫(kù)10進(jìn)行存取。
      當(dāng)應(yīng)用程序調(diào)用數(shù)據(jù)庫(kù)管理程序12時(shí),它還接下來(lái)調(diào)用存取方案14去完成所要求的數(shù)據(jù)庫(kù)存取。存取方案14包括低級(jí)的經(jīng)過(guò)解釋的碼,該碼是從一種較高級(jí)的數(shù)據(jù)庫(kù)存取語(yǔ)言如SQL或類(lèi)似語(yǔ)言經(jīng)編譯得到的。存取方案14包括多個(gè)存取部分16、18、20、22、24、26和28。存取部分16~28中的每一個(gè)基本上都對(duì)應(yīng)SQL中的一種源級(jí)語(yǔ)句,或?qū)?yīng)一種類(lèi)似的高級(jí)數(shù)據(jù)庫(kù)存取語(yǔ)言。
      存取方案14作為包括在數(shù)據(jù)庫(kù)10中的一個(gè)客體而存在。數(shù)據(jù)庫(kù)10中還包括許多其它的數(shù)據(jù)庫(kù)客體30、32、34、36、38、40和42。各種類(lèi)型的數(shù)據(jù)庫(kù)客體30~42可以與本發(fā)明最相關(guān)的數(shù)據(jù)表一起存在。
      對(duì)應(yīng)于SQL語(yǔ)句的每一存取部分16~28對(duì)數(shù)據(jù)庫(kù)10中的一張或多張表30~42進(jìn)行存取。取決于編譯進(jìn)每個(gè)存取部分的語(yǔ)句的性質(zhì),這些表中的數(shù)據(jù)可以被讀出或改變,或者表中的行可以被插入或刪除。如圖1所示,存取部分可以訪(fǎng)問(wèn)不止一張表,并且許多不同的存取部分可以訪(fǎng)問(wèn)一張單個(gè)的表。表可以被許多不同的存取方案中的存取部分訪(fǎng)問(wèn)。例如,存取部分16、18、22和24都訪(fǎng)問(wèn)表32。存取部分26僅訪(fǎng)問(wèn)表36,而存取部分28訪(fǎng)問(wèn)表36、38和40。
      圖2表示一個(gè)典型的存取部分的結(jié)構(gòu)。主線(xiàn)索50是低級(jí)代碼的線(xiàn)索或塊,用以完成SQL由存取部分代表的語(yǔ)句的功能,主線(xiàn)索50包括指向表客體52(TAOB)和插入/更新/刪除客體54(IUDO)的指針。表客體是一個(gè)控制塊,包括為在數(shù)據(jù)庫(kù)中存取一張表所必須的全部信息。IUDO是一個(gè)控制塊,包括對(duì)一張表進(jìn)行插入、更新或刪除所需要的全部信息和過(guò)程。并不是所有的主線(xiàn)索50都包括指向客體52和54的指針。只有那些執(zhí)行操作需要的指針才被包括進(jìn)去。
      TAOB52包括為在數(shù)據(jù)庫(kù)中對(duì)一張表定位所需的所有標(biāo)識(shí)符。此外,出現(xiàn)在最初的SQL語(yǔ)句中的謂詞被包括進(jìn)TAOB52之中。這些謂詞由表存取操作碼使用,用來(lái)選擇滿(mǎn)足存取操作碼規(guī)定的標(biāo)準(zhǔn)的表的行,并且這些謂詞在SQL語(yǔ)句的WHERE子句中被找到。這些謂詞典型地包括關(guān)系運(yùn)算符,例如大于或小于,以及產(chǎn)生一個(gè)“真”或“偽”的結(jié)果。
      IUDO54包括指向任何數(shù)據(jù)值56的指針,這些數(shù)據(jù)值對(duì)執(zhí)行由主線(xiàn)索50所規(guī)定的操作來(lái)說(shuō)是必需的。這些數(shù)據(jù)值包括例如出現(xiàn)在最初的SQL語(yǔ)句中的數(shù)值常量及字符常量。IUDO54還包括指向子線(xiàn)索58(S1)、60(S2)和62(S3)的指針。與主線(xiàn)索50相類(lèi)似,子線(xiàn)索58、60和62也是低級(jí)代碼的塊。子線(xiàn)索可以包括用來(lái)對(duì)各種不同的數(shù)值和字符表達(dá)式進(jìn)行求值和處理的代碼。為了保持?jǐn)?shù)據(jù)庫(kù)參照完整性,還包括那些能完成所有必要的、為主線(xiàn)索50所代表的語(yǔ)句所需的約束檢驗(yàn)的子線(xiàn)索。子線(xiàn)索58、60和62在完成執(zhí)行主線(xiàn)索50的操作之前被執(zhí)行,只有當(dāng)由必需的子線(xiàn)返回的值達(dá)到被主線(xiàn)索50中的操作碼所期望的適當(dāng)值時(shí),主線(xiàn)索50中的操作碼才全部執(zhí)行,指出操作不會(huì)破壞所需的參照完整性。
      如同主線(xiàn)索50可以具有相關(guān)的TAOB52和IUDO54一樣,子線(xiàn)索58、60和62也包括指向表客體、或許還包括向插入入/更新/刪除客體的指針。例如,圖2中子線(xiàn)索58包括指向TAOB64的指針,而子線(xiàn)索60包括指向TAOB66的指針。子線(xiàn)索58和60都不包括指向IUDO的指針。在本例中,子線(xiàn)索62既包括指向TAOB68的指針,又包括指向IUDO70的指針。
      如前所述,子線(xiàn)索包括在IUDO54之下,它們對(duì)于完成所有約束檢驗(yàn)來(lái)說(shuō)是必要的,這些約束檢驗(yàn)對(duì)于執(zhí)行主線(xiàn)索50時(shí)強(qiáng)制實(shí)施數(shù)據(jù)庫(kù)關(guān)聯(lián)完整性是需要的。在編譯存取方案時(shí)確定所有必要的約束檢驗(yàn),并且適合的子線(xiàn)索由編譯程序插入。該進(jìn)程示于圖3中。
      用于編譯SQL的源文件語(yǔ)句,或其它類(lèi)似的高級(jí)數(shù)據(jù)庫(kù)存取語(yǔ)言語(yǔ)句的最佳方法,開(kāi)始于編譯程序讀出一條SQL語(yǔ)句80。如果編譯程序已經(jīng)到達(dá)源文件的結(jié)尾82,則編譯過(guò)程完成。如果沒(méi)有到達(dá)源文件的結(jié)尾82,則在84產(chǎn)生那條語(yǔ)句的主線(xiàn)索。
      一些語(yǔ)句,如SELECT(選擇)語(yǔ)句,不需要進(jìn)行任何約束檢驗(yàn)。進(jìn)行檢驗(yàn)是為了看一看在86是否需要任何約束,如果不需要,則控制返回步驟80,并且讀出下一語(yǔ)句。如果當(dāng)前正在編譯的語(yǔ)句確實(shí)需要在86進(jìn)行約束檢驗(yàn),那么在88標(biāo)識(shí)約束。約束標(biāo)識(shí)包括一個(gè)聯(lián)系中的雙親表和從屬表的標(biāo)識(shí),如果操作是刪除操作或更新操作時(shí),還包括確定對(duì)一個(gè)外來(lái)關(guān)鍵詞來(lái)說(shuō)使用哪一條刪除規(guī)則或更新規(guī)則。當(dāng)所有約束在88被標(biāo)識(shí),便在90產(chǎn)生適合的約束子線(xiàn)索,并且與剛產(chǎn)生的主線(xiàn)索的IUDO相連。然后,控制返回步驟80,準(zhǔn)備讀出下一條源語(yǔ)句。
      本領(lǐng)域的技術(shù)人員知道,對(duì)所有可能的聯(lián)系進(jìn)行檢驗(yàn)以確定需要產(chǎn)生哪一些約束子線(xiàn)索,這延長(zhǎng)了編譯過(guò)程的時(shí)間并增加了其復(fù)雜性。還將懂得,由于這一過(guò)程是在編譯期間完成的,并且適合的子線(xiàn)索直接與用于執(zhí)行主線(xiàn)索的代碼相聯(lián),所以沒(méi)有必要在執(zhí)行時(shí)對(duì)已經(jīng)產(chǎn)生的存取方案進(jìn)行這種檢驗(yàn)。這就加快了存取方案的總的執(zhí)行時(shí)間,因此提高了數(shù)據(jù)庫(kù)系統(tǒng)的性能,由于存取方案一般編譯一次,而執(zhí)行許多次,因此,增加編譯時(shí)間所帶來(lái)的影響比起減少執(zhí)行時(shí)間所帶來(lái)的影響要小得多。
      由于完成所有約束檢驗(yàn)的代碼直接放在存取方案之中,所以數(shù)據(jù)庫(kù)中表之間的聯(lián)系發(fā)生變化時(shí),存取方案就不再有效了。因此,當(dāng)這種變化發(fā)生時(shí),就有必要使存取方案作廢,并且在方案再次執(zhí)行之前,至少重新編譯受影響的存取部分。并不是所有的聯(lián)系變化都需要作廢存取方案,并重新進(jìn)行編譯。發(fā)明名稱(chēng)為“數(shù)據(jù)庫(kù)系統(tǒng)的存取方案無(wú)效”、共同未決申請(qǐng)的申請(qǐng)?zhí)枮镹o.的專(zhuān)利申請(qǐng)(該申請(qǐng)已引入于此)描述了決定何時(shí)必須作廢存取方案的最佳技術(shù)。
      圖4至圖10說(shuō)明進(jìn)行幾個(gè)重要的約束檢驗(yàn)的子線(xiàn)索的使用,以及進(jìn)行這些約束檢驗(yàn)的代碼例子。在每一圖中,主線(xiàn)索由MT標(biāo)識(shí),子線(xiàn)索由S1和S2表示。在每一圖中,子線(xiàn)索表示用來(lái)對(duì)每一主線(xiàn)索只進(jìn)行一次唯一的約束檢驗(yàn)。然而,在許多情況下,對(duì)一條SQL語(yǔ)句而言,必須進(jìn)行多次約束檢驗(yàn),并且將包括相應(yīng)于這些約束的多條子線(xiàn)索。將多個(gè)指向他們的指針簡(jiǎn)單地放在IUDO中,就能把多條子線(xiàn)索包括進(jìn)去。
      在圖4至圖10的主線(xiàn)索和子線(xiàn)索代碼例子中采用了以下低級(jí)操作碼DEL這一操作碼包括指向一個(gè)IUDO的一個(gè)指針。如果由IUDO指向的任何約束子線(xiàn)索返回“真”值,則刪除失敗,當(dāng)刪除包括主關(guān)鍵詞的行與從屬外來(lái)關(guān)鍵詞的刪除規(guī)則不符合時(shí),發(fā)生這種情況,并且數(shù)據(jù)庫(kù)不發(fā)生變化。如果返回“偽”,則如期望那樣進(jìn)行刪除操作。
      DL2除了用來(lái)對(duì)級(jí)聯(lián)刪除進(jìn)行計(jì)數(shù)的字段增大、而不是如DEL操作碼那樣使對(duì)直接刪除進(jìn)行計(jì)數(shù)的字段增大之外。該操作碼的其它功能與DEL操作碼相同。
      EXS該操作碼決定當(dāng)執(zhí)行前一個(gè)操作碼,如TA操作碼時(shí),是否存在匹配。如果前一個(gè)TA操作碼發(fā)現(xiàn)有匹配的記錄,則將“真”值放在布爾棧中,否則將“偽”放在棧中。
      EXP這是一個(gè)退出線(xiàn)索操作碼,它結(jié)束一個(gè)謂詞(約束檢驗(yàn))子線(xiàn)索執(zhí)行。當(dāng)退出子線(xiàn)時(shí),該操作碼將布爾棧中的一個(gè)值退棧,并返回該值。
      EXT該操作碼簡(jiǎn)單地退出線(xiàn)索或子線(xiàn)索,將控制返回至調(diào)用這條線(xiàn)索或子線(xiàn)索的位置。
      ISS該操作碼用來(lái)將一行插入一張表中。它包括一個(gè)指向IUDO的指針,并且只有當(dāng)它的約束子線(xiàn)索返回值為“真”時(shí),才完成執(zhí)行。返回值為“偽”表示插入操作廢止。當(dāng)企圖插入的行所包括的外來(lái)關(guān)鍵詞與主關(guān)鍵詞不匹配時(shí),發(fā)生這種情況。
      TA該操作碼是一個(gè)表存取操作碼,包括一個(gè)指向TAOB的指針。該操作碼選擇與TAOB相聯(lián)的表中所有符合TAOB中的謂詞所規(guī)定的標(biāo)準(zhǔn)的行。
      UPD該操作碼是一個(gè)更新操作碼,包括一個(gè)指向IUDO的指針。當(dāng)主關(guān)鍵詞更新以及外來(lái)關(guān)鍵詞更新時(shí),用于更新的IUDO包括指向約束子線(xiàn)索的指針。只有當(dāng)用于主關(guān)鍵詞更新的所有約束子線(xiàn)索的返回值為“偽”時(shí),UPD操作碼才完成執(zhí)行。返回值為“真”表示更新操作被廢止。當(dāng)企圖更新的主關(guān)鍵詞具有與之匹配的外來(lái)關(guān)鍵詞值時(shí),發(fā)生這種情況。對(duì)每次主關(guān)鍵詞的更新,進(jìn)行一次檢驗(yàn),以確定主關(guān)鍵詞的值是否真的改變了。如果它沒(méi)有改變,不執(zhí)行用于更新主關(guān)鍵詞的約束子線(xiàn)索。只有當(dāng)用于外來(lái)關(guān)鍵詞更新的所有約束子線(xiàn)索的返回值為“真”時(shí),UPD操作碼才完成執(zhí)行。返回值為“偽”表示更新操作被廢止。當(dāng)企圖將外來(lái)關(guān)鍵詞更新為一個(gè)與主關(guān)鍵詞不匹配的新值時(shí),發(fā)生這種情況。
      UP2除了將一個(gè)特定的字段增大,以便對(duì)更新的從屬行記數(shù)之外,該操作碼的功能與UPD操作碼相同。
      參照?qǐng)D4,它示出了用來(lái)對(duì)一張從屬表進(jìn)行插入的完成主關(guān)鍵詞檢驗(yàn)的代碼。為了確保在雙親表中包含新的關(guān)鍵詞,當(dāng)產(chǎn)生一個(gè)新的非空外來(lái)關(guān)鍵詞值時(shí),就要進(jìn)行這一檢驗(yàn)。ISS操作碼指向I IUDO 0,IUDO 0接下來(lái)再指向子線(xiàn)索S1。在子線(xiàn)索S1中,TA操作碼用來(lái)搜索雙親表(由TAOB1指向)中的一行,該行的主關(guān)鍵詞值與新增加的外來(lái)關(guān)鍵詞匹配。ExS將一個(gè)“真”值或一個(gè)“偽”值放入布爾棧中,并且該值從棧中退出,由EXP操作碼返回。
      如果“偽”返回給ISS操作碼,那么在雙親表中便沒(méi)有發(fā)現(xiàn)一個(gè)相匹配的主關(guān)鍵詞,并且插入操作是不允許的。
      參照?qǐng)D5,它示出了當(dāng)從屬表中外來(lái)關(guān)鍵詞的刪除規(guī)則是RESTRICT(限制)時(shí),進(jìn)行刪除操作的低級(jí)代碼。TAOBO包括出現(xiàn)在源刪除語(yǔ)句中的全部謂詞,并且IUDO 0包括一個(gè)指向子線(xiàn)索S1的指針。TAOB1包括為在從屬表中搜索其外來(lái)關(guān)鍵詞與正在被刪除的雙親表行的主關(guān)鍵詞匹配的行所必須的那些謂詞。在主線(xiàn)索中,TA操作碼選擇將要被刪除的雙親表中的行,并且如果返回“偽”,DEL操作碼就刪除所選擇的行。在子線(xiàn)索S1中,TA操作碼指向TAOB1,搜索具有與被選擇行的主關(guān)鍵詞匹配的外關(guān)鍵詞的行,對(duì)每個(gè)被主線(xiàn)索的TA操作碼選中的雙親表中的行,執(zhí)行子線(xiàn)索S1,如果找到這種匹配的行,則由EXP操作碼將“真”返回,并廢止刪除操作。
      參照?qǐng)D6,它示出了執(zhí)行刪除操作的代碼,其中從屬表的外來(lái)關(guān)鍵詞具有刪除規(guī)則SET NULL(置空值)。除了子線(xiàn)索S1包括具有一個(gè)指向IUDO1的指針的一個(gè)UP2操作碼外,本實(shí)例與圖5相似。IUDO1列出從屬表中外來(lái)關(guān)鍵詞的可置空值部分,并在被調(diào)用時(shí),將空值賦予這些部分。當(dāng)TA操作碼對(duì)從屬表掃描時(shí),在每一與正被刪去的雙親行的主關(guān)鍵詞匹配的行上執(zhí)行UP2操作碼。EXT操作碼并不返回一個(gè)布爾值,所以主線(xiàn)索中的DEL操作碼總是能夠執(zhí)行。
      圖7表示當(dāng)從屬表中的外來(lái)關(guān)鍵詞的刪除規(guī)則是CASCADE(級(jí)聯(lián))時(shí)用于進(jìn)行刪除操作的代碼。除了子線(xiàn)索51具有DL2操作碼而不是UP2操作碼,使級(jí)聯(lián)刪除能夠完成,以及IUDO1具有一個(gè)指向子線(xiàn)索S2的指針,使附加層級(jí)聯(lián)刪除能夠完成之外,圖7的代碼與圖6的代碼相類(lèi)似。除了TAOB2和IUDO2參照與TAOB1和IUDO1不同的表之外,子線(xiàn)索S2和子線(xiàn)索S1是相同的。如果刪除鏈級(jí)聯(lián)有第三張表,那么IUDO2將包括一個(gè)指向另一個(gè)子線(xiàn)索的指針,去對(duì)那張表進(jìn)行刪除。子線(xiàn)索S1和S2中的DL2操作碼將從屬表中所有被在各自的子線(xiàn)索中的TA操作碼發(fā)現(xiàn)的行刪除。
      參照?qǐng)D8、圖9和圖10,它們示出了用于在更新操作時(shí)強(qiáng)制實(shí)行約束的子線(xiàn)索的代碼。在每一情況中都進(jìn)行檢驗(yàn),以確定是否主關(guān)鍵詞的值真正變化了。如果沒(méi)有變,不執(zhí)行約束子線(xiàn)索。
      當(dāng)從屬表的更新規(guī)則為RESTRICT(限制)時(shí),運(yùn)用圖8的代碼。在主線(xiàn)索中,TA操作碼從雙親表中選擇行,并且如果返回時(shí)是“偽”,UPD操作碼就更新所選擇的行。在子線(xiàn)索S1中,TA操作碼確定在從屬表中是否存在這樣的行,它們的外來(lái)關(guān)鍵詞與雙親行的主關(guān)鍵詞匹配。如果匹配,則指出不應(yīng)執(zhí)行更新操作,EXS和EXP操作碼將“真”值返回UPD操作碼。如果找不到這樣的匹配行,則返回“偽”,并且允許完成更新操作。
      圖9表示當(dāng)從屬表中的外來(lái)關(guān)鍵詞的更新規(guī)則是SET NULL(置空值)時(shí),所采用的約束檢驗(yàn)子線(xiàn)索。在子線(xiàn)索S1中,IUDO1列出從屬表中外來(lái)關(guān)鍵詞的可置空值部分,并且UP2操作碼將空值賦予從屬表中被TA操作碼選中的每行的這些部分。如同置空值刪除的情況,子線(xiàn)索S1將不會(huì)使主線(xiàn)索中的UPD操作碼失敗。
      圖10表示用于執(zhí)行更新操作的代碼,其中從屬表中外來(lái)關(guān)鍵詞的更新規(guī)則是CASCADE(級(jí)聯(lián))。IUDO1列出對(duì)應(yīng)于雙親主關(guān)鍵詞的被更新部分的從屬表中外來(lái)關(guān)鍵詞部分。UP2操作碼使對(duì)由子線(xiàn)索S1中的TA操作碼選中的從屬表中的每一行的外來(lái)關(guān)鍵詞部分設(shè)置成相應(yīng)的主關(guān)鍵詞部分的值。如果級(jí)聯(lián)在第一從屬表之外延續(xù),則IUDO1如同在級(jí)聯(lián)刪除中的情況一樣,包括一個(gè)指向另一子線(xiàn)索的指針。
      參照?qǐng)D11,它示出了在對(duì)外關(guān)鍵詞的值進(jìn)行更新用來(lái)完成主關(guān)鍵詞檢驗(yàn)的代碼。為了確保在雙親表中包括該新關(guān)鍵詞,當(dāng)一個(gè)新的非空外來(lái)關(guān)鍵詞值產(chǎn)生時(shí),便進(jìn)行這一檢驗(yàn)。UPD操作碼指向IUDO0,它再指向子線(xiàn)索S1。子線(xiàn)索S1中,TA操作碼用來(lái)搜索雙親表(由TAOB1指向)中的一行,該行的主關(guān)鍵詞值與新增加的外來(lái)關(guān)鍵詞匹配。EXS將一個(gè)“真”值或一個(gè)“偽”值放入布爾棧中,并且該值從棧中退出,由EXP操作碼返回。
      如果“偽”返回UPD操作碼,那么在雙親表中便沒(méi)有發(fā)現(xiàn)一個(gè)相匹配的主關(guān)鍵詞,并且更新操作是不允許的。
      由于許多表在聯(lián)系中既是雙親表又是從屬表,所以對(duì)所有有關(guān)的約束,必須包括約束檢驗(yàn)子線(xiàn)索。如果任何約束子線(xiàn)索發(fā)生故障,那么由主線(xiàn)索定義的操作也將發(fā)生故障。
      所有上述約束都能用子線(xiàn)索以直截了當(dāng)?shù)姆绞酵瓿?。?zhí)行期間處理起來(lái)較為困難的約束是在帶有級(jí)聯(lián)刪除規(guī)則的刪除語(yǔ)句中的自參照約束。這種特殊情況最好采用不同方式來(lái)處理,如下面所介紹的那樣。
      在級(jí)聯(lián)刪除規(guī)則和自參照約束條件下,從一張表中刪除的每一行都可能在同一張表中有許多從屬行,而這些從屬行在那張表中又可能有許多從屬行。這種多重從屬關(guān)系可以從無(wú)法預(yù)知的深度繼續(xù)遞歸下去,只取決于表中包含的數(shù)據(jù)。執(zhí)行約束檢驗(yàn)的一個(gè)遞歸過(guò)程需要一個(gè)最大容量難以確定的調(diào)用棧。因此,下面介紹采用選代技術(shù)來(lái)進(jìn)行這一特殊情況的約束檢驗(yàn)的最佳方法。
      參照?qǐng)D12,它示出了在帶有級(jí)聯(lián)刪除規(guī)則的刪除語(yǔ)句中,對(duì)一個(gè)自參照約束進(jìn)行約束檢驗(yàn)的方法的流程圖。
      首先,在步驟100選擇將要?jiǎng)h除的一行或幾行。這可以是目前由光標(biāo)選擇的一行,也可以是基于某些比較標(biāo)準(zhǔn)選擇的一行或多行。在后一種情況下,可采用所熟悉的TA操作碼來(lái)選擇表中要?jiǎng)h去的行。
      在步驟100被選擇的一行或幾行的每一行的主關(guān)鍵詞寫(xiě)入一張臨時(shí)表102,然后,在104,用DEL操作碼將所選擇的一行或幾行從原表中刪除。在106,包括一個(gè)新近被刪除的主關(guān)鍵詞值的一行從臨時(shí)表讀出。然后,在步驟108進(jìn)行檢驗(yàn),看看臨時(shí)表是否空了。如果是的話(huà),則過(guò)程結(jié)束。否則,控制轉(zhuǎn)向步驟110。
      在步驟110中,用TA操作碼讀出原表中具有與剛從臨時(shí)表中選出的主關(guān)鍵詞匹配的從屬關(guān)鍵詞的行。步驟112指明是否找到了更多的匹配行。如果還沒(méi)有到達(dá)表的結(jié)尾處,則在114將新近選出行的主關(guān)鍵詞加進(jìn)臨時(shí)表中,并在116從表中刪除該行。這一過(guò)程一直繼續(xù)下去,直到由TA操作碼將所有的匹配行找到為止。
      由步驟110~116定義的循環(huán)適用于一個(gè)單獨(dú)的自參照約束。即檢驗(yàn)一個(gè)外來(lái)關(guān)鍵詞,看看它是否與從臨時(shí)表中剛讀出的主關(guān)鍵詞匹配。一張表中存在兩個(gè)或兩個(gè)以上不同的自參照約束也是可能的。如果存在更多的自參照約束,則在原表完成一次掃描以后,將控制從步驟112轉(zhuǎn)向步驟118。除了步驟118中的TA操作碼引用的表項(xiàng)目的謂詞不同于步驟110中的TA操作碼引用的表項(xiàng)目的謂詞之外,步驟118、120、122和124對(duì)應(yīng)于步驟110~116,使得原表再次被掃描。這意味著由步驟118~124構(gòu)成的循環(huán),對(duì)不同的參照約束進(jìn)行檢驗(yàn)。
      假定原表中只有兩個(gè)不同的參照約束存在,那么一旦步驟120的檢測(cè)指出表已經(jīng)被全部掃描過(guò)了以后,控制就返回步驟106,從臨時(shí)表中讀出一個(gè)新的主關(guān)鍵詞。有了新近從臨時(shí)表中讀出的主關(guān)鍵詞,整個(gè)過(guò)程宣告完成。這一循環(huán)繼續(xù)著,當(dāng)行被刪除時(shí),新的主關(guān)鍵詞加進(jìn)臨時(shí)表中,并且每次控制返回步驟106時(shí)從臨時(shí)表中去掉,直至臨時(shí)表變空。由于自參照約束只限于單張表,所以最終臨時(shí)表或原表本身將變空。
      如果對(duì)于原表來(lái)說(shuō)只有單個(gè)自參照約束存在,那么判定步驟112將直接把控制返回步驟106,而步驟118~124構(gòu)成的循環(huán)將不復(fù)存在。如果有三個(gè)或三個(gè)以上的不同的自參照約束存在,那么控制將經(jīng)過(guò)判定步驟120到達(dá)下一個(gè)參照循環(huán)的開(kāi)始,并且最終的循環(huán)將控制返回步驟106。由于約束的數(shù)目和本體在存取方案的編譯期間是知道的,所以編譯程序僅僅將所要求的循環(huán)的準(zhǔn)確數(shù)目寫(xiě)進(jìn)存取部分。
      以上描述的系統(tǒng)和方法提供了將用于約束檢驗(yàn)的子線(xiàn)索直接編譯進(jìn)存取方案。由于有關(guān)約束的存在和識(shí)別并不需要在運(yùn)行期間確定,所以提高了運(yùn)行期間的效率。用來(lái)進(jìn)行約束檢驗(yàn)的代碼可以以和存取部分的先前結(jié)構(gòu)一致的方式;附在各種存取部分的主線(xiàn)索上。
      雖然以上結(jié)合最佳實(shí)施例對(duì)本發(fā)明進(jìn)行了具體展示和描述,但本領(lǐng)域的技術(shù)人員應(yīng)該懂得,在不偏離本發(fā)明的精神和范圍的情況下,可以在形式上和細(xì)節(jié)上對(duì)本發(fā)明作各種修改。
      權(quán)利要求
      1.產(chǎn)生一個(gè)對(duì)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行存取的存取方案的方法,其特征包括以下步驟將源語(yǔ)言語(yǔ)句編譯成低級(jí)代碼,包含在存取方案之中;在上述編譯步驟期間,確定包含在處理源語(yǔ)言語(yǔ)句中的數(shù)據(jù)庫(kù)客體之間的聯(lián)系;對(duì)存取方案插入低級(jí)代碼,在有關(guān)的數(shù)據(jù)庫(kù)項(xiàng)目上進(jìn)行約束檢驗(yàn)。
      2.權(quán)利要求1的方法,其特征在于存取方案包括多個(gè)存取部分,每部分對(duì)應(yīng)一條源語(yǔ)言語(yǔ)句,并且與每條源語(yǔ)言語(yǔ)句有關(guān)的約束檢驗(yàn)代碼與相應(yīng)的存取部分相關(guān)聯(lián)。
      3.權(quán)利要求1的方法,其特征在于只有當(dāng)與存取部分相關(guān)聯(lián)的約束檢驗(yàn)代碼返回并指明所有約束都滿(mǎn)足時(shí),存取部分中的操作碼才被允許執(zhí)行它們的功能。
      4.一個(gè)關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),其特征在于多個(gè)包含數(shù)據(jù)的數(shù)據(jù)庫(kù)客體,以及包含用來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作的代碼的存取方案,上述存取方案還包含用來(lái)執(zhí)行預(yù)選定的約束檢驗(yàn)的低級(jí)代碼。
      5.權(quán)利要求4的系統(tǒng),其特征在于所說(shuō)的存取方案包括多個(gè)存取部分,每部分對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)存取語(yǔ)言源碼的標(biāo)識(shí)部分;其中用來(lái)執(zhí)行與源碼的每一標(biāo)識(shí)部分有關(guān)的約束檢驗(yàn)的代碼,與相應(yīng)的存取部分相關(guān)聯(lián)。
      6.權(quán)利要求5的系統(tǒng),其特征在于每個(gè)存取部分包括一條低級(jí)碼主線(xiàn)索,用來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作,以實(shí)現(xiàn)源碼的相應(yīng)部分;以及一個(gè)包含指向低級(jí)碼子線(xiàn)索的指針的控制塊,用來(lái)進(jìn)行與存取部分有關(guān)的約束檢驗(yàn)。
      7.權(quán)利要求6的系統(tǒng),其特征在于每條子線(xiàn)索對(duì)應(yīng)一個(gè)要被檢驗(yàn)的約束。
      8.權(quán)利要求5的系統(tǒng),其特征在于數(shù)據(jù)庫(kù)存取語(yǔ)言源碼的一個(gè)標(biāo)識(shí)部分包括由數(shù)據(jù)庫(kù)存取語(yǔ)言定義的一條指令。
      9.對(duì)一個(gè)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行存取的方法其特征包括以下步驟執(zhí)行一個(gè)包含數(shù)據(jù)庫(kù)存取操作碼的存取方案;以及在存取方案中,進(jìn)行預(yù)選定的約束檢驗(yàn),強(qiáng)制實(shí)施數(shù)據(jù)庫(kù)客體間的參照約束。
      10.權(quán)利要求9的方法,其特征在于在編譯存取方案時(shí),選擇約束檢驗(yàn)。
      全文摘要
      在一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中強(qiáng)化實(shí)施參照完整性的系統(tǒng)和方法,能在存取方案的編譯期間確定有關(guān)的參照約束。當(dāng)產(chǎn)生存取方案時(shí),對(duì)所有與數(shù)據(jù)庫(kù)的數(shù)據(jù)變化有關(guān)的參照約束進(jìn)行標(biāo)識(shí)。為執(zhí)行參照約束檢驗(yàn)所需的代碼在編譯期間直接插入存取方案,消除了在運(yùn)行期間確定有關(guān)約束的必要。約束檢驗(yàn)可以采用在存取方案中為進(jìn)行數(shù)據(jù)存取所用的相同的低級(jí)過(guò)程語(yǔ)句來(lái)完成。
      文檔編號(hào)G06F17/30GK1050937SQ9010766
      公開(kāi)日1991年4月24日 申請(qǐng)日期1990年9月13日 優(yōu)先權(quán)日1989年10月13日
      發(fā)明者詹姆斯·拉塞爾·博伊克恩, 莉薩·安·吉爾·庫(kù)爾茨杰斯克, 加里·蘭德?tīng)枴せ舳? 蒂莫西·雷·馬爾克姆思 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司
      網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1