第5章数据库安全内容摘要:

间的约束关系。 例:订货关系中包含发货量、订货量等列, 发货量不得超过订货量 教师关系中包含职称、工资等列, 教授的工资不得低于 700元 – 静态元组约束只局限在单个元组上 完整性约束条件(续) 3. 静态关系约束 – 在一个关系的各个元组之间或者若干关系之间常常存在各种联系或约束 – 常见静态关系约束 1) 实体完整性约束 2) 参照完整性约束 3) 函数依赖约束 4) 统计约束 完整性约束条件(续) – 函数依赖约束 • 大部分函数依赖约束都是隐含在关系模式结构中的,特别是规范化程度较高的关系模式(例如 3NF或 BCNF),都由模式来保持函数依赖。 • 但是在实际应用中,为了不使信息过于分离,常常不过分地追求规范化。 完整性约束条件(续) – 函数依赖约束 (续 ) • 这样在关系的字段间就可以存在一些函数依赖需要显式地表示出来。 例:在学生-课程-教师关系 SJT(S,J,T)中存在如下的函数依赖 ((S,J) →T, T→J),将 (S,J)作为主码,还需要显式地表示T→J这个函数依赖。 完整性约束条件(续) – 统计约束 • 定义某个字段值与一个关系多个元组的统计值之间的约束关系 例:规定部门经理的工资不得高于本部门职工平均工资的 5倍,不得低于本部门职工平均工资的 2倍。 本部门职工的平均工资值是一个统计计算值。 完整性约束条件(续) 4. 动态列级约束 – 动态列级约束是修改列定义或列值时应满足的约束条件 完整性约束条件(续) – 常见动态列级约束 1) 修改列定义时的约束 例:规定将原来允许空值的列改为不允许空值时,如果该列目前已存在空值,则拒绝这种修改。 2) 修改列值时的约束 • 修改列值有时需要参照其旧值,并且新旧值之间需要满足某种约束条件。 例:职工工资调整不得低于其原来工资,学生年龄只能增长 完整性约束条件(续) 5. 动态元组约束 – 动态元组约束是指修改某个元组的值时需要参照其旧值,并且新旧值之间需要满足某种约束条件。 例 : 职工工资调整不得低于其原来工资 +工龄 * 完整性约束条件(续) 6. 动态关系约束 – 动态关系约束是加在关系变化前后状态上的限制条件 例:事务一致性、原子性等约束条件 完整性约束条件(续) 完整性约束条件小结 粒 度 状态 列 级 元 组 级 关 系 级 静 态 列定义 类型 格式 值域 空值 元组值应满足的条件 实体完整性约束 参照完整性约束 函数依赖约束 统计约束 动 态 改变列定义或列值 元组新旧值之间应满足的约束条件 关系新旧状态间应满足的约束条件 完整性 完整性约束条件 完整性控制 Oracle的完整性 完整性控制 一、 DBMS的完整性控制机制 二、关系系统三类完整性的实现 三、参照完整性的实现 一、 DBMS的完整性控制机制 DBMS的完整性控制机制的主要功能 1. 定义功能 2. 检查功能 3. 违约反应 DBMS的完整性控制机制(续) 1. 定义功能 – 一个完善的完整性控制机制应该允许用户定义各类完整性约束条件。 DBMS的完整性控制机制(续) 2. 检查功能 – 立即执行的约束 (Immediate constraints) • 检查是否违背完整性约束的时机通常是在一条语句执行完后立即检查,我们称这类约束为立即执行的约束 – 延迟执行的约束 (Deferred constrainsts) • 在某些情况下,完整性检查需要延迟到整个事务执行结束后再进行,我们称这类约束为延迟执行的约束 DBMS的完整性控制机制(续) 例:银行数据库中“借贷总金额应平衡”的约束 就应该是延迟执行的约束 – 从账号 A转一笔钱到账号 B为一个事务,从账号 A转出去钱后账就不平了,必须等转入账号 B后账才能重新平衡,这时才能进行完整性检查。 DBMS的完整性控制机制(续) 3. 违约反应 – 拒绝该操作 – 其他处理方法 DBMS的完整性控制机制(续) 完整性规则的形式化表述 一条完整性规则可以用一个五元组表示 : (D, O, A, C, P) – D( Data) 约束作用的 数据对象 ; – O( Operation) 触发完整性检查的 数据库操作 ,即当用户发出什么操作请求时需要检查该完整性规则,是立即检查还是延迟检查; – A( Assertion) 数据对象必须满足的 断言 或 语义约束 ,这是规则的主体; – C( Condition) 选择 A作用的数据对象值的 谓词 ; – P( Procedure) 违反完整性规则时触发的 过程。 DBMS的完整性控制机制(续) 例 1:在“ 学号不能为空 ”的约束中 D 约束作用的对象为 Sno属性 O 插入或修改 Student 元组时 A Sno不能为空 C 无( A可作用于所有记录的 Sno属性) P 拒绝执行该操作 DBMS的完整性控制机制(续) 例 2:在“ 教授工资不得低于 1000元 ”的约束中 D 约束作用的对象为工资 Sal属性 O 插入或修改职工元组时 A Sal不能小于 1000 C 职称 =′教授 ′(A仅作用于职称 =‘教授’的记录 ) P 拒绝执行该操作 二、关系系统三类完整性的实现  目前许多关系数据库系统都提供了定义和检查实体完整性、参照完整性和用户定义的完整性的功能。  对于违反实体完整性规则和用户定义的完整性规则的操作一般都是采用拒绝执行的方式进行处理。  而对于违反参照完整性的操作,并不都是简单地拒绝执行,有时还需要采取另一种方法,即接受这个操作,同时执行一些附加的操作,以保证数据库的状态仍然是正确的。 三、参照完整性的实现 例 :职工-部门数据库包含职工表 EMP和部门表 DEPT – DEPT关系的主码为部门号 Deptno – EMP关系的主码为职工号 Empno, 外码为部门号 Deptno – 该 Deptno与 DEPT关系中 Deptno相对应 – 称 DEPT为被参照关系或目标关系, EMP为参照关系 RDBMS实现参照完整性时需要考虑以下 4方面: 参照完整性的实现(续) 1. 外码是否可以接受空值的问题 – 外码是否能够取空值是依赖于应用环境的语义的。 – 在实现参照完整性时,系统除了应该提供定义外码的机制,还应提供定义外码列是否允许空值的机制。 参照完整性的实现(续) 例 1:在职工-部门数据库中, EMP关系包含有外码 Deptno,某一元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作。 这和应用环境的语义是相符的,因此 EMP的Deptno列应允许空值。 参照完整性的实现(续) 例 2:在学生-选课数据库中, Student关系为被参照关系,其主码为 Sno。 SC为参照关系,外码为 Sno。 若 SC的 Sno为空值,则表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在 Grade列中。 这与学校的应用环境是不相符的,因此 SC的 Sno列不能取空值。 参照完整性的实现(续) 2. 删除被参照关系的元组时的问题 – 出现违约操作的情形 • 需要删除被参照关系的某个元组,而参照关系有若干元组的外码值与被删除的被参照关系的主码值相对应 参照完整性的实现(续)  2. 在被参照关系中删除元组时的问题 (续 ) – 违约反应:可有三种策略 • 级联删除( CASCADES) • 受限删除( RESTRICTED) • 置空值删除( NULLIFIES) 这三种处理方法,哪一种是正确的,要依应用环境的语义来定。 参照完整性的实现(续) – 级联删除 • 将参照关系中所有外码值与被参照关系中要删除元组主码值相对应的元组一起删除。 – 受限删除 • 只有当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相对应时,系统才执行删除操作,否则拒绝此删除操作。 参照完整性的实现(续) – 置空值删除 • 删除被参照关系的元组,并将参照关系中所有与被参照关系中被删除元组主码值相等的外码值置为空值。 参照完整性的实现(续) 例:要删除 Student关系中 Sno=950001的元组, 而 SC关系中有 4个元组的 Sno都等于 950001。 – 级联删除:将 SC关系中所有 4个 Sno=950001的元组一起删除。 如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去。 – 受限删除:系统将拒绝执行此删除操作。 参照完整性的实现(续) – 置空值删除:将 SC关系中所有 Sno=950001的元组的 Sno值置为空值。 – 在学生选课数据库中,显然第一种方法和第二种方法都是对的。 第三种方法不符合应用环境语义。 参照完整性的实现(续) 3. 修改被参照关系中主码的问题 – 两种策略 • (1)不允许修改主码 • (2)允许修改主码 参照完整性的实现(续) – 允许修改主码策略 • 违约操作 要 修改被参照关系 中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值 要 修改参照关系 中某些元组的主码值,而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值 参照完整性的实现(续) – 允许修改主码策略 (续 ) • 违约反应 (1) –修改的关系是被参照关系:与删除类似 187。 级联修改 187。 受限修改 187。 置空值修改 参照完整性的实现(续) – 级联修改 • 修改被参照关系中主码值同时,用相同的方法修改参照关系中相应的外码值。 – 受限修改 • 拒绝此修改操作。 只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。 – 置空值修改 • 修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。 参照完整性的实现(续) 例:学生 950001休学一年后复学,这时需要将 Student关系中 Sno=950001的元组中 Sno值改为 960123。 而 SC关系中有 4个元组的Sno=950001 – 级联修改:将 SC关系中 4个 Sno=950001元组中的 Sno值也改为 960123。 如果参照关系同时又是另一个关系的被参照关系,则这种修改操作会继续级联下去。 参照完整性的实现(续) – 受限修改:只有 SC中没有任何元组的Sno=950001时,才能修改 Student表中Sno=950001的元组的 Sno值改为 960123。 – 置空值修改:将 Student表中 Sno=950001的元组的 Sno值改为 960123。 而将 S表中所有Sno=950001的元组的 Sno值置为空值。 – 在学生选课数据库中只有第一种方法是正确的。 参照完整性的实现(续) – 允许修改主码策略 (续 ) • 违约反应 (2) –修改的关系是参照关系:与插入类似 187。 受限修改 187。 递归修改 参照完整性的实现(续) 结论 – RDBMS在实现参照完整性时,除了需要向用户提供定义主码、外码的机制外,还需要向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法。 完整性 完整性约束条件 完整性控制 Oracle的完整性 Oracle的完整性 一、 Oracle中的实体完整性 二、 Oracle中的参照完整性 三、 Oracle中用户定义的完整性 一、 ORACLE中的实体完整性  ORACLE在 CREATE TABLE语句中提供了PRIMARY KEY子句,供用户在建表时指定关系的主码列。 – 在列级使用 PRIMARY KEY子句 – 在表级使用 PRIMARY KEY子句 ORACLE中的实体完整性(续) 例 1:在学生选课数据库中,要定义 Student表的 Sno属性为主码 CREATE TABLE Student (Sno NUMBER(8),。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。