数据库系统的存取程序无效的制作方法

文档序号:6405920阅读:171来源:国知局
专利名称:数据库系统的存取程序无效的制作方法
总的说来,本发明涉及数字计算机的数据库有关更确切地说,是涉及一种可以保证在某些操作过程中的数据库内部的参考完整性的方法。
为了提高数字计算机系统中的数据库的存取速度,包括数据库存取指令的源文件可以被编辑成存取程序(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日
发明者加里·兰德尔·霍恩, 蒂莫西·雷·马尔克姆斯 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1