Principles and Applications of the Database 数据库原理及应用 Principles and Applications of the Database 第6章 数据库安全性和完整性 An Introduction to Database System
第6章 数据库安全性和完整性 本章导读 本章主要介绍数据库的安全性和完整性,包括数据库安全性的定义,数据库安全性控制采取的一些措施,数据库完整性的定义,完整性约束条件的类型,完整性控制机制,并用SQL语句给出了如何描述授权、角色、建立视图、约束以及触发器的方式等。 仲恺农业工程学院
第6章 数据库安全性和完整性 重点: 难点: 1.安全性的基本概念 2.完整性的基本概念 1.域完整性控制方法 2.实体完整性控制方法 3. 参照完整性控制方法 仲恺农业工程学院
第6章 数据库安全性和完整性 本章要点 安全性和完整性的基本概念 数据库系统的6种安全性技术 域完整性控制方法 实体完整性控制方法 参照完整性控制方法 仲恺农业工程学院
第6章 数据库安全性和完整性 6.1 概述 6.2 数据库的安全性 6.3 数据库的完整性 6.4 SQL的完整性控制 本章小结 6.1 概述 6.2 数据库的安全性 6.3 数据库的完整性 6.4 SQL的完整性控制 本章小结 仲恺农业工程学院
6.1 概述 数据库的数据保护主要包括数据库的安全性和完整性保护机制。 6.1 概述 数据库的数据保护主要包括数据库的安全性和完整性保护机制。 安全性:就是要保证数据库中数据的安全,防止未授权用户随意修改数据库中的数据,确保数据的安全。 完整性:是数据库的一个重要特征,也是保证数据库中的数据切实有效、防止错误、实现商业规则的一种重要机制。 仲恺农业工程学院
6.1 概述 防范对象: 安全性的防范对象:非法用户和非法操作。 完整性的防范对象:是不合法的语义数据。 仲恺农业工程学院
第6章 数据库安全性和完整性 6.1 概述 6.2 数据库的安全性 6.3 数据库的完整性 6.4 SQL的完整性控制 本章小结 6.1 概述 6.2 数据库的安全性 6.3 数据库的完整性 6.4 SQL的完整性控制 本章小结 仲恺农业工程学院
6.2 数据库的安全性 安全性问题是计算机系统中普遍存在的一个问题,而在数据库系统中显得尤为突出。 6.2 数据库的安全性 安全性问题是计算机系统中普遍存在的一个问题,而在数据库系统中显得尤为突出。 原因:数据库系统中大量数据集中存放,而且为许多最终用户直接共享。数据库系统建立在操作系统之上,而操作系统是计算机系统的核心,因此数据库系统的安全性与计算机系统的安全性息息相关。 仲恺农业工程学院
6.2 数据库的安全性 在一般计算机系统中,安全措施是一层一层设置的,下图是常见的计算机系统安全模型。 用户 DBMS OS DB 6.2 数据库的安全性 在一般计算机系统中,安全措施是一层一层设置的,下图是常见的计算机系统安全模型。 用户 DBMS OS DB 用户标识和鉴别 存取控制 操作系统 安全保护 密码存储 仲恺农业工程学院
6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2.6 统计数据库的安全 仲恺农业工程学院
用户标识与鉴别是系统提供的最外层安全保护措施。 当用户进入数据库系统时,需要提供用户的标识,系统根据标识鉴别此用户是不是合法用户: 6.2.1 用户标识与鉴别 用户标识与鉴别是系统提供的最外层安全保护措施。 当用户进入数据库系统时,需要提供用户的标识,系统根据标识鉴别此用户是不是合法用户: 对于合法的用户,进一步开放数据库的访问权限; 对于非法用户,则拒绝该用户对数据库进行存取操作。 仲恺农业工程学院
用户标识与鉴别的方法比较多,常用的有下几种: 6.2.1 用户标识与鉴别 用户标识与鉴别的方法比较多,常用的有下几种: 1.输入用户名标识合法身份 2.回答用户口令标识身份 3.通过回答随机数的运算结果标识合法身份 4.通过个人特征鉴别标识合法身份 仲恺农业工程学院
6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2.6 统计数据库的安全 仲恺农业工程学院
6.2.2 存取控制 数据库安全性所关心的主要是DBMS的存取控制机制。存取控制是确保具有授权资格的用户访问数据库的权限,同时使得所有未被授权的人员无法访问数据库的机制。 1.存取控制机制的构成部分 (1)定义用户权限:用户权限是指用户对于数据对象能够执行的操作种类。进行用户权限定义,系统必须提供有关用户定义权限的语言。 (2)系统进行权限检查:每当用户发出存取数据库的操作请求后,DBMS首先查找数据字典,进行合法权限检查,如果用户的操作请求没有超出其数据操作权限,则准予执行其数据操作;否则,拒绝其执行此操作。 仲恺农业工程学院
6.2.2 存取控制 2.存取机制的类别 (1)自主存取控制 :在自主存取控制方法中,用户对于不同的对象有不同的存取权限;不同的用户对同一对象的存取权限也不同;用户也可以将自己拥有的权限传授给其他用户。 (2)强制存取控制 :在强制存取控制中,每一个数据对象被标以一定的密级;每一个用户也被授予某个级别的访问许可证;对于任意一个对象,只有具有合法许可证的用户才可以存取。与自主存取控制相比,强制存取控制比较严格。 仲恺农业工程学院
6.2.2 存取控制 3. 自主访问控制方法 (1)用户分类与权限 对于一个数据库,不同的用户有不同的访问要求和使用权限。 6.2.2 存取控制 3. 自主访问控制方法 (1)用户分类与权限 对于一个数据库,不同的用户有不同的访问要求和使用权限。 一般可以将数据库的用户分为四类: 数据库管理员 数据库对象的属主 一般数据库用户 公共用户 仲恺农业工程学院
(Database Administrator,DBA) —— 6.2.2 存取控制 数据库管理员 (Database Administrator,DBA) —— 拥有支配整个数据库资源的特权,对数据库拥有最大的特权,因而也对数据库负有特别的责任。DBA特权命令包括给各个独立的帐户、用户或者用户组授予特权和回收特权,以及把某个适当的安全分类级别指派给某个用户帐户。 仲恺农业工程学院
是数据库的创建者,他除了一般数据库用户拥有的权力外,还可以授予或收回其他用户对其所创建的数据库的存取权。 6.2.2 存取控制 数据库对象的属主 —— 是数据库的创建者,他除了一般数据库用户拥有的权力外,还可以授予或收回其他用户对其所创建的数据库的存取权。 一般数据库用户—— 就是通过授权可对数据库进行操作的用户。 仲恺农业工程学院
6.2.2 存取控制 公共用户—— 是为了方便共享数据操作而设置的,它代表全体数据库用户,如果把某个数据对象的某项操作授权给公共用户,则一个合法的数据库用户都能进行该项数据操作。 仲恺农业工程学院
用户使用数据库的方式称为权限。使用数据库的权限分为二类:访问数据特权和修改数据库模式的特权。 6.2.2 存取控制 用户使用数据库的方式称为权限。使用数据库的权限分为二类:访问数据特权和修改数据库模式的特权。 访问数据特权包括: 读数据权限、插入数据权限、修改数据权限和删除数据权限。 修改数据库模式的特权包括: 创建和删除索引的索引权限,创建新表的资源权限,允许修改表结构的修改权限,允许撤销关系表的撤销权限等。 仲恺农业工程学院
6.2.2 存取控制 (2)SQL的数据控制功能 SQL对自主存取控制提供了支持,其DCL主要是GRANT(授权)语句和REVOKE(收权)语句,DENY(禁用)语句。 ① 授权 由于不同的用户对数据库具有不同的存取权,因此为了保证用户只能访问他有权存取的数据,必须对每个用户授予不同的数据库存取权。 仲恺农业工程学院
授 权 在SQL中,授权语句有两种:授予权限语句和授予角色语句。 授 权 在SQL中,授权语句有两种:授予权限语句和授予角色语句。 一个角色是一组被命名的零个或多个特权。授权一个角色给一个用户,则允许该用户使用被授权的角色所拥有的每一个特权。用户与角色之间存在多对多的联系;一个用户允许被授予多个角色使用,同一个角色的使用被授权予多个用户。一个角色的使用也可以被授权予另一个角色。 仲恺农业工程学院
授予权限语句 语句基本形式为: GRANT 〈权限〉ON 〈数据对象〉TO〈受权者〉[WITH GRANT OPTION] 〈数据对象〉::=〈基表〉︱〈视图〉︱〈属性〉︱… 〈受权者〉::= PUBLIC︱〈授权ID〉 语义:将某作用在指定操作对象上的操作权限,限授予指定的用户。(即数据库对象的访问权限的管理) 如果指定WITH GRANT OPTION子句,则获得某种权限的用户可以把这种权限在授予其他用户。如没有指定该子句,获得授权的用户将不能传播权限(转授)。 仲恺农业工程学院
授予权限语句 【例6-1】在数据库XSBOOK中,将表STUDENT的SELECT操作权限授予所有的用户。 注意:PUBLIC是一个特殊的保留字,代替该数据库系统的全体用户。对于大部分可以公开的数据,可以一次性地授权给PUBLIC,而不必对每个用户逐个授权。 GRANT SELECT ON STUDENT TO PUBLIC; 仲恺农业工程学院
授予权限语句 【例6-2】在数据库XSBOOK中,将表STUDENT的借书证号、姓名字段的UPDATE权限授予给liu。 【例6-3】将对表STUDENT的所有操作特权授予liu。 GRANT UPDATE(借书证号,姓名) ON STUDENT TO liu; GRANT ALL PRIVILEGES ON STUDENT TO liu; 仲恺农业工程学院
授予权限语句 【例6-4】将对表STUDENT中借书证号和专业名的INSERT特权授予liu,并允许他将此特权转授给其他用户。 GRANT INSERT(借书证号,专业名) ON STUDENT TO liu WITH GRANT OPTION; 仲恺农业工程学院
创建角色语句 该语句基本形式为 添加角色 2000:exec Sp_addrole 'rolename' 添加角色 2000:exec Sp_addrole 'rolename' 2005:create role rolename 角色名 把角色拥有的权限赋给用户 EXEC sp_addrolename 'roleName','用户' 仲恺农业工程学院
创建角色语句 例:创建名为Engineering的角色。 EXEC sp_addrole ‘Engineering’ 仲恺农业工程学院
【例6-5】下面的示例将 SQL Server 用户 Michael 添加到当前数据库中的 Engineering 角色。 添加角色成员 【例6-5】下面的示例将 SQL Server 用户 Michael 添加到当前数据库中的 Engineering 角色。 EXEC sp_addrolemember 'Engineering', 'Michael' 仲恺农业工程学院
【例6-6】授予角色 Engineering对 Employees 表的所有权限 授予角色语句 【例6-6】授予角色 Engineering对 Employees 表的所有权限 GRANT ALL ON Employees TO Engineering 【例】授予角色 Engineering对 Orders 表的 SELECT 权限 GRANT SELECT ON Orders TO Engineering 仲恺农业工程学院
当用户将某些权限授给其他用户后,有时还需要把权限收回。收权需要使用REVOKE语句。 收回权限的REVOKE语句: 6.2.2 存取控制 ② 收回权限 当用户将某些权限授给其他用户后,有时还需要把权限收回。收权需要使用REVOKE语句。 收回权限的REVOKE语句: 收回角色的REVOKE语句: REVOKE 〈权限〉ON 〈数据对象〉 FROM 〈受权者〉[{,〈受权者〉}] REVOKE 〈角色ID〉FROM 〈受权者〉[{,〈受权者〉}] 仲恺农业工程学院
【例6-7】将liu对STUDENT表的INSERT权限收回。 6.2.2 存取控制 【例6-7】将liu对STUDENT表的INSERT权限收回。 REVOKE INSERT ON STUDENT FROM liu 仲恺农业工程学院
6.2.2 存取控制 禁用语句基本形式为: DENY 〈权限〉ON 〈数据对象〉TO〈受权者〉[WITH GRANT OPTION] 6.2.2 存取控制 禁用语句基本形式为: DENY 〈权限〉ON 〈数据对象〉TO〈受权者〉[WITH GRANT OPTION] 〈数据对象〉::=〈基表〉︱〈视图〉︱〈属性〉︱… 〈禁用者〉::= PUBLIC︱〈授权ID〉 语义:将禁用用户在指定操作对象上的操作权限。 例:拒绝安全账户 u_test 对 Employees 表的 SELECT 权限 DENY SELECT ON Employees TO u_test 仲恺农业工程学院
简单来说,deny就是将来都不许给,revoke就是收回已经给予的。 6.2.2 存取控制 revoke 与 deny的区别 revoke:收回之前被授予的权限 deny:拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。比如UserA所在的角色组有inset权限,但是我们Deny UserA使其没有insert权限,那么以后即使UserA再怎么到其他含有Insert的角色组中去,还是没有insert权限,除非该用户被显示授权。 简单来说,deny就是将来都不许给,revoke就是收回已经给予的。 仲恺农业工程学院
6.2.2 存取控制 GRANT INSERT ON TableA TO RoleA 6.2.2 存取控制 举例: GRANT INSERT ON TableA TO RoleA EXEC sp_addrolemember RoleA, 'UserA' -- 用户UserA将有TableA的INSERT权限 REVOKE INSERT ON TableA FROM RoleA -- 用户UserA将没有TableA的INSERT权限,收回权限 GRANT INSERT ON TableA TORoleA --重新给RoleA以TableA的INSERT权限 DENY INSERT ON TableA TO UserA -- 虽然用户UserA所在RoleA有TableA的INSERT权限,但UserA本身被DENY了,所以用户UserA将没有TableA的INSERT权限。 仲恺农业工程学院
但是,强制存取控制方法可以有效地解决这一问题。 6.2.2 存取控制 (3)自主存取控制的不足之处 自主存取控制能够通过授权机制有效地控制用户对敏感数据的存取,但也存在着一定的缺陷,其主要问题是系统对权限的授予状况无法进行有效的控制,因而可能造成数据的无意泄漏。 但是,强制存取控制方法可以有效地解决这一问题。 仲恺农业工程学院
在MAC中,DBMS所管理的全部实体被分为主体和客体两大类。 6.2.2 存取控制 4.强制存取控制方法(MAC) 所谓MAC是指系统为保证更高程度的安全性,它不是用户能直接感知或进行控制的。MAC适用于那些对数据有严格而固定密级分类的部门,例如军事部门或政府部门。 在MAC中,DBMS所管理的全部实体被分为主体和客体两大类。 仲恺农业工程学院
主体--系统中的活动实体,既包括DBMS所管理的实际用户,也包括代表用户的各进程。 6.2.2 存取控制 主体--系统中的活动实体,既包括DBMS所管理的实际用户,也包括代表用户的各进程。 客体--系统中的被动实体,是受主体操纵的,包括文件、基表、索引、视图等等。 仲恺农业工程学院
当某一用户(或一主体)以标记label注册入系统时,系统要求他对任何客体的存取必须遵循如下规则: 6.2.2 存取控制 当某一用户(或一主体)以标记label注册入系统时,系统要求他对任何客体的存取必须遵循如下规则: (1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体; (2)仅当主体的许可证级别等于客体的密级时,该主体才能写相应的客体。 仲恺农业工程学院
6.2.2 存取控制 一般强制存取控制采用以下几种方法实现: (1)限制访问控制 (2)过程控制 (3)系统限制 仲恺农业工程学院
6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2.6 统计数据库的安全 仲恺农业工程学院
6.2.3 视图 视图技术是当前数据库技术中保持数据库安全性的重要手段之一。通过为不同的用户定义不同的视图,可以将要保密的数据对无权存取的用户隐藏起来,从而自动地给数据提供一定程度的安全保护。例如,给某用户定义了一个只读视图,并且这个视图的数据来源于关系R,则此用户只能读R中的有关信息,数据库中一切其他信息对他都是隐藏的。 仲恺农业工程学院
【例6-8】允许一个用户查询学生表STUDENT的记录,但是只允许他查询计算机专业学生的情况。 6.2.3 视图 【例6-8】允许一个用户查询学生表STUDENT的记录,但是只允许他查询计算机专业学生的情况。 CREATE VIEW STUDENT_SUBJECT AS SELECT 借书证号,姓名,专业名,性别,出生时间,借书数 FROM STUDENT WHERE 专业名=‘计算机’ 使用这个视图STUDENT_SUBJECT的用户看到的只是基本表STUDENT的一个“水平子集”,或称行子集。 仲恺农业工程学院
6.2.3 视图 第一点: 使用视图,可以定制用户数据,聚焦特定的数据。 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视图,以后他在查询数据时,只需select * from view_caigou 就可以啦。 仲恺农业工程学院
6.2.3 视图 第二点:使用视图,可以简化数据操作 解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我们只需要select * from view1就可以啦~,是不是很方便呀~ 仲恺农业工程学院
第三点:使用视图,基表中的数据就有了一定的安全性 6.2.3 视图 第三点:使用视图,基表中的数据就有了一定的安全性 因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改和删除,可以保证数据的安全性。 仲恺农业工程学院
以上,就是视图的作用,实际上很多公司都使用视图来查询数据的。 6.2.3 视图 第四点:可以合并分离的数据,创建分区视图 随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字,将各分公司的数据合并为一个视图。 以上,就是视图的作用,实际上很多公司都使用视图来查询数据的。 仲恺农业工程学院
6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2.6 统计数据库的安全 仲恺农业工程学院
数据加密技术是防止数据库中数据在存储或者传输中失密的有效手段。 6.2.4 数据加密 数据加密技术是防止数据库中数据在存储或者传输中失密的有效手段。 加密的基本思想是根据一定的算法将原始数据(明文)变换成不可直接识别的格式(密文),从而使得不知道解密算法的人无法获知数据的内容。这样可以保证只有掌握了密钥的用户才能访问数据,而且即使数据被非法地从数据库中窃取,或者在数据传输过程中被截取,窃取者都无法知道密码数据的含义。 仲恺农业工程学院
该方法使用密钥(Encryption Key)将明文中的每一个字符转换为密文中的字符。 6.2.4 数据加密 数据加密的主要方法有两种: 1.替换方法 该方法使用密钥(Encryption Key)将明文中的每一个字符转换为密文中的字符。 2.置换方法 该方法仅将明文的字符按不同的顺序重新排列。 仲恺农业工程学院
6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2.6 统计数据库的安全 仲恺农业工程学院
6.2.5 跟踪审计 跟踪审计(Audit Trial)是一种监视措施,数据库运行中,DBMS跟踪用户对一些敏感数据的存取活动,把用户对数据库的操作自动记录下来放入审计日志(Audit Log)中,有许多DBMS的跟踪审计记录文件与系统的运行日志合在一起。系统能利用这些审计跟踪的信息,重现导致数据库现状的一系列事件。 仲恺农业工程学院
6.2.5 跟踪审计 跟踪审计的记录一般包括以下内容:请求(源文本)、操作类型(如修改、查询等)、操作终端标识与操作者标识、操作日期和时间、操作所涉及的对象(表、视图、记录、属性等)、数据的前映象和后映象。DBMS提供相应的语句供施加和撤销跟踪审计之用。 仲恺农业工程学院
6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2 数据库的安全性 6.2.1 用户标识与鉴别 6.2.2 存取控制 6.2.3 视图 6.2.4 数据加密 6.2.5 跟踪审计 6.2.6 统计数据库的安全 仲恺农业工程学院
统计数据库是一种特殊类型的数据库,它和一般的数据库相比,有很多共同点,但是也有许多独特之处。 6.2.6 统计数据库的安全 统计数据库是一种特殊类型的数据库,它和一般的数据库相比,有很多共同点,但是也有许多独特之处。 统计数据库,它回答给用户的只能是统计信息。如国家的人口统计数据库、经济统计数据库等。统计数据库存储了大量敏感的数据,但只给用户提供这些原始数据的统计数据(如平均值、总计等),而不允许用户查看单个的原始数据。 仲恺农业工程学院
用户使用合法的统计查询可以推断出他不应了解的数据。 6.2.6 统计数据库的安全 用户使用合法的统计查询可以推断出他不应了解的数据。 例如,一个学生想要知道另一个学生A的成绩,他可以通过查询包含A在内的一些学生的平均成绩,然后对于上述学生集合P,他可用自己的学号取代A后得集合P’的平均成绩。通过这样两次查询得到的平均成绩的差和自己的成绩,就可以推断出学生A的成绩。 仲恺农业工程学院
6.2.6 统计数据库的安全 为了堵塞这类漏洞,必须对数据库的访问进行推断控制。现在常用的方法有数据扰动、查询控制和历史相关控制等。这些方法虽然都获得了应用,取得了很好的效果,但是迄今为止,统计数据库的安全问题尚未彻底解决。 仲恺农业工程学院
第6章 数据库安全性和完整性 6.1 概述 6.2 数据库的安全性 6.3 数据库的完整性 6.4 SQL的完整性控制 本章小结 6.1 概述 6.2 数据库的安全性 6.3 数据库的完整性 6.4 SQL的完整性控制 本章小结 仲恺农业工程学院
数据库的完整性是指数据库中数据的正确性和相容性,即为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出。 6.3 数据库的完整性 数据库的完整性是指数据库中数据的正确性和相容性,即为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出。 例如: 学生的学号一定是唯一的,学号的长度是13至15个字符串;学生的年龄是整数,取值范围为11~45; 当一个用户向数据库插入一个新的学生记录或修改一个学生的数据时必须满足这些条件。 。 仲恺农业工程学院
数据库的完整性保证了真实反映现实世界,凡是已经失真的数据都可以说其完整性受到了破坏,这种情况下就不能再使用数据库,否则可能造成严重的后果。 6.3 数据库的完整性 数据库的完整性保证了真实反映现实世界,凡是已经失真的数据都可以说其完整性受到了破坏,这种情况下就不能再使用数据库,否则可能造成严重的后果。 完整性受破坏的常见原因: 1.错误的数据 2.错误的更新操作 3.并发访问 4.各种硬件故障 5.人为的破坏 仲恺农业工程学院
6.3 数据库的完整性 6.3.1 完整性的语义约束 6.3.2 完整性语义检查 仲恺农业工程学院
完整性约束条件作用的对象可以是列、元组、关系三种。 6.3.1 完整性的语义约束 完整性约束条件作用的对象可以是列、元组、关系三种。 列约束:主要是列类型、取值范围、精度、排序等约束条件 。 元组约束:是元组中各个字段间的联系的约束。 关系的约束:是若干元组间、关系集合上以及关系间的联系的约束。 。 仲恺农业工程学院
静态约束是指数据库每一确定状态时的数据对象所应满足的约束条件,它是反映数据库状态合理性的约束,这是最重要的一类完整性约束。 6.3.1 完整性的语义约束 完整性约束条件的类型可以分为两大类型: 静态约束和动态约束。 1.静态约束 静态约束是指数据库每一确定状态时的数据对象所应满足的约束条件,它是反映数据库状态合理性的约束,这是最重要的一类完整性约束。 仲恺农业工程学院
根据约束作用的对象的不同,又可分为下面三种: 6.3.1 完整性的语义约束 根据约束作用的对象的不同,又可分为下面三种: 静态列约束 对一个列的取值域等的说明或限制,这是最常见、最容易实现的一类完整性约束,它包括以下几个方面: 对数据类型的约束,例如,数据的类型、长度、单位、精度等。 对数据格式的约束,例如,学生的学号的格式中前四位表示入学年份,中间三位为院号+系号,后三位为班级号+顺序编号。 仲恺农业工程学院
对取值范围或取值集合的约束,例如,大学本科学生年龄范围的取值范围为11~45。 6.3.1 完整性的语义约束 对取值范围或取值集合的约束,例如,大学本科学生年龄范围的取值范围为11~45。 对空值的约束,空值表示未定义或未知的值,与零值和空格不同。有的列允许空值,有的不允许,例如,规定学生的姓名不允许取空值;学号成绩可以为空值。 其他约束,例如,关于列的排序说明、组合列等。 仲恺农业工程学院
一个元组是由若干列值组成的,静态元组约束规定组成一个元组的各个列之间的约束关系。 6.3.1 完整性的语义约束 (2) 静态元组约束 一个元组是由若干列值组成的,静态元组约束规定组成一个元组的各个列之间的约束关系。 例如,一个学生的科目成绩列,规定每科成绩取值不得低于0,也不得高于100。 (3) 静态关系约束 静态关系约束反映了一个关系中各个元组之间或者若干关系之间存在的联系或约束。它包括: 仲恺农业工程学院
实体完整性约束。即关键字段的值不为空。 参照完整性约束。即一个关系的外码的取值与另一个关系的关键字的值有关。 6.3.1 完整性的语义约束 实体完整性约束。即关键字段的值不为空。 参照完整性约束。即一个关系的外码的取值与另一个关系的关键字的值有关。 函数依赖约束。大部分函数依赖约束都在关系模式中定义。 统计约束。即某个字段值与一个关系多个元组的统计值之间的约束关系。例如对学生平均成绩的约束等,这里的平均成绩就是统计值。 仲恺农业工程学院
6.3.1 完整性的语义约束 1.动态约束 动态约束是指数据库从一种状态转变为另一种状态时,新、旧值之间满足的约束条件,它反映了数据库状态改变时应遵守的约束。按照约束对象不同,它又分为下面三种。 (1) 动态列约束 (2) 动态元组约束 (3) 动态关系约束 仲恺农业工程学院
动态列约束规定修改列定义或列值时应满足的约束条件,它包括: 6.3.1 完整性的语义约束 (1) 动态列约束 动态列约束规定修改列定义或列值时应满足的约束条件,它包括: ① 修改列定义时的约束。例如,将允许空值的列改为不允许空值时,如果该列目前已存在空值,则拒绝这种修改。 ② 修改列值时的约束。修改列值时需要参照其旧值,并且新旧值之间需要满足某种约束条件。例如,学生的年龄只能增长。 仲恺农业工程学院
动态元组约束是指修改某个元组的值时元组中的各个字段之间要满足某种约束条件。例如,职工津贴不得高于个人基本工资的20%等。 6.3.1 完整性的语义约束 (2) 动态元组约束 动态元组约束是指修改某个元组的值时元组中的各个字段之间要满足某种约束条件。例如,职工津贴不得高于个人基本工资的20%等。 (3) 动态关系约束 动态关系约束是加在关系变化时的限制条件,例如,事务一致性、原子性等约束条件。 仲恺农业工程学院
6.3 数据库的完整性 6.3.1 完整性的语义约束 6.3.2 完整性语义检查 仲恺农业工程学院
现代数据库技术采用对数据完整性的语义约束和检查来保护数据库的完整性, 6.3.2 完整性语义检查 现代数据库技术采用对数据完整性的语义约束和检查来保护数据库的完整性, 实现方式有两种:一种是通过定义和使用完整性约束规则,另一种是通过触发器和存储过程来实现。 仲恺农业工程学院
第6章 数据库安全性和完整性 6.1 概述 6.2 数据库的安全性 6.3 数据库的完整性 6.4 SQL的完整性控制 本章小结 6.1 概述 6.2 数据库的安全性 6.3 数据库的完整性 6.4 SQL的完整性控制 本章小结 仲恺农业工程学院
SQL中的完整性约束主要分为三类:域完整性、实体完整性和参照完整性。但是,SQL尚不支持动态完整性约束。 6.4.1 域完整性 6.4.2 实体完整性 6.4.3 参照完整性 仲恺农业工程学院
域完整性又称为列完整性,指列数据输入的有效性。实现域完整性的方法可通过定义相应的约束、规则等方法实现。 6.4.1 域完整性 域完整性又称为列完整性,指列数据输入的有效性。实现域完整性的方法可通过定义相应的约束、规则等方法实现。 1.列约束 定义列约束规定某个属性的值必须符合某种数据类型并且取自某个数据定义域。域完整性约束施加于单个数据上。 (1)长途电话号码格式为:999~9999999; (2)仓库库存量≥0; (3)图书管理系统中允许读者当前在借图书量最多为20本。 仲恺农业工程学院
域完整性可以使用CHECK约束、NOT NULL约束、UNIQUE约束在表定义的时候实现。 6.4.1 域完整性 域完整性可以使用CHECK约束、NOT NULL约束、UNIQUE约束在表定义的时候实现。 CHECK约束:是字段输入时的验证规则,表示一个字段的输入内容必须满足CHECK约束的条件,若不满足,则数据无法正常输入。 NOT NULL约束:约束表示列值的非空性,此列不允许为空; UNIQUE约束:表示列值唯一性。 仲恺农业工程学院
【例6-9】定义表STUDENT的同时,定义字段的非空性和借书数字段的约束条件。 6.4.1 域完整性 【例6-9】定义表STUDENT的同时,定义字段的非空性和借书数字段的约束条件。 CREATE TABLE STUDENT ( 借书证号 char(8) NOT NULL, 姓名 char(8) NOT NULL, 专业名 char(12) NOT NULL, 性别 bit NOT NULL, 借书数 tinyint CHECK(借书数>=0 and 借书数<=20) NULL ) NOT NULL约束限定了借书证号、姓名、专用名、性别不能为空值;CHECK约束限定限定了借书数的取值范围。 仲恺农业工程学院
【例6-10】建立一个货物表GOODS,要求货品编号Gno列取值唯一,货品名称Gname列不允许为空。 6.4.1 域完整性 【例6-10】建立一个货物表GOODS,要求货品编号Gno列取值唯一,货品名称Gname列不允许为空。 CREATE TABLE GOODS ( Gno char(7) UNIQUE, Gname char(8) NOT NULL, Nums int ) 仲恺农业工程学院
AS@变量 condition_expression 6.4.1 域完整性 2.规则 规则对象的使用步骤如下: (1)定义规则对象 语法格式: CREATE RULE rule AS@变量 condition_expression 参数含义:参数rule为定义的新规则名,规则名必须符合标识符规则;参数condition _expression为规则的条件表达式,该条件表达式可为WHERE子句中任何有效的表达式(in,linke,between),但规则表达式中不能包含列或其他数据库对象,可以包含不引用数据库对象的内置函数。 仲恺农业工程学院
规则对象的绑定,使用的是系统存储过程sp_bindrule,语法格式如下: 6.4.1 域完整性 (2)将规则对象绑定到列或用户自定义类型 规则对象的绑定,使用的是系统存储过程sp_bindrule,语法格式如下: sp_bindrule [ @rulename = ] 'rule' , [ @objname = ] 'object_name' [ , [ @futureonly = ] 'futureonly_flag' ] sp_bindrule [ @rulename = ] ‘规则名' , [ @objname = ] ‘对象名' 仲恺农业工程学院
6.4.1 域完整性 参数含义:参数rule为CREATE RULE语句创建的规则名,要用单引号括起来。参数object_name为绑定到规则的列或用户定义的数据类型,如果object_name采用“表名.字段名”格式,则认为绑定到表的列,否则绑定到用户定义的数据类型;参数futureonly_flag仅当将规则绑定到用户定义的数据类型时才使用,如果futureonly_flag设置为futureonly,用户定义数据类型的现有列不继承新规则。如果futureonly_flag为NULL,当被绑定的数据类型当前无规则时,新规则将绑定到用户定义数据类型的每一列。 仲恺农业工程学院
例:创建规则rule1,限制输入的值为0-10之间 Create rule rule1 as @c1 between 0 and 10 Create rule rule2 as @c2 in(‘男’,’女’) 仲恺农业工程学院
【例6-11】创建一个规则,并绑定到STUDENT表的借书证号字段。 6.4.1 域完整性 【例6-11】创建一个规则,并绑定到STUDENT表的借书证号字段。 CREATE RULE num_rule AS @num like '[1-6][1-6][1-9] [1-9] [1-9] [1-9] [0-9] [0-9] [0-9]' GO EXEC sp_bindrule 'num_rule', 'STUDENT.借书证号‘ 仲恺农业工程学院
删除规则对象前,首先应使用系统存储过程sp_unbindrule,解除被绑定对象与规则对象之间的绑定关系。 6.4.1 域完整性 (3)规则对象的删除 删除规则对象前,首先应使用系统存储过程sp_unbindrule,解除被绑定对象与规则对象之间的绑定关系。 语法格式: sp_unbindrule [ @ object_name = ] ' object_name ' [ , [ @futureonly = ] 'futureonly_flag' ] 仲恺农业工程学院
在解除列或自定义类型与规则对象之间的绑定关系后,就可以删除规则对象了。 语法格式: 6.4.1 域完整性 在解除列或自定义类型与规则对象之间的绑定关系后,就可以删除规则对象了。 语法格式: 参数含义:参数rule指定删除的规则名,可以包含规则所有者名;参数n表示可以指定多个规则同时删除。 DROP RULE {rule}[,…n] 仲恺农业工程学院
【例6-12】解除num_rule规则对象与STUDENT表的借书证号的绑定关系,然后删除规则对象num_rule。 6.4.1 域完整性 【例6-12】解除num_rule规则对象与STUDENT表的借书证号的绑定关系,然后删除规则对象num_rule。 EXEC sp_unbindrule 'num_rule' DROP RULE num_rule 仲恺农业工程学院
6.4.1 域完整性 3.触发器 触发器就是一类靠事件驱动的特殊过程,一旦由某个用户定义,任何用户对该数据的增、删、改操作均由服务器自动激活相应的触发器,在核心层进行集中的完整性控制。 一个触发器应包括下面两个功能: (1)指明什么条件下触发器被执行。 (2)指明触发器执行什么动作。 仲恺农业工程学院
6.4.1 域完整性 SQL触发器定义的语法如下: <触发器>::=CREATE TRIGGER <触发器名> 6.4.1 域完整性 SQL触发器定义的语法如下: <触发器>::=CREATE TRIGGER <触发器名> ON <表名|视图名> [WITH ENCRYPTION] /*说明是否采用加密方式*/ {FOR| AFTER|INSTEAD OF} <触发事件> /*定义触发器的类型*/ AS [{IF UPDATE(column)[{AND|OR}UPDATE(column)] […n] | IF(COLUMNS_UPDATED(){bitwise_operator} updated_bitmask)}] /*两个IF子句用于说明触发器执行的条件*/ Sql_statements /*T-SQL语句序列*/ 仲恺农业工程学院
StudentID int primary key, --学号 ) Create Table BorrowRecord( --学生借书记录表 Create Table xs( --学生表 StudentID int primary key, --学号 ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 仲恺农业工程学院
1. 如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2 1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 等等。 仲恺农业工程学院
1 Create Trigger truStudent On xs --在xs表中创建触发器 for Update --为什么事件触发 As --事件触发后所要做的事情 if Update(StudentID) begin Update BorrowRecord Set StudentID=i.StudentID From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表 Where br.StudentID=d.StudentID end 仲恺农业工程学院
理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。 一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是: | 虚拟表Inserted | 虚拟表Deleted 在表记录新增时 | 存放新增的记录 | 不存储记录 修改时 | 存放用来更新的新记录 | 存放更新前的记录 删除时 | 不存储记录 | 存放被删除的记录 一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。 仲恺农业工程学院
2 Create trigger trdStudent On xs for Delete As Delete BorrowRecord From BorrowRecord br , Delted d Where br.StudentID=d.StudentID 仲恺农业工程学院
6.4.1 域完整性 【例6-13】在数据库XSBOOK中创建一触发器,当向BORROW表插入一记录时,检查该记录的借书证号在STUDENT表是否存在,检查图书的ISBN号在BOOK表中是否存在,及图书的库存量是否大于0,若有一项为否,则不允许插入。 仲恺农业工程学院
CREATE TRIGGER jy_insert ON BORROW FOR INSERT AS 6.4.1 域完整性 CREATE TRIGGER jy_insert ON BORROW FOR INSERT AS IF EXISTS( select * from inserted a where a.借书证号 not in ( select b.借书证号 from STUDENT b) or a.ISBN not in(select c.ISBN from BOOK c)) OR EXISTS(select * from book where 库存量<=0) BEGIN RAISERROR(‘违背数据一致性’,16,1) ROLLBACK TRANSACTION END 仲恺农业工程学院
6.4.1 域完整性 ELSE BEGIN UPDATE STUDENT SET 借书数=借书数+1 6.4.1 域完整性 ELSE BEGIN UPDATE STUDENT SET 借书数=借书数+1 WHERE STUDENT.借书证号 IN (select inserted.借书证号 from inserted) UPDATE BOOK SET 库存量=库存量-1 WHERE book.ISBN IN (select inserted.ISBN END 仲恺农业工程学院
执行触发器时,系统创建了两个特殊的逻辑表Inserted表和deleted表。 6.4.1 域完整性 触发器中使用的特殊表 执行触发器时,系统创建了两个特殊的逻辑表Inserted表和deleted表。 inserted 逻辑表:当向表中插入数据时,INSERT触发器触发执行,新的记录插入到触发器表和inserted表中。 仲恺农业工程学院
6.4.1 域完整性 触发器中使用的特殊表 deleted逻辑表:用于保存已从表中删除的记录,当触发一个DELETE触发器时,被删除的记录存放到deleted逻辑表中。 修改一条记录等于插入一新记录,同时删除旧记录。当对定义了UPDATE触发器的表记录修改时,表中原记录移动到DELETE表中,修改过的记录插入到inserted表中。触发器可检查deleted表、inserted表及被修改的表。 仲恺农业工程学院
create trigger tigger1 on UserInfo for insert as declare @i1 as int 触发器举例 create trigger tigger1 on UserInfo for insert as declare @i1 as int select @i1 = UserInfo.a from UserInfo join inserted on UserInfo.id = inserted.id if ( @i1 is null) update UserInfo set a = UserInfo.b from UserInfo join inserted on UserInfo.id = inserted.id 仲恺农业工程学院
6.4 SQL的完整性控制 6.4.1 域完整性 6.4.2 实体完整性 6.4.3 参照完整性 仲恺农业工程学院
6.4.2 实体完整性 实体完整性又称为行的完整性,要求表中有一个主键,其值不能为空且唯一地标识对应的记录。SQL在CREATE TABLE语句中提供PRIMARY KEY创建主码列,实现数据的实体完整性。 仲恺农业工程学院
6.4.2 实体完整性 一个表只能有一个PRIMARY KEY约束,而且PRIMARY KEY约束中的列不能取空值。当为表定义PRIMARY KEY约束时,SQL为主键创建唯一索引,实现主键数据的唯一性,在查询中,该索引可用来对数据进行快速访问。如果PRIMARY KEY约束是由多列组合定义的,则某一列的值可以重复,但PRIMARY KEY约束定义中所有列的组合值必须唯一。 仲恺农业工程学院
6.4.2 实体完整性 【例6-14】在图书管理系统里面,创建一个学生借阅表BORROW。 CREATE TABLE BORROW 6.4.2 实体完整性 【例6-14】在图书管理系统里面,创建一个学生借阅表BORROW。 CREATE TABLE BORROW ( 借书证号 char(5), ISBN char(10), 借书时间 datetime, 应还时间 datetime, PRIMARY KEY(借书证号,ISBN) ) 用PRIMARY KEY约束定义了关系的主码后,每当用户程序对主码列进行更新操作时,系统自动进行完整性检查,凡操作使主码值为空值或使主码值在表中不唯一,系统拒绝此操作,从而保证了实体完整性。 仲恺农业工程学院
6.4 SQL的完整性控制 6.4.1 域完整性 6.4.2 实体完整性 6.4.3 参照完整性 仲恺农业工程学院
6.4.3 参照完整性 参照完整性是关系模式的另一种重要约束,又称为引用完整性。参照完整性保证主表中的数据与从表中数据的一致性,通过定义从表中的外码与主表中的主码之间的对应关系实现。 仲恺农业工程学院
6.4.3 参照完整性 在SQL中,有两种方法用于说明一个外部关键字: 第一种方法: 另一种方法: 6.4.3 参照完整性 在SQL中,有两种方法用于说明一个外部关键字: 第一种方法: 如果外部关键字只有一个属性,可以在它的属性名和类型后面直接用“REFERENCES”说明它参照了某个被参照表的某些属性(必须是主关键字),其格式为: REFERENCES <表名>(<属性>) 另一种方法: 在CREATE TABLE语句的属性列表后面增加一个或几个外部关键字说明,其格式为: FOREIGN KEY <属性> REFERENCES <表名>(<属性>) 仲恺农业工程学院
下面将详细讨论实现参照完整性要考虑的几个问题。 6.4.3 参照完整性 下面将详细讨论实现参照完整性要考虑的几个问题。 1.外码的取值规则 【例6-15】 设有一个关系模式, 学生(Sno,Sname,Ssex,Subno) 其中,Sno是主关键字,专业号Subno是外部关键字,并参照了关系模式 专业(Subno,Subname) 中的Subno,这时可以直接说明“学生.Subno”参照了“专业.Subno”,称专业为被参照关系,学生为参照关系。 仲恺农业工程学院
6.4.3 参照完整性 在这个例子中,看一下学生实体中的Subno取值的限制。如果一个学生还没有分配专业,取值为空值。如果分配了专业,那么必须是专业实体中的某个专业,也就是其取值必须是专业表中存在的某个专业号,这就是参照完整性。因为“学生.Subno”必须参照“专业.Subno”取值。 仲恺农业工程学院
若属性或属性组F是基本关系R的外码,它与基本关系S的主码Ks相对应,则对于R中的每个元组在F上的取值必须为: 6.4.3 参照完整性 取值规则 若属性或属性组F是基本关系R的外码,它与基本关系S的主码Ks相对应,则对于R中的每个元组在F上的取值必须为: • 或者取空值(F的每个属性均为空值); • 或者等于S中某个元组的主码值。 仲恺农业工程学院
仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。 6.4.3 参照完整性 2.参照表中增加元组 一般当参照关系插入元组,被参照关系的主码字段存在相应的值,则允许参照关系插入元组。而被参照关系如不存在相应的元组,其主码值与参照关系插入元组的外码值不相同,这时可有以下策略: (1)拒绝插入 仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。 仲恺农业工程学院
首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。 6.4.3 参照完整性 (2)递归插入 首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。 例如对于上面的情况,系统将首先向专业关系插入Subno=’10’的元组,然后再向学生表插入(981601,’张丽’,0,’10’)元组。 仲恺农业工程学院
6.4.3 参照完整性 3.参照表中修改一个元组的外码 当参照关系修改某元组中外码值,被参照关系主码值与参照关系修改后元组的外码值相同,则允许参照关系修改元组。而若被参照关系如不存在相应的外码值,则拒绝修改。如例6-15中,将学生表的某个“专业号.Subno”的值修改为专业表中不存在的某个非空值,则被拒绝修改。 仲恺农业工程学院
6.4.3 参照完整性 4.被参照表中删除一个元组 当在被参考表中删除一个元组,如果参考关系的外码没有对应值,则可以顺利删除此元组。但是如果参考关系存在若干元组,其外码值与被参考关系删除元组的主码值相同,可以有三种不同的策略: (1)拒绝删除 (2)级联删除 (3)置空操作 仲恺农业工程学院
6.4.3 参照完整性 (1)拒绝删除 仍以例6-12为例。要删除专业关系中Subno=’10’的元组,而学生关系中又有10个元组的Subno都等于’10’,系统将拒绝删除专业关系中Subno=’10’的元组。 仲恺农业工程学院
6.4.3 参照完整性 (2)级联删除 将参照关系中所有外码值与被参照关系中要删除元组主码值相同的元组一起删除。例如将上面学生表中相应的10个Subno=’10’的元组一起删除。如果参照关系同时又是另外一个关系的被参照关系,则这种删除操作会继续级联删除下去。 仲恺农业工程学院
删除被参照关系的元组,并将参照关系中相应元组的外码值置空值。例如,将学生表的相应专业号值修改为空值。 6.4.3 参照完整性 (3)置空操作 删除被参照关系的元组,并将参照关系中相应元组的外码值置空值。例如,将学生表的相应专业号值修改为空值。 仲恺农业工程学院
当修改关系时被参考关系时,还必须检查参照关系,是否存在这样的元组,其外码值等于被参照关系要修改的主码值。 6.4.3 参照完整性 5.被参照表中修改一个元组的主码 当修改关系时被参考关系时,还必须检查参照关系,是否存在这样的元组,其外码值等于被参照关系要修改的主码值。 仲恺农业工程学院
(1)将学生表中的Subno字段值与专业表中的Subno字段值一起修改,即级联修改; (2)拒绝修改; 6.4.3 参照完整性 如例6-15中,将某个专业的Subno从一个值改成了另外一个值,使得学生表中的Subno的值在专业表中不存在了,这时与被参考关系修改一个元组的情况类似。 可以有3种处理方式: (1)将学生表中的Subno字段值与专业表中的Subno字段值一起修改,即级联修改; (2)拒绝修改; (3)将学生表中的Subno字段值改为空值。 仲恺农业工程学院
6.4.3 参照完整性 SQL中的CREATE TABLE语句也可以定义参照完整性规则,即用REFERENCES子句指明这些外码相应于哪个表的主码,或者用FOREIGN KEY子句和REFERENCES子句一起定义哪些列为外码列;用ON DELETE CASCADE子语指明在删除被参照关系的元组时,同时删除参照关系中相应的元组。 仲恺农业工程学院
(Sno CHAR(6) PRIMARY KEY, Sname VARCHAR(8) NOT NULL, Ssex bit, 6.4.3 参照完整性 例如,使用如下SQL语句建立学生表 CREATE TABLE 学生 (Sno CHAR(6) PRIMARY KEY, Sname VARCHAR(8) NOT NULL, Ssex bit, Subno CHAR(2) REFERENCES 专业(Subno) ); 仲恺农业工程学院
6.4.3 参照完整性 或者这样说明: CREATE TABLE 学生 (Sno CHAR(6) PRIMARY KEY, 6.4.3 参照完整性 或者这样说明: CREATE TABLE 学生 (Sno CHAR(6) PRIMARY KEY, Sname VARCHAR(8) NOT NULL, Ssex bit, Subno CHAR(2) , FOREIGN KEY Subno REFERENCES专业(Subno) ); 则表明学生表是参照表,专业表是被参照表,学生表的Subno为外码。当删除或修改专业表中某个元组的主码时会自动检查学生表中是否有元组的Subno值等于专业中要删除的元组的Subno值,如没有,接受此操作;否则系统拒绝这一更新操作。 仲恺农业工程学院
6.4.3 参照完整性 如果用如下SQL语句建立学生表 CREATE TABLE 学生 (Sno CHAR(6) PRIMARY KEY, 6.4.3 参照完整性 如果用如下SQL语句建立学生表 CREATE TABLE 学生 (Sno CHAR(6) PRIMARY KEY, Sname VARCHAR(8) NOT NULL, Ssex bit, Subno CHAR(2) REFERENCES 专业(Subno) ON DELETE CASCADE ); 当要删除专业表中某个元组时,系统要自动检查学生表,若找到相应元组则将它们也随之删除。 同样也可以使用ON UPDATE CASCADE,此子句指出了当更新被参照表中主码或唯一码的值时,也同时更新参照表中相应的外码值。 仲恺农业工程学院
本章小结 本章主要讨论了数据库安全性和完整性方面的知识。 数据库的安全性主要是指通过对数据库的存取控制,防止未授权使用的人员非法存取他不应存取的数据,防止数据泄密,防止数据被破坏。 数据库的完整性是为了保证数据库中存储数据的正确性、准确性和有效性。保持数据库的完整性的方法主要有:设置完整性约束,规则或使用触发器。完整性约束的种类有:域完整性、实体完整性和参照完整性。 仲恺农业工程学院
下课了。。。 追 求 仲恺农业工程学院