34
高 高 高 高 高 高 高 高 高 高 高 高 高高高高高高高高高高 isstn @zsu.edu.cn

高 级 数 据 库 技 术 完 整 性

Embed Size (px)

DESCRIPTION

高 级 数 据 库 技 术 完 整 性. 汤 娜 中山大学计算机科学系 [email protected]. 系统篇. 数据库系统中的数据是由 DBMS 统一管理和控制的,为了适应数据共享的环境, DBMS 必须提供数据保护能力,以保证数据库中数据的安全可靠和正确有效。 数据保护 数据库完整性 数据库恢复技术 并发控制 数据库安全性. 完整性类型 完整性约束条件 完整性控制 参照完整性控制 SQL 中的完整性约束机制. 数据库结构完整性 数据库对象能正确地创建、格式化和维护 数据语义完整性的基本含义是指数据的正确性、有效性、和相容性。 - PowerPoint PPT Presentation

Citation preview

Page 1: 高 级 数 据 库 技 术 完 整 性

高 级 数 据 库 技 术

完 整 性

汤 娜中山大学计算机科学系

[email protected]

Page 2: 高 级 数 据 库 技 术 完 整 性

系统篇 数据库系统中的数据是由 DBMS 统一管理和控制的,

为了适应数据共享的环境, DBMS 必须提供数据保护能力,以保证数据库中数据的安全可靠和正确有效。

数据保护数据库完整性数据库恢复技术并发控制数据库安全性

Page 3: 高 级 数 据 库 技 术 完 整 性

完整性类型

完整性约束条件

完整性控制

参照完整性控制

SQL 中的完整性约束机制

Page 4: 高 级 数 据 库 技 术 完 整 性

数据库结构完整性 数据库对象能正确地创建、格式化和维护

数据语义完整性的基本含义是指数据的正确性、有效性、和相容性。 正确性。数据的合法性 有效性。数据是否在有效范围内 相容性。指表示同一个事实的两个数据应该一致。

Page 5: 高 级 数 据 库 技 术 完 整 性

数据库结构完整性 结构问题的类型

索引(如做数据恢复,没有重做指针) 特定的数据类型(如超大对象) 数据页的表头 备份文件

结构问题的管理 采用工具由 DBMS 进行检查

sybase\microsoft Sql Server : DBCC 应用程序DB2 : CHECK 和 REPAIR 工具Informix : TBCHECK

Page 6: 高 级 数 据 库 技 术 完 整 性

作用的对象(粒度):关系、元组、列 对象状态:动态、静态。

粒 度状 态

列 级 元 组 级 关 系 级

静 态 列定义类型 格式值域 空值

元组值应该满足的条件

实体完整性约束参照完整性约束函数依赖约束统计约束

动 态 改变列定义或列值

元组新旧值之间应满足的约束条件

关系新旧状态应满足的约束条件

数据语义完整性

Page 7: 高 级 数 据 库 技 术 完 整 性

1 .  静态约束1 )静态列约束:是对一个列的取

值域等的限制。

对数据类型的约束 ; 对数据格式的约束 ; 对取值范围或取值集合的约束; 对空值的约束 ; 其它约束 ;

Page 8: 高 级 数 据 库 技 术 完 整 性

2 )静态元组约束:规定组成一个元组的各个列之间的约束关系。

例如:库存关系中出库数量不能大于库存数量。

Page 9: 高 级 数 据 库 技 术 完 整 性

3 )静态关系约束:反映了一个关系中各个元组之间或者若干关系之间存在的联系或约束。

实体完整性约束;

参照完整性约束;

函数依赖约束;

统计依赖约束

Page 10: 高 级 数 据 库 技 术 完 整 性

2 .动态约束 1 )动态列约束

2 )动态元组约束

3 )动态关系约束

数据库从一种状态转变为另一种状态时,新、旧值之间所应满足的约束条件。

Page 11: 高 级 数 据 库 技 术 完 整 性

2 .  动态约束1 )动态列约束:修改属性的定义

或者属性的值的限制。

• 修改定义时的约束•修改属性值时的约束:新值和旧值之间的约束

Page 12: 高 级 数 据 库 技 术 完 整 性

2 .  动态约束1 )动态元组约束:修改元组时新

旧元组之间的约束关系

• 如现有工资 〉原有工资 + 工龄 *1.5

Page 13: 高 级 数 据 库 技 术 完 整 性

2 .  动态约束1 )动态关系约束:关系新旧状态

应该满足的约束关系

•如:事务的一致性,原子性

Page 14: 高 级 数 据 库 技 术 完 整 性

完整性控制 完整性控制机制应具有的三个功能

定义功能。提供定义完整性约束条件的机制检查功能。检查用户发出的操作请求是否违背了约束条件。

立即执行约束(一条语句执行完成后立即检查) 延迟执行约束(整个事务执行完毕后再检查)

如果发现用户操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。

机制的工作原理定义完整性时定义完整性后

Page 15: 高 级 数 据 库 技 术 完 整 性

一条完整性规则用五元组( D,O,A,C,P )来描述D(Data) 约束作用的数据对象O(Operation) 触发完整性检查的数据库操作。即当用户

发出什么操作请求时需要检查该完整性规则,是立即检查还是延迟检查。

A(Assertion) 数据对象要满足的断言或语义规则C(Condition) 选择 A 作用的数据对象值的谓词P(Procedure) 违反完整性规则时触发的过程

学号不能为空 教授工资不得低于 1000元D 约束的对象为 SNO属性 约束的对象为 Sal属性O 插入和修改 STUDENT元组时 插入和修改职工元组时A SNO不能为空 Sal不能小于 1000C 无(作用于所有记录的 SNO属性) 职称=‘ ’教授 ( 作用于职称=‘ ’教授 的记录)P 拒绝执行 拒绝执行

Page 16: 高 级 数 据 库 技 术 完 整 性

实体完整性 定义主键时定义,只约束定义了主键的表 A

由 DBMS 负责检查(对表 A 做插入和修改操作时)

对于违反实体完整性的操作,系统一般采用拒绝执行的方式进行处理

Page 17: 高 级 数 据 库 技 术 完 整 性

创建关系数据库 S (Sno ,Sname,Ssex,Sage ,Sdept) ; C (Cno ,Cname ,Pno) ; SC (Sno,Cno,Grade) 。

CREATE TABLE S(Sno CHAR(5) NOT NULL UNIQUE,

Sname CHAR(20) , Ssex CHAR(1),Sage INT,Sdept CHAR(20),

PRIMARY KEY(Sno),CHECK(Sa BETWEEN 15 AND 25))

CREATE TABLE C (Cno CHAR(4)) NOT NULL,

Cname CHAR(30),Pno CHAR(4),

PRIMARY KEY(Cno))

CREATE TABLE SC (Sno CHAR(5) NOT NULL,

Cno CHAR(4) NOT NULL,Grade CHAR(1),

PRIMARY KEY(Sno,Cno),

FOREIGN KEY(Sno) REFERENCE S(Sno) ON DELETE CASCADE,

FOREIGN KEY(Cno) REFERENCE C(Cno) ON DELETE No Action)

Page 18: 高 级 数 据 库 技 术 完 整 性

参照完整性 定义外键时定义,约束参照表 A 和被参照表 B 。

特殊的完整性定义 由 DBMS 负责检查(较复杂,四种情况) 对于违反参照完整性有时候并不是简单拒绝执行,而

是接受该操作,同时执行必要的附加操作 对于违反用户自定义完整性的操作,系统一般采

用拒绝执行的方式进行处理或根据用户定义的操作来处理

Page 19: 高 级 数 据 库 技 术 完 整 性

1. 两张表互相参照的问题 2. 表的自参照问题 Create table employee

(emp_ id int NOT NULL PRIMARY KEY,

emp_name varchar(30) NOT NULL,

mgr_id int NOT NULL REFERENCES employee(emp_ id ))

容易造成无法启动的情况,可以在事务提交前禁用参照完整性

Page 20: 高 级 数 据 库 技 术 完 整 性

(1) 在被参照关系中删除元组的问题 级联删除( CASCADES) 将参照关系中与被参照关

系中要删除元组主键值相同的元组一起删除。 受限删除 (RESTRICTED) 只有参照关系中没有元组与被参照关系中要删除元组主键值相同时才执行删除操作,否则拒绝。

置空值删除 (SET NULL)删除被参照关系中的元组,同时将参照关系中相应元组的外键值置为空

参照完整性控制

Page 21: 高 级 数 据 库 技 术 完 整 性

(2) 在参照关系中插入元组的问题 受限插入 只有被参照关系中有元组与参照关系中要插入

元组外键值相同时才执行插入操作,否则拒绝。 递归插入插入元组外键值在被参照关系中没有元组相同,

则首先向被参照关系插入元组,其主键值等于参照关系插入元组的外键值,然后再向参照关系插入元组。

Page 22: 高 级 数 据 库 技 术 完 整 性

(3) 修改关系中主键 / 外键的问题 有的 DBMS 不允许修改; 有的 DBMS允许

如果修改的是主键,则优级联修改、拒绝修改、置空值修改三种方式

如果修改的是外键,则受限插入和递归插入两种策略

Page 23: 高 级 数 据 库 技 术 完 整 性

INSERT DELETE UPDATEPRIMARY KEY 不需要检查 ON DELETE …(用户

显示定义的方式,提供两 种 : cascade 和 noaction)Or default (系统默认的方式 no action)

ON UPDATE…(用户显示定义的方式,提供两 种 : cascade 和 noaction)Or default (系统默认的方式 no action)

FOREIGN KEY 拒绝执行 不需要检查 拒绝执行

总结: 1. 在四种情况下 DBMS 要进行检查:

对参照表进行插入和修改对被参照表进行删除和修改

2.sql server 四种情况违反参照完整性的处理方法:

Page 24: 高 级 数 据 库 技 术 完 整 性

1. 在创建和修改基表模式时说明约束( Create 语句及 Alter 语句)

2. 规则和自定义数据类型 3. 触发器 (triggle)说明约束

一个触发器应包括下面两个功能:( 1 )指明什么条件下触发器被执行。( 2 )指明触发器执行什么动作。

4. 存储过程说明约束 5. 用断言说明约束( sql server2000 不支持)

SQL server 2000 提供的完整性约束的表达方式

Page 25: 高 级 数 据 库 技 术 完 整 性

( 1 )在创建和修改基表模式时说明约束 Create语句(创建新表时创建)

数据类型默认值: default (常量 / 函数)not null, unique (唯一性约束)

一起用则表示相应的列为 candidate keycheck (检查约束)

限制 只能对本表中的列做约束 只能是用 sql 结构的一个有限子集

constraint

Alter 语句(对已存在的表创建)

Page 26: 高 级 数 据 库 技 术 完 整 性

CREATE TABLE publishers

( pub_id char(4) NOT NULL

CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED

CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')

OR pub_id LIKE '99[0-9][0-9]'),

pub_name varchar(40) NULL,

city varchar(20) NULL,

state char(2) NULL,

country varchar(30) NULL DEFAULT('USA')

)

Page 27: 高 级 数 据 库 技 术 完 整 性

好处: 将业务规则直接在数据库中增加;不必是用额外

的应用程序逻辑,一旦定义,业务规则会物理的实现,不会被忽略

即时执行 减少开发小组的编码量 减少维护量(采用应用程序逻辑可能代码中多个会有多个使用点)

Page 28: 高 级 数 据 库 技 术 完 整 性

( 2 )规则和自定义数据类型 如果多个列使用同一类型的约束

形式:CREATE RULE rule AS condition_expression

sp_bindrule [ @rulename = ] 'rule' , [ @objname = ] 'object_name’

可一般绑定到某一列,或者是用户自己定义的数据类型例子: EXEC sp_bindrule 'today', employees.[hire date]'

EXEC sp_bindrule 'rule_ssn', 'ssn’

注意多个约束之间的语义冲突emp_type char(8) Default “new”

check (emp_type in(“temp”,”fulltime”,”contract”))

Page 29: 高 级 数 据 库 技 术 完 整 性

CREATE RULE rule AS condition_expression规则可以是 WHERE 子句中任何有效的表达式,并且可以包含诸如算术运算符、关系运算符和谓词(如 IN 、 LIKE 、 BETWEEN )之类的元素。规则不能引用列或其它数据库对象。可以包含不引用数据库对象的内置函数。

condition_expression 包含一个变量。每个局部变量的前面都有一个 @ 符号。该表达式引用通过 UPDATE 或 INSERT 语句输入的值。在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是 @ 符号。

CREATE RULE range_rule AS @range >= $1000 AND @range < $20000

CREATE RULE list_rule AS @list IN ('1389', '0736', '0877')

CREATE RULE pattern_rule AS @value LIKE '_ _-%[0-9]'

Page 30: 高 级 数 据 库 技 术 完 整 性

(3)触发器(triggle) 可以用来实施更为复杂的数据检查,可以根据相

应操作;可以不但参考定义自身的表中的数据,还可以参考其他表中的数据

有如下触发器 {FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ][d

elete]}FOR update 表中进行更新操作时被激发FOR delete 表中进行删除操作时被激发FOR insert 表中进行插入操作时被激发 instead of 指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。

after 在一个触发动作发生之后触发

Page 31: 高 级 数 据 库 技 术 完 整 性

•使用 deleted 和 insert 表(在内存中,触发器完成运行后,这些表就不能再访问)

•deleted 表保存受 delete 和 update影响的行的副本•insert 表保存在 insert 和 update 之后添加到触发器中的行的副本

例子: (当业务员插入一条新的销售记录时,要修改与其相关的年销售量表)

CREATE TRIGGER Update_ytd_salesON salesFOR INSERTASSELECT *FROM insertedUPDATE titlesSET ytd_sales= ytd_sales+qtyFROM insertedWHERE titles.title_id= inserted.title_idGO

Page 32: 高 级 数 据 库 技 术 完 整 性

( 4 )存储过程( Procedure) create procedure 创建; 直接使用存储过程的名字调用或 exec 存储过程名 例子:对修改关系中主键 / 外键的问题

create procedure delete_sc@student_num snoas

begin delete scwhere sno= @student_numdelete studentswhere sno= @student_num

end

Page 33: 高 级 数 据 库 技 术 完 整 性

触发器和存储过程的区别 1 。是否附属于唯一的表

触发器附属于唯一的表,而存储过程可访问多个表 2 。是否事件驱动

触发器由事件驱动,而存储过程由显式的指令调用

Page 34: 高 级 数 据 库 技 术 完 整 性

(5) 断言create assertion < 断言名 > check < 条件 >

例如: create assertion ass1 check

(10>=all(select count(cno)

from sc

group by sno))