您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 高级数据库技术-第5章 主动数据库
第5章主动数据库技术•主动数据库的一个突出的思想是让数据库系统具有各种主动进行服务的功能,并以—种统一而方便的机制来实现各种主动性需求。实现主动数据库系统有许多需要解决关键的问题,这些问题包括实现有效的事件监视器,有效的规则表示和执行机制,数据库中的事件描述、运算和复合,以及在主动数据库中的有效事务处理机制等。5.1主动数据库的产生5.1.1数据库的被动服务与主动服务•传统数据库管理系统本身都是被动的,即它只能响应和重做用户要求它们做的事情,而不会灵活地根据数据库的外部环境或内部状态等情况主动做些什么,数据库仅作为一种被动的数据存储仓库而存在。利用“被动服务”的数据库不能很好地完成带有主动性需求的任务。而在实际应用中,主动性需求是大量存在的,这就呼唤着解决该问题的方案。5.1.2实际应用的主动性需求•实际应用中一些最经常遇到的主动性需求:•MIS中的预警功能•系统的实时监控功能•例外或错误情况的主动处理和自动恢复功能•系统瞬时状态的输出或关键点状态的输出•协同工作或协同解决问题•方便灵活的实时处理能力•方便灵活的人机交互接口•自适应和学习功能•演绎推理功能•更强的系统交互性•原有数据库功能的加强和集成也需要主动性的帮助5.1.3什么是主动数据库•近年来,一些商品化的数据库管理系统,纷纷引进了所谓的“触发器(Trigger)”和“规则(Rule)”概念。在某种意义上引入了主动处理的功能。ISO的SQL3标准也支持通用的主动规则机制。他们支持的语义有:基本事件和简单事件的复合;事件-条件(Event-Condition,EC)和条件-动作(Condition-Action,CA)耦合;多种规则粒度;串行的规则选择和可中断的规则执行方式等。•主动数据库提供给用户一个统一定义主动功能的平台,方便使用和修改,同时提高了系统的可靠性和性能。主动数据库的一个突出的思想是让数据库系统具有各种主动进行服务的功能,并以—种统一而方便的机制来实现各种主动性需求。5.2触发器技术5.2.1标准SQL中的主动数据库功能•SQL3引入了触发器的功能,从而在公共的标准上实现了对主动数据的支持。•SQL3触发器的语法如下:•SQL3trigger::=CREATETRIGGERtriggername•{BEFORE|AFTER|INSTEADOF}triggerevent•ONtablename•[ORDERordervalue]•[REFERENCINGreferences]•WHEN(condition)•SQLProcedurestatement•[FOREACH{ROW|STATEMENT}]•其中:•triggerevent::=INSERT|DELTE|UPDATE[OFcolumnnames]•reference::=OLDASoldvaluetuple|•NEWASnewvaluetuple|•OLD_TABLEASoldvaluetablename|•NEW_TABLEASnewvaluetablename•触发器是按照事件(Event)-条件(Condition)-动作(Action)的规则定义的。在SQL3触发器中,触发的事件仅限于数据更新操作,不支持数据查询操作。每一种触发器操作有3种可能的触发时间,他们是BEFORE、AFTER和INSTEADOF,BEFORE为事件前触发,AFTER为事件后触发,INSTEADOF表示触发器执行某项操作,而不是触发这个触发器的操作。SQL更新操作的对象一般来说是元组集,这样就存在一个操作粒度问题。一个SQL3触发器的操作粒度分为逐行(ROW)或以语句(STATEMENT)为单位。•由于触发器的事件只能是数据更新操作,这些操作的执行会引起数据库中的数据变动,因此提出了旧值(oldvalue)和新值(newvalue)的概念,其目的是为了在触发器语句的条件和动作部分可以用到而定义一个引用名。这些新旧值作为一种过渡值,要么是单个元组,要么是一个结果元组集,一般占据的空间不大,因而一般是暂存在内存中,并随着触发器的执行完毕而释放所占用的内存空间。SQL3的触发器语法中的REFERENCING子句就是实现上述的过渡值引用问题而设置的。在reference的定义中,OLDAS和NEWAS分别定义元组的旧值和新值的引用名,用于逐行监控;而OLD_TABLEAS和NEW_TABLEAS分别定义元组集的旧值和新值的引用名,用于按语句监控。5.2.2在商业DBMS中的触发器•1.IBMDB2•IBMDB2的触发器语法定义如下:•DB2trigger::=CREATETRIGGERtriggername•{NOCASCADEBEFORE|AFTER}triggerevent•ONtablename•[REFERENCINGreferences]•FOREACH{ROW|STATEMENT}MODEDB2SQL•[WHEN(condition)]•{SQLSTATEMENTS|BEGINATOMICSQLSTATEMENTSEND}•其中:•triggerevent::=INSERT|DELETE|UPDATE[OFcolumnnames]•reference::=OLDASoldvaluetuple|•NEWASnewvaluetuple|•OLD_TABLEASoldvaluetablename|•NEW_TABLEASnewvaluetablename•在DB2的触发器中,被触发的SQL语句可以包含DB2函数和用户自定义函数。用户自定义函数使用C/C++语言编写的,除用于一般的SQL数据控制操作,还可以允许触发器执行非SQL操作类型。•2.Oracle•Oracle的触发器语法定义如下:•oracletrigger::={CREATE|REPLACE}TRIGGERtriggername•{BEFORE|AFTER}triggerevent•ONtablename•[[REFERENCINGreferences]•FOREACHROW[WHEN(condition)]]•PL/SQLblock•其中,•triggerevent::=INSERT|DELETE|UPDATE[OFcolumnnames]•reference::=OLDASoldvaluetuple|•NEWASnewvaluetuple•由其语法可知触发的动作部分在PL/SQL语句块中,可以包含各种声明和调用外部过程,但不包含数据定义语句或事务控制语句。5.2.3触发器的使用•虽然各个RDBMS的触发器语法都有些差异,但总体结构都是依照ECA规则定义的。下面我们按照标准的SQL3语法来举几个例子说明触发器的使用。•在学生课程管理数据库中,有如下三个表•学生表:Student(Sno,Sname,Ssex,Sdept,Sage)•课程表:Course(Cno,Cname,Ccredit)•选修表:SC(Sno,Cno,Grade)•1.引用完整性约束的实现•通过分析,不难得出共有如下六种操作会影响到引用的完整性:•SC表的INSERT操作•Student表的DELETE操作•Course表的DELETE操作•SC表UPDATE(Sno,Cno)操作•Course表UPDATE(Cno)操作•Student表UPDATE(Sno)操作•以Student的DELETE操作为例说明触发器的使用:因为在SC表中,外键Sno的定义为CASCADE,所以当在Student表中删除一个元组时,要级联删除SC表中引用该元组的主键作为外键的所有元组。触发器语句如下:•CREATETRIGGERstudent_delete_trigger•AFTERDELETEONStudent•REFERENCINGOLDASOldRow•FOREACHROW•WHEN(EXISTS(•SELECT*FROMSC•WHERESno=OldRow.Sno))•DELETEFROMSC•WHERESno=OldRow.Sno;•2.导出数据的及时更新•一个典型的例子就是实视图的更新,实视图是由基表导出的表,作为一个实在的表存储在数据库中。恰当使用实视图可以提高查询速度,但在基表更新时,要保证实视图要及时刷新。•假设我们要对“计算机”系的学生成绩表CSCourse创建一个实视图,则可以由下面的语句创建:•SELECTSname,Cno,Grade•FROMStudent,SC•WHEREStudent.Sno=SC.SnoANDSdept=’计算机’;•通过分析,可以得出下列的操作影响CSCourse的值:•Student表DELETE操作,且删除元组中有院系为计算机系的元组•Student表INSERT操作,且删除元组中有院系为计算机系的元组•Student表UPDATE(SName,Sno,Sdept)操作•SC表DELETE操作•SC表INSERT操作•SC表UPDATE操作•下面以Student表的DELETE操作为例,说明实视图的更新:如果Student删除的元组中有“计算机”系的元组,则要更新CSCourse表。一个简单的办法就是删除整个CSCourse表的全部内容,然后再生成新的CSCourse表。触发器语句如下:•CREATETRIGGERcscourse_delete_trigger•AFTERDELETEONSTUDENT•REFERENCINGOLD_TABLEASOT•FOREACHSTATEMENT•WHEN(EXISTS(•SELECT*FROMOT•WHERESdept=‘计算机’))•DELETEFROMCSCourse;•INSERTINTOCSCourse•SELECTSname,Cno,Grade•FROMStudent,SC•WHEREStudent.Sno=SC.SnoANDSdept=’计算机’;•其中,OT是表的变量名作为对旧表的引用。5.2.3触发器的优缺点•1.触发器的优点安全性•基于数据库的值使用户具有操作数据库的某种权利。具体表现在:可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。•审计•可以跟踪用户对数据库的操作。表现在:•审计用户操作数据库的语句。•把用户对数据库的更新写入审计表。•实现复杂的非标准的数据库相关完整性规则•在修改或删除时级联修改或删除其它表中与之匹配的行。•在修改或删除时把其它表中与之匹配的行设成NULL值。•在修改或删除时把其它表中与之匹配的行级联设成缺省值。•触发器能够拒绝或回滚那些破坏相关完整性的变化,取消试图进行数据更新的事务。•2.触发器的缺点触发事件是简单事件•不能从简单的事件构造复杂事件的能力,也不能由用户定义其所需的事件的能力。现时的触发器技术缺乏一个统一的标准•由于各个RDBMS厂商实现触发器的途径不一样,甚至它们定义同一个触发器的语法也不一样。这些造成了它们必依附在特定系统上,对软件环境的具体实现依赖性很大,不利于数据库的移植和代码一致性。规则的执行方式不完备当事件发生前或发生后,如果满足条件,则规则处于触发状态,动作将被执行。就动作触发的时间而言,可分为三类:立即式、延迟式、并发式。现时支持触发器的RDBMS一般都只支持立即执行方式,对于推迟到事务的末尾执行的延迟式以及具有并发/并行的并发式,由于其实现机制的复杂性,目前几乎还没有一个DBMS产品支持这两种执行方式。5.3主动数据库体系结构•在功能上,一个主动数据库系统(ADBS)由一个传统数据库系统(DBS)和一个事件驱动的知识库(简称事件库EB)及其相应的事件监视器(EM)组成,用公式表示为:•ADBS=DBS+EB+EM•DBS(DatabaseSystem)这个部分
本文标题:高级数据库技术-第5章 主动数据库
链接地址:https://www.777doc.com/doc-4145321 .html