專利名稱:數據庫系統的存取程序無效的制作方法
總的說來,本發明涉及數字計算機的數據庫有關更確切地說,是涉及一種可以保證在某些操作過程中的數據庫內部的參考完整性的方法。
為了提高數字計算機系統中的數據庫的存取速度,包括數據庫存取指令的源文件可以被編輯成存取程序(access plan)。這些存取程序包含低級的過程語句來有效地從數據庫中存取。運行時,不是由數據庫管理程序來解釋存取命令,而是執行存取程序,這樣系統性能得到了改善。
為了保持參考的完整性,當修改數據庫時,必須滿足大量的約束條件。參考的完整性是指涉及整個數據庫的一致的狀態。實現這些約束條件的過程代碼可以被容納在存取程序中。當數據庫被修改時,執行這一修改的存取程序中的過程代碼就實現了所有必要的一致性檢查。
當兩個數據庫目標(如表)之間的關系改變時,用來進行檢查,以確保參考穩定性的約束條件也必須改變。這就意味著,依賴于改變了的關系的存取程序必須重新編譯,也叫做重新連接。
當一個存取程序建立時,關于這一程序對其它數據序目標的相關性(dependency)表也就確立了。在現有的系統中,如果一個改變了的關系影響了任何與存取程序相關的數據庫目標,這個存取程序就無效了。在一個無效的存取程序可以被執行以前,必須重新編譯。重新編譯的過程將把改變的關系考慮進去。一個關系的改變可能影響大量的存取程序。而每一個存取程序在將來執行以前必須重新編譯。把命令編譯成存取程序是一個很費時間的過程,如果可能的話,最好避免這樣做。
人們希望能提供一種僅當必要時重新編譯存取程序的方法,最好只是在實施參考的約束條件的程序代碼在兩個程序目標之間的關系改變之后必須在存取程序中改變,才使標記的存取程序無效。
提供一種選擇要作廢的,且僅選擇那些必須修改以適應參考的約束條件改變的存取程序的方法,這是本發明的一個目的。
提供這樣一種方法能夠有效地決定哪些存取程序必須被作廢,這是本發明的下一個目的。
提供這樣一種方法,能夠確保數據庫的參考完整性,這是本發明的另一個目的。
根據本發明,對于數據庫系統的每一個存取程序,其相關性由每一個與存取程序相關的數據庫目標來決定。每個相關性都有一種類型。當數據庫目標之間的一個關系改變時,對應于那些目標的每一個存取程序的相關性就確定了。如果一個存取程序具有依賴于受影響的數據庫目標的相關性,且這些數據庫目標屬于預選的相關類型的子集,那個存取程序就無效了,如果存取程序不在預選的相關性類型的子集之內,這個程序仍然是有效的,而且不需要重新編譯。
本發明的新穎特點(申請人相信是特征)見下面的權利要求書。然而,這發明的本身,以及更好的使用方式,進一步的目標及優點,在參考了與附圖聯系起來的詳細描述就會非常清楚了。其中
圖1是顯示與數據庫系統中存取程序相關性的方框圖。
圖2是數據庫目標之間關系圖。
圖3是描述圖2目標中選出的存取程序語句的相關性表。
圖4是當一個新的外來關鍵字建立時,檢查存取程序相關性的操作方法方框圖。
圖5是當一個新的外來關鍵字取消時,檢查存取程序相關性的操作方法方框圖。
圖1顯示了在現有的通用數字計算機上運行的數據庫系統的一部分。這個系統包括數據庫10和數據庫管理系統12。數據庫10由復雜的各種類型的目標組成,這些目標包括數據和其它類型用來存取數據的目標。數據庫管理系統12由應用程序(沒列出)調用來執行數據庫10的存取。所有對數據庫10的存取都要通過數據庫管理系統12來完成。
數據庫10包括存取程序目標14、16、18和數據表目標20、22、24、26、28。附加的目標和目標類型可以在特殊的數據庫中見到,由于清楚起見,在這里沒有包括在內。每個存取程序目標14、16、18對應于一個高級的數據庫存取命令的源文件,這些命令已經編譯到低級的程序語句中。當一個應用程序訪問數據庫管理系統12來執行一系列數據庫存取命令時,數據庫管理系統就調動適當的存取程序來完成這些數據庫的存取。
數據表20到28,每一個代表一個包括邏輯行和列的數據表。每一行就是一個單獨的入口,并被分成對應于表的列的字段。就象技術上所知道的那樣,雖然數據表目標20到28呈現成邏輯上的二維矩陣,但是可以使用不同的數據結構如B樹結構來構成。
每個存取程序14、16、18都有一個或多個數據表目標,這些目標是會受存取程序運行的影響的。一個存取程序在這樣的數據目標中被認為是相關的。可能存在的相關性類型將在下面具體描述。在數據庫10中,程序14依賴于數據目標20、22和24。程序16依賴于目標24、26和28,而程序18依賴于目標26和28,在實際的系統中,取決于存取程序的數據庫目標的數量是非常之大的。
為了確保包含在數據庫10中的數據的精確性和穩定性,數據必須具有作為參考完整性的質量。當數據庫啟用時,參考完整性由強行限制數據的改變來保證,也叫參考制約。理解本發明所必要的術語將在這里給予定義。
一個主關鍵字就是必須包含唯一非空值的表的一隊縱列。一個表不能有多于一個的主關鍵字。一個外來關鍵字是表中的一縱列,這個表的值需要與表的主關鍵字相適應。僅當關鍵字的非空值以特定表的主關鍵字形式出現,這些非空值才是有效的,這是參考制約的必要條件。由參考制約限定的關系是一系列一個表的行之間或者兩個不同表的行之間的聯系,這兩個不同的表是由主關鍵字和無關關鍵字的值決定的。
母表就是包含確定關關的主關鍵字的相互關系表。一個表在隨機量的相互關系上可能是一個母表。一個相關的表是一種相互關系表,這個表包含決定此相互關系的無關關鍵字。表在隨機量的相互關系方面可以是相關的。可以既是母表又是相關表。
一個相關行就是一行具有一個無關關鍵字值的相關表,這個值與原始表中主關鍵字值相對應。因此,無關關鍵字值代表對應于原始行的相關行的基準。原始行就是至少有一個相關行的一行原始表。
刪除的規則是與每個參考制約聯系在一起的,這個刪除規則可以限定(保護)原始行的刪除,或者它可以確定相關行刪除的作用,這個作用既可以使相關行削除,也可使相關行中的無關關鍵字變成空行。
修改規則也與參考制約有聯系,一方面,運用修改規則就是為了限制原始行中的主關鍵字的修改。另一方面,就是為了確定對相關行修改的作用。因此,(舉例來說)級聯的修改是可能的。
圖2說明了剛才描述的一些概念,列出了T1、T2、T3、T4和T5五個數據表。圖2中的每個表包含一個行,這個行展示了表中每行格式的一部分。例如,表T1中的每一行包含一個縱列或形成關鍵字A的一組縱列,表T4的每一行包括關鍵字A、C和B。
表T1、T2和T4包含主關鍵字,表T1包含主關鍵字A,T2包含主關鍵字B,T4包含主關鍵字C。表T3、T4和T5包含無關關鍵字,T3和T4都包含關鍵字A來作為一個無關關鍵字,T4包含關鍵字B也作為一個無關關鍵字。T5包含關鍵字C作為無關關鍵字的關鍵字C。
表之間的關系由箭頭來表示,箭頭30代表了表T3中的無關關鍵字A和T1中的主關鍵字A之間的相互關系。箭頭32代表了表T4的無關關鍵字A和表1中的主關鍵字A之間的相互關系,箭頭34代表了表T4中的無關關鍵字B與表T2中主關鍵字13之間的相互關系。并且,箭頭36代表了表75中的無關關鍵字C和T4中無關鍵字C之間的相互關系。
限定相互關系30~36的參考制約需要存在有關表中的入口間的穩定性。例如,表T5中每行的C鍵必須與表T4中的某行C鍵相對應,否則就出現值空。以類似的方式,T4的每一行必須與表T1和T2都一致。也就是說,T4的每一行都必須具有對應于T1的一個A鍵,也必須具有對應于T2的鍵的一個B鍵,如果對某個無關關鍵字允許有一個空值,那個關鍵字的空的值就滿足那個參考制約條件。
每當數據庫改變時,所有相關的參考約束條件都必須滿足。如果不是這樣的話,改變是不允許的。下列無關關鍵字的規則的實施,保證了數據庫的參考完整性。
插入規則當一個行插入到一個相關的表中時,插入行中的每個非空無關關鍵字值必須與有關的原始表中的一些無關鍵字值相一致,如果插入過程影響了參考制約,就將出錯并且行不能插入。
刪除規則當一個行要從原始表中刪除時,就要進行檢查,以決定相關表中有無相關行。相關行就是具有一個與要刪除行中的主關鍵字相一致的無關關鍵字值。如果出現相關行,所采取的步驟由在相關表中確定無關關鍵字的刪除規則來規定。
三個刪除規則可以確定一個無關關鍵字,如果這個規則被限制,如果一個相關行出現,就將出錯,且行不能刪除。如果刪除規則被級聯相關表中的相關行就刪除了。相關表中刪除行的任何其它參考制約條件也必須滿足,否則,就將出錯,且行不能削除。對于一個SETNULL(設置空位)削除規則,如果任何相關行出現在相關表中,無關關鍵字中無效的部分就置成空位。修改規則正如前面描述的那樣,至少存在兩個交替的修改規則。一方面是確定相關行中修改的作用。另一方面是為了使修改規則達到一種狀態,就是當在一個原始表中修改一個主關鍵字時,實施一種檢查以確定在相關表中有無相關行。如果發現相關行,就將出錯,且行不能修改。
修改無關關鍵字規則,當一個無關關鍵字在相關表中修改時,如果無關關鍵字不是空的它的新值必須與有關的原始表中的無關鍵字的值相一致。如果修改過程影響了參考制約,就將出錯,且行不能修改。
現在可以參照圖1來描述存取程序相關性,如果在操作過程中,一個表或它的索引被存取這個表就包含在存取程序操作中。操作過程的表為操作過程的數據庫存取指令提供參考是沒有必要的。在操作過程里的所有數據庫目標中,存取程序是相關的,既使是在為實現參考制約只含有存取程序的情況下。為了在插入、修改、刪除或選擇語句中和在兩種特殊情況下直接參考所有的表,存取程序相關性就被記錄下來。
為了實現所提出的設想,有六種不同類型的存取程序相關性,其中四個相關性類型應用于表中,在直接影響表的數據庫存取語句中,這些表直接用來作為參考。這些相關性類型是選擇、插入、修改和消除。存取程序相關性的兩個附加類型也確定了。當由于對主關鍵字或無關關鍵字進行修改使得表包括進去時,就存在關鍵字的相關性。當由于對那個表消除級串使得表包括進去,就存在級串相關性。
圖3顯示了許多與數據表一起出現的存取程序相關性和由圖2決定的制約條件。圖3是包含許多高級的數據庫存取命令的表,并顯示了由每一命令產生的存取程序相關性的類型,以及出現相關性的表。
命令40是插入表T4中一行的高級命令。這個存在干存取程序中的命令對表T4產生一個插入變量,當新的一行插入到T4中,所有表T1和T2入口中的A和B字都分別被檢測出來,以確保對應的入口出現在里面。
命令42顯示了表T1中要被削除的入口,這個命令對T1產生一個刪除變量。這個變量設定在表T3和T4中對無關關鍵字A的刪除規則是REI-STRICT或SEF NULL。舉例來說,當刪除規則是級聯時,說明適當的變量的例子將在下面描述。
命令44向表T2中插入新的一行,這將對表T2產生一個插入變量。
命令46對表T2的一行進行修改,命令46將這行中的B關鍵字值改變成新的值。它將對表T2產生一個修改變量。由于關鍵字B是一個主關鍵字,對任何有關鍵字B的表就將產生一個關鍵字變量。在這種情況下,表T4就是唯一這樣的表。
命令48將表T2中一個不同的字段改成新的值,它將對表T2產生一個修改變量,由于這個另外的字段既不是主關鍵字,也不是無關關鍵字,因此沒有關鍵字變量產生。
命令50用來從表T4中選擇一個或多個行,它將對T4產生一個選擇變量。
命令52對表T4中的一行進行修改,使得A關鍵字的字段變成新的值。它將對表T4產生一個修改變量。由于關鍵字A是一個無關關鍵字,在這種情況下,對與A相關的原始表,表T1就將產生一個關鍵字變量。
命令54顯示了當一個級聯消除規則使用時出現的相關性,假定表T4中對無關關鍵字B的消除規則是級聯,表T5中對無關關鍵字C的消除規則也是級聯,在這個例證中,命令54對表T2產生一個消除變量,并對表T4和T5產生一個級串變量。
當表中產生一個新的無關關鍵字,或當現有的無關關鍵字從表中消失時,表之間的關系就改變了。產生新關鍵字或關鍵字從中消失的表可以作為“目標”表,在前述的系統中,當一個新的關鍵字被加入或一個現有的關鍵字消失時,目標表中所有具有相關性的存取程序都是無效的,并且在它們執行以前,必須重新編譯。不同的相關性類型的規定在前面已經描述了,新產生的或消失的無關關鍵字實際上影響了哪一個在目標表中具有相關性的存取程序,確定這一點是有可能的。實際上不受這些無關關鍵字影響的存取程序不需要重新編譯,因此也就并不是無效的。
圖4顯示了一個步驟順序的方框圖,它可以用來確定當一個新的無關關鍵字產生時,哪個存取程序必須是無效的,在步驟60中,一個新的無關關鍵字產生于目標表中。對于每個在目標表中具有相關性的存取程序或新參考制約條件的原始表,圖4的原有步驟被執行了。
存取程序對目標表的相關性在步驟62中被確定下來。如果那個相關性是插入或修改相關性(步驟64),這個存取程序就被標記為無效(步驟66),且在執行以前必須重新編譯。如果對目標表的相關性不是插入或修改相關性(步驟64),新產生關鍵字的原始表中,存取程序的相關性就在步驟68中確定。如果存取程序對母表的相關性是刪除,級串或修改相關性(步驟70),存取程序就是無效的(步驟72),如果對原始表的相關性不是消除,級串或修改相關性(步驟70),存取程序仍然是有效的(步驟74),而且不需要重新編譯。
當建立的一個新的無關關鍵字時,無需嚴格按照圖4中建立的順序來進行相關性檢查,只須使相同的相關性引起存取程序的無效。這樣,當一個無關關鍵字被建立時,如果一個存取程序具有1)對目標表有插入或更新相關性,或者2)對該新建立的無關關鍵字的母表有刪除,更新或級聯相關性時,該存取程序必須被無效。
下面結合圖3中的實施來描述圖4中建立的存取程序變量規則的應用。對于這些例子,我們假定表T4是目標表,無關關鍵字是根據T2中的B在表T4中新建立的關鍵字。
對命令40而言的存取程序對表T4具有一個插入相關性。這將要求把該存取程序無效。一旦比存取程序被重新消譯,消譯程序就必須把附加的編碼插入該存取程序中,以便檢查表T4和T2之間的參考限制。這些編碼原先并不存在,原因是原先在這兩個表之間沒有關系。
命令42在表T2或T4中不會產生變量。因此,命令42不會引起該存取文件無效。
命令44對表T2會產生一個插入相關性,而對表T4不會產生任何相關性。由于對母表中的插入相關性不是那種使一個程序無效的相關性,因此,命令44不要求使一個存取程序無效。命令46和48都會對圖表T2產生更新相關性,因此都要求使存取程序無效。
命令50對表T4產生一個不要求使存取程序無效的選擇相關性。命令52對表T4產生一個使存取程序無效的更新。命令54會對表T2產生一個刪除相關性,對表T4中產生一個級聯相關性。母表T2中的刪除相關性要求使程序無效。
圖5中的流程圖示出了當一個無關關鍵字從目標表中刪除之后必須加予檢查以判定存取程序是否應該無效的相關性。在圖4所示的情況下,檢查各個相關性的次序是不重要的,但是,使用所有可能的相關性關系的正確子集來使一個存取程序無效是很重要的。
在步驟80,一個現有的無關關鍵字從目標表中刪除。每個從屬的存取程序對剛刪除的無關關鍵字而言相對于母表的存取程序依賴性在步驟82中被判定。如果該程序對母表84有一個更新相關性,則在步驟86中判定該程序對目標表的相關性。如果目標表相關性是關鍵字相關性(步驟88),則程序被標為無效(步驟90),如果不是,則再進行另外的檢查。
如果對母表的相關性不是更新相關性(步驟84),或者曾經是而現在對目標表的相關性不是關鍵字相關性(步驟88),則進行一次檢查以確定將程序是否對母表有刪除或級聯相關性(步驟92)。如果是,則程序被無效(步驟94)。如果不是,則檢查該程序是否對母表存在關鍵字相關性(步驟96)。如果是,則在步驟98中判定該存取程序對目標表的相關性,如果該程序對目標表具有更新相關性(步驟100),則被標為無效(步驟102)。
如果從步驟96走的是“否”路徑,在程序對目標表的相關性在步驟104中加以確定。測試步驟106在步驟104或者100之后執行,視情況而定。在步驟106中,檢查存取程序對目標表是否有插入性。如果是,則在步驟103中該存取程序被標為無效。如果已經檢查過的相關性組合中沒有一個為“真”,則程序保持無效(步驟110)。
概括起說,不論何時只要一個現有無關關鍵字釋放,一個存取程序只要有下列相關性就肯定被無效1)對剛釋放的無關關鍵字而言,對母表的更新相關性和對目標表的關鍵字相關性;2)對目標表的插入相關性,3)對目標表的更新相關性和剛釋放的無關關鍵字對母表的關鍵字相關性;或者4)對于剛釋放的無關關鍵字而言對母表具有刪除或者級聯相關性。如果一個存貯程序沒有上敘敘述的相關性中的任一個,無關關鍵字丟掉時它無須被無效。
現在來結合圖3中的實例描述圖5中建立的存貯程序相關性規則的應用。在這些程序中,假定表T4為目標表,無關關鍵字B正從表T4中釋放。
對命令40而言,存貯程序對表T4有插入相關性,這要求該存貯程序被無效。存取程序中對B關鍵字的關系進行限制檢查的編碼不再有效或者必需,將在重新編譯時刪掉。
命令42不會對表T2或者T4產生任何相關性。因此,命令42不要求使存取程序無效。
命令44對表T2產生一個插入相關性,對表T4不產生相關性,因此,不要求使存取程序無效。
命令46對表T2產生一個更新相關性,對表T4產生一個關鍵字相關性,這將使存取程序無效。命令48只在表T2中產生一個更新相關性,因此不需要使程序無效,這是因為對表T4不存在關鍵字相關性。
命令50產生一個對表T4的選擇相關性,這將不會使存取程序無效。命令52產生對表T4的更新相關性,但是不對表T2產生相關性。這不會導致程序無效。命令54產生一個對表T2的的刪除相關性和一個對表T4的級聯相關性,這就要求使存取程序無效。
如上所述,當一個存取程序對一個無關關鍵字的目標表和母表存在有某種相關性時,增加或者去掉該無關關鍵字將要求使該存取程序無效。導致一個存取程序無效的相關性是該存取程序對目標表和母表所具有的所有可能類型的依賴性的一個子集。沒有包括在該子集中的相關性的型典不要求使存取程序無效。這樣,在許多情況下,增加或者去掉一個無關關鍵詞并不要求相關于包含該關鍵字的表的所有存取程序無效。
一個無關關鍵字被去掉或建立時對相關性類型的檢查處理可以相當有效地進行。存取程序對目標表的相關性作為位映象存貯在數據庫中。直接檢查每個存取程序的位映象就發現該存貯程序是否需要被無效。由于相關性檢查可以高效率地被進行,因此,作這些檢查作費的少量時間大大短于不需重新編譯時不進行重新編譯而節省的時間。
雖然本發明是根據一個最佳實施例來圖示和描述的,但是本技術領域內的熟練人員可以不離開本發明的原則范圍對本發明作出各種形式或者細節上的變動。
權利要求
1.一種選擇數據庫存取程序并使之無效的方法,其特征在于下列步驟·當一個從屬數據庫目標中的無關關鍵字被建立,取消或者改變時,確定存取程序對為該無關關鍵字定義一個主關鍵字的從屬目標和母目標的依賴性的類型,·使對上述的從屬和母目標的相關性位于所有可能的相關性類型的一個選定子集中每個存取程序無效。
2.根據權利要求1的方法,其特征在于上述的可能的相關性類型包括選擇、刪除、插入、更新、級聯和關鍵字相關性。
3.根據權利要求2的方法,其特征在于預先選定的子集包括·外來關鍵字建立時對從屬目標的插入和更新相關性及對母表的刪除、更新和級聯相關性;當外來關鍵字被丟失時對從屬表的插入相關性、對母表的刪除和級聯相關性、對母表的更新相關性和對從屬表的關鍵字相關性的組合以及對從屬表的更新相關性和對母表的關鍵字相關性的組合。
4.一種在數據庫系統中把存取程序標為無效的方法,其特征在于下列步驟·如果在一個其中母目標具有一個主關鍵字的從屬目標中刪除或者增加一個外來關鍵字而使從屬目標和母目標之間的關系改變的話,判定任何存取程序中的過程碼是否必須改變,·把過程碼必須改變的所有存取程序標為無效。
5.根據權利要求4的方法,其特征在于上述的判定步驟包括下列步驟·判定存取程序對從屬目標和母目標的相關性的類型,·選出那些對母表和從屬表的依賴性屬于所有可能的相關性類型的一個預選定子集中的存取程序,這些選出的存取程序要求過程碼發生變化。
6.一種在二個數據庫目標之間的關系發生變化時維護數據庫的參考完整性的方法,其特征在于下列步驟·判定存取程序對數據庫目標的相關性,·把上面判定的相關性和所有可能的存取程序依賴性類型的一個選定子集加以比較,·如果一個存取程序的判定的相關性屬于上述的預定子集,則把該存取程序標為無效。
7.根據權利要求6的方法,還包括下列步驟·當一個存取程序被標為無效時,在它下次被存取時對它進行重新編譯。
8.根據權利要求6的方法,其特征在于一個數據庫目標包含一個主關鍵字,另一個數據庫目標包含一個必須與主關鍵字一致從而維護參考完整性的無關關鍵字。
9.根據權利要求8的方法,其特征在于所述的關系變化包括無關關鍵字的增加或刪除。
10.如權利要求9所述的方法,其特征在于所述的可能的相關性類型包括選擇、刪除、插入、更新、級聯和關鍵字相關性。
11.根據權利要求10,其特征在于預定的子集包括外來關鍵字建立時對從屬目標的插入和更新相關性,以及對母表的刪除、更新和級聯相關性,無關關鍵字刪除時對從屬表的插入相關性,對母表的刪除和級聯相關性,以及對母表的更新相關性和對從屬表的關鍵字相關性的組合,以及對從屬表的更新相關性和對母表的關鍵字相關性的組合。
全文摘要
本發明對于數據庫系統中的每個存取程序判定其對所依賴的每個數據庫目標的相關性。一旦數據庫目標之間的關系改變時,判定每個存取程序對這些目標的相關性類型。如果一個存取程序對一個受到影響的數據庫目標的相關性屬于一個預先選定的相關性類型子集,則該存取程序被無效(接著再重新編譯)。如果存取程序的相關性不在預先選定的相關性類型子集中,則該程序保持有效,不需要重新編譯。
文檔編號G06F17/30GK1050938SQ9010766
公開日1991年4月24日 申請日期1990年9月13日 優先權日1989年10月13日
發明者加里·蘭德爾·霍恩, 蒂莫西·雷·馬爾克姆斯 申請人:國際商業機器公司