资源预览内容
第1页 / 共56页
第2页 / 共56页
第3页 / 共56页
第4页 / 共56页
第5页 / 共56页
第6页 / 共56页
第7页 / 共56页
第8页 / 共56页
第9页 / 共56页
第10页 / 共56页
亲,该文档总共56页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第七章 数据库的安全性与完整性 7.1 基本概念基本概念 数据库的安全性数据库的安全性: 是指保护数据库以防止不合法的使用所造成的是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。数据泄露、更改或破坏。 数据库安全性是一个涵盖许多问题的广阔领域。数据库安全性是一个涵盖许多问题的广阔领域。 安全性的类型:安全性的类型:某些信息的访问关系到法律和伦理的问题。有些信息可能会认为是属于某些信息的访问关系到法律和伦理的问题。有些信息可能会认为是属于个人信息,未授权人员不能对其进行访问。个人信息,未授权人员不能对其进行访问。有关政府、机构或公司层次上的政策问题,这些政策确定哪些信息不应有关政府、机构或公司层次上的政策问题,这些政策确定哪些信息不应该向公众公开。该向公众公开。与系统有关的问题。系统级上应加强哪几类安全功能(如:物理硬件级、与系统有关的问题。系统级上应加强哪几类安全功能(如:物理硬件级、OS级、级、DBMS级)级)一些组织需要把安全性问题划分为多个安全级别(如:绝密、机密、秘一些组织需要把安全性问题划分为多个安全级别(如:绝密、机密、秘密、公开)。密、公开)。 数据库的完整性数据库的完整性: 是指数据的正确性、有效性和相容性。是指数据的正确性、有效性和相容性。7.2 数据库安全性控制 在一个多用户数据库系统中,在一个多用户数据库系统中,DBMS必须提供相应的技必须提供相应的技术以保证特定的用户或用户组,只能访问数据库的指定术以保证特定的用户或用户组,只能访问数据库的指定部分,而不能访问数据库的其他部分。部分,而不能访问数据库的其他部分。 典型的典型的DBMS包含一个数据库安全和授权子系统,由它包含一个数据库安全和授权子系统,由它来负责实现一个数据库的安全性功能以避免发生未授权来负责实现一个数据库的安全性功能以避免发生未授权的访问。的访问。 DBMS的安全子系统主要包括两部分:的安全子系统主要包括两部分: 定义用户权限,并将用户权限登记到数据字典中。定义用户权限,并将用户权限登记到数据字典中。 合法权限检查,若用户的操作请求超出了定义的权限,系统合法权限检查,若用户的操作请求超出了定义的权限,系统将拒绝执行此操作。将拒绝执行此操作。7.2 数据库安全性控制安全措施应该一级一级层层设置。安全措施应该一级一级层层设置。计算机系统的安全模型:计算机系统的安全模型:用户标识和鉴别DB数据密码存储OS安全保护DBMS存取控制7.2 数据库安全性控制数据库安全控制方法数据库安全控制方法一、用户标识与鉴别一、用户标识与鉴别1. 利用用户自身具备的各种自然特征标识自己和提供鉴别的利用用户自身具备的各种自然特征标识自己和提供鉴别的依据。依据。2. 利用用户持有的证件。利用用户持有的证件。3. 利用口令。利用口令。 口令保密可采用的一些方法:口令保密可采用的一些方法: (1)扩大口令集和口令长度。)扩大口令集和口令长度。 (2)规定口令的生效时间,定期或不定期地更换口令。)规定口令的生效时间,定期或不定期地更换口令。 (3)设置多层口令系统。)设置多层口令系统。 (4)设置动态口令。)设置动态口令。7.2 数据库安全性控制二二 、存取控制、存取控制1. 存取控制方法存取控制方法(1) 自主存取控制自主存取控制(DAC-Discretionary Access Control ) 这种方法是基于授予和收回权限的机制。它已经发展成这种方法是基于授予和收回权限的机制。它已经发展成为关系数据库系统的主要安全机制。这种机制是一种为关系数据库系统的主要安全机制。这种机制是一种“all-or-nothing”方法,即一个用户要么拥有该特权,要么没有方法,即一个用户要么拥有该特权,要么没有该特权。但是在很多应用中,还需要另外一种安全性策略,该特权。但是在很多应用中,还需要另外一种安全性策略,这种策略需要在安全性级别的基础上对数据或用户进行分类。这种策略需要在安全性级别的基础上对数据或用户进行分类。 7.2 数据库安全性控制(2)强制存取控制)强制存取控制(MAC-Mandatory Access Control) 在强制存取控制在强制存取控制(MAC)方法中,每一个数据对象被标以一定的方法中,每一个数据对象被标以一定的密级,每一个用户也被授予某一个级别的许可证。密级,每一个用户也被授予某一个级别的许可证。 对于任意一个对象,只有具有合法许可证的用户才可以存取。强对于任意一个对象,只有具有合法许可证的用户才可以存取。强制存取控制因此相对比较严格。制存取控制因此相对比较严格。 MAC适用于对数据有严格而固定密级分类的部门。适用于对数据有严格而固定密级分类的部门。 主体主体是指数据库中数据访问者(用户、是指数据库中数据访问者(用户、DBA)、进程、线程等,)、进程、线程等,是系统中的是系统中的活动实体活动实体。 客体客体是指数据库中数据及其载体(表、视图、索引、存储过程等)是指数据库中数据及其载体(表、视图、索引、存储过程等),是系统中的,是系统中的被动实体被动实体。7.2 数据库安全性控制 对于主体和客体,对于主体和客体,DBMS为它们每个实例为它们每个实例(值值)指派一指派一 个敏感度个敏感度标记标记(Label)。 敏感度标记被分成若干级别,例如绝密、机密、秘密、公开等。敏感度标记被分成若干级别,例如绝密、机密、秘密、公开等。 主体的敏感度标记称为主体的敏感度标记称为许可证级别许可证级别。 客体的敏感度标记称为客体的敏感度标记称为密级密级。客体子集主体子集访问7.2 数据库安全性控制 MAC机制就是通过对比主体的机制就是通过对比主体的Label和客体的和客体的Label,最终确定主,最终确定主体是否能够存取客体。体是否能够存取客体。当某一主体以标记当某一主体以标记label注册入系统时,系统要求他对任何客体的注册入系统时,系统要求他对任何客体的存取必须遵循如下规则:存取必须遵循如下规则: 仅当主体的许可证级别仅当主体的许可证级别大于或等于大于或等于客体的密级时,该主体才能客体的密级时,该主体才能读取相应的客体;读取相应的客体; 仅当主体的许可证级别仅当主体的许可证级别等于等于客体的密级时,该主体才能写相应客体的密级时,该主体才能写相应的客体。的客体。 这两种规则的共同点在于它们均禁止了拥有高许可证级别的主体这两种规则的共同点在于它们均禁止了拥有高许可证级别的主体更新低密级的数据对象,从而防止了敏感数据的泄漏。更新低密级的数据对象,从而防止了敏感数据的泄漏。自主访问控制与强制访问控制的比较 自主访问控制自主访问控制优点:优点:有高度的灵活性,这使得它适用于多个应用领域。有高度的灵活性,这使得它适用于多个应用领域。缺点:缺点:防范恶意攻击的脆弱性。因为一旦被授权用户访问以防范恶意攻击的脆弱性。因为一旦被授权用户访问以后,自主授权模型就不能对如何传播和如何使用信息进行任后,自主授权模型就不能对如何传播和如何使用信息进行任何的控制了。何的控制了。 强制访问控制强制访问控制优点:优点:可以保证更高程度的保护,防止了信息的非法流动。可以保证更高程度的保护,防止了信息的非法流动。适用于需要高度保护的政府、军事等应用。适用于需要高度保护的政府、军事等应用。缺点:缺点:过于严格,要求将主体和客体严格地划分到安全级别过于严格,要求将主体和客体严格地划分到安全级别中,因此仅适用于少数环境。中,因此仅适用于少数环境。7.2 数据库安全性控制2.2.自主存取控制的实现自主存取控制的实现(1) (1) 用户分类和权限用户分类和权限 用户用户: : 系统用户系统用户(DBA)(DBA)、数据对象属主、数据对象属主(owner)(owner)、一般用户、公共用户、一般用户、公共用户(public)(public)。 权限:权限:包括数据访问权限(读、插入、修改、包括数据访问权限(读、插入、修改、删除等)和数据库模式修改权限(索引、资源、删除等)和数据库模式修改权限(索引、资源、修改、撤消等)两类。修改、撤消等)两类。7.2 数据库安全性控制(2) (2) 授权授权 GRANT语句向用户授予操作权限。语句向用户授予操作权限。一般格式为:一般格式为: GRANT ,|ALL ON TO ,.|PUBLIC WITH GRANT OPTION 语义为:语义为:将对指定操作对象的指定操作权限授予指定的用户。将对指定操作对象的指定操作权限授予指定的用户。 ALL: 所有权限所有权限 PUBLIC: 公共用户公共用户 对不同类型的操作对象有不同的操作权限。对不同类型的操作对象有不同的操作权限。 可将此权限转授7.2 数据库安全性控制例例:把查询表:把查询表SC和修改和修改其学号的权限授给用户其学号的权限授给用户 U2和和U4。 GRANT SELECT , UPDATE(Sno) ON TABLE SC TO U2,U4;例例:把对表:把对表SC的的INSERT权限权限授给用户授给用户U5,并允许将此权限,并允许将此权限再授予其他用户。再授予其他用户。 GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION; U5还可以将此权限授予还可以将此权限授予U6: GRANT INSERT ON TABLE SC TO U6;PUBLIC;全体。U6能不能再传播此权限?7.2 数据库安全性控制例例: DBA把在数据库把在数据库 DB1中建立表的权限授予用户中建立表的权限授予用户U1。 GRANT CREATETAB ON DATABASE DB1 TO U1;U1隐含权限?(3) 收回权限格式:REVOKE ,|ALL ON FROM,.|PUBLIC CASCADE|RESTRICT; CASCADE: 级联(但系统只收回直接或间接从某处获得的权限) 例:P.214 图7-47.2 数据库安全性控制(4) (4) 数据库角色的授权数据库角色的授权角色角色: : 是权限的集合。是权限的集合。数据库角色:数据库角色:是一组对数据库进行各种操作的权限的集合。是一组对数据库进行各种操作的权限的集合。将某一组用户设置为某一角色,他将拥有该角色中的每一个权将某一组用户设置为某一角色,他将拥有该角色中的每一个权限。这样只要对角色进行权限设置便可以实现对所有用户权限限。这样只要对角色进行权限设置便可以实现对所有用户权限的设置,大大减少了管理员的工作量,的设置,大大减少了管理员的工作量,简化了授权的过程简化了授权的过程。用户与角色之间存在多对多的联系。用户与角色之间存在多对多的联系。创建角色必须具有创建角色必须具有create rolecreate role系统权限。系统权限。7.2 数据库安全性控制创建角色:创建角色: CREATE ROLE CREATE ROLE 将权限授予角色:将权限授予角色: GRANT GRANT , ON ON TO TO , .将角色授予用户:将角色授予用户: GRANT GRANT , TO TO , . WITH ADMIN OPTION WITH ADMIN OPTION可将此权限转授n 回收角色的权限: REVOKE, ON FROM,.7.2 数据库安全性控制 例例7-77-7 CREATE ROLE C1;CREATE ROLE C1; GRANT SELECT,INSERTGRANT SELECT,INSERTON TABLE StudentON TABLE Student TO C1 TO C1; GRANT C1GRANT C1 TO U1,U2,U3 TO U1,U2,U3; GRANT UPDATE,DELETEGRANT UPDATE,DELETE ON TABLE Student ON TABLE Student TO C1 TO C1; REVOKE C1FROM U3;REVOKE INSERTON TABLE StudentFROM C1;7.2 数据库安全性控制三、视图机制三、视图机制 通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。提供一定程度的安全保护。四、数据加密四、数据加密 是在不安全的环境中维护数据安全性的一种方法。加密技术首先使用某个预是在不安全的环境中维护数据安全性的一种方法。加密技术首先使用某个预定的加密密钥对数据应用加密算法,然后结果数据必须要使用解密密钥进行解密,定的加密密钥对数据应用加密算法,然后结果数据必须要使用解密密钥进行解密,以恢复原来的数据。以恢复原来的数据。五、审计五、审计 审计审计是对选定的用户动作的监控和记录,以监测可能的不合法行为。是对选定的用户动作的监控和记录,以监测可能的不合法行为。 审计常用于:审计常用于: (1)审查可疑的活动。)审查可疑的活动。 (2)监视和收集关于数据库活动的数据。)监视和收集关于数据库活动的数据。7.2 数据库安全性控制 六六. 统计数据库的安全性统计数据库的安全性 统计数据库:统计数据库:用于提供基于各种标准的统计信息和值汇总用于提供基于各种标准的统计信息和值汇总数据。只允许用户查询聚集类型信息,不允许查询单个记录数据。只允许用户查询聚集类型信息,不允许查询单个记录信息的数据库。信息的数据库。 统计数据库用户统计数据库用户:政府统计部门或市场研究公司等。他们:政府统计部门或市场研究公司等。他们被允许访问统计数据库,以检索与人口有关的统计信息,但被允许访问统计数据库,以检索与人口有关的统计信息,但同时还需要禁止他们访问有关特定个人的详细机密性信息。同时还需要禁止他们访问有关特定个人的详细机密性信息。 统计数据库的安全性必须确保有关个人的信息不能被访问。统计数据库的安全性必须确保有关个人的信息不能被访问。7.2 数据库安全性控制 在统计在统计DB中存在着特殊的安全问题:即可能有隐蔽的信息通道,中存在着特殊的安全问题:即可能有隐蔽的信息通道,使合法的查询导出不合法的信息。使合法的查询导出不合法的信息。 例例1: 查询一:本单位查询一:本单位20岁以下的教师有多少?岁以下的教师有多少? 查询二:本单位查询二:本单位20岁以下的教师工资总额是多少?岁以下的教师工资总额是多少? 若一的结果为若一的结果为1,则二为该职工的工资。,则二为该职工的工资。解决:解决:限定查询的记录量(查询至少涉及限定查询的记录量(查询至少涉及N个以上的记录)个以上的记录) 例例2: 查询一:用户查询一:用户A与其他与其他N个职工的工资总额是多少?个职工的工资总额是多少? 查询二:用户查询二:用户B与其他与其他N个职工的工资总额是多少?个职工的工资总额是多少? 假设二的查询结果为假设二的查询结果为Y,一的查询结果为,一的查询结果为X,A的工资为的工资为Z, 则则B的工资的工资=Y-(X-Z)解决:解决:限定查询的次数(规定任意两个查询相交的数据项不能超过限定查询的次数(规定任意两个查询相交的数据项不能超过M个)个)7.3 数据库的完整性控制一、数据库的完整性一、数据库的完整性 数据库的完整性数据库的完整性:是指数据的正确性、有效性和相容性。是指数据的正确性、有效性和相容性。说明:说明:完整性完整性是为了防止数据库中存在不符合语义的数据,防止错是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出。误信息的输入和输出。 数据库完整性约束条件:数据库完整性约束条件:加在数据库数据之上的语义约束条件。加在数据库数据之上的语义约束条件。 完整性检查:完整性检查:DBMS中检查数据是否满足完整性条件的机制。中检查数据是否满足完整性条件的机制。 DBMS的完整性控制机制应具有三个方面的功能:的完整性控制机制应具有三个方面的功能: (1)定义功能:提供定义完整性约束条件的机制。)定义功能:提供定义完整性约束条件的机制。 (2)检查功能:检查用户发出的操作请求是否违背了完整性约束)检查功能:检查用户发出的操作请求是否违背了完整性约束条件。条件。 (3)防范功能:如果发现用户的操作请求使数据违背了完整性约)防范功能:如果发现用户的操作请求使数据违背了完整性约束条件,采取一定的动作来保证数据的完整性。束条件,采取一定的动作来保证数据的完整性。 7.3 数据库的完整性控制 完整性控制的规则:完整性控制的规则:一条完整性规则可以用一个五元组一条完整性规则可以用一个五元组 (D,O,A,C,P)来表来表示:示:(1)D(Data) 约束作用的数据对象。约束作用的数据对象。(2)O(Operation) 触发完整性检查的数据库操作,即当用触发完整性检查的数据库操作,即当用户发出什么操作请求时需要检查该完整性规则,是立即检查户发出什么操作请求时需要检查该完整性规则,是立即检查还是延迟检查。还是延迟检查。(3)A(Assertion) 数据对象必须满足的断言或语义约束,数据对象必须满足的断言或语义约束,这是规则的主体。这是规则的主体。(4)C(Condition) 选择选择A作用的数据对象值的谓词。作用的数据对象值的谓词。(5)P(Procedure) 违反完整性规则时触发的过程。违反完整性规则时触发的过程。7.3 数据库的完整性控制如如: 在在“讲师工资不得低于讲师工资不得低于1000元元”的约束中:的约束中: D 约束作用的对象为工资约束作用的对象为工资Sal属性属性 O 插入或修改插入或修改职工元组时职工元组时 A Sal不能小于不能小于1000 C 职称职称=讲师讲师 (A仅作用于职称仅作用于职称=讲师讲师的记录的记录) P 拒绝拒绝执行该操作执行该操作7.3 数据库的完整性控制 完整性的语义约束和检查:完整性的语义约束和检查:(1 1)立即执行约束:检查是否违背完整性约)立即执行约束:检查是否违背完整性约束的时机通常是在一条语句执行完后立即束的时机通常是在一条语句执行完后立即检查。检查。(2 2)延迟执行约束:完整性检查延迟到整个)延迟执行约束:完整性检查延迟到整个事务执行结束后再进行,检查正确方可提事务执行结束后再进行,检查正确方可提交。交。(3 3)在事务的某些特定检查点检查。)在事务的某些特定检查点检查。(4 4)在一个维护操作请求之后且执行之前检)在一个维护操作请求之后且执行之前检查。查。(5 5)在)在DBADBA或审计员发出检查请求时。或审计员发出检查请求时。7.3 数据库的完整性控制二、完整性约束条件二、完整性约束条件 作用的对象:作用的对象:关系、元组、列关系、元组、列 静态约束:静态约束:是指数据库每一确定状态时的数据对象所应满足的约是指数据库每一确定状态时的数据对象所应满足的约束条件,它是反映数据库状态合理性的约束。束条件,它是反映数据库状态合理性的约束。 动态约束:动态约束:是指数据库从一种状态转变为另一种状态时,新、旧是指数据库从一种状态转变为另一种状态时,新、旧值之间所应满足的约束条件,它是反映数据库状态变迁的约束。值之间所应满足的约束条件,它是反映数据库状态变迁的约束。7.3 数据库的完整性控制1、静态列级约束、静态列级约束 是对一个列的取值域的说明:是对一个列的取值域的说明: 对对数据类型、格式数据类型、格式的约束的约束;对;对取值范围或取取值范围或取值集合值集合的约束;对的约束;对空值空值的约束等。的约束等。2、静态元组约束、静态元组约束 是规定元组的各个列之间的约束关系。是规定元组的各个列之间的约束关系。 例例: 讲师工资不低于讲师工资不低于1000元元.3、静态关系约束、静态关系约束 在一个关系的各个元组之间或者若干关系之间常常存在各种联系或约束。在一个关系的各个元组之间或者若干关系之间常常存在各种联系或约束。 常见的静态关系约束有:常见的静态关系约束有: 实体完整性约束、参照完整性约束、函数依赖约束、统计约束实体完整性约束、参照完整性约束、函数依赖约束、统计约束( (字段值与关系字段值与关系中多个元组的统计值之间的约束关系。中多个元组的统计值之间的约束关系。如如: :经理的工资不得高于本部门职工平经理的工资不得高于本部门职工平均工资的均工资的5 5倍,不得低于本部门职工平均工资的倍,不得低于本部门职工平均工资的2 2倍倍) )。 7.3 数据库的完整性控制4、动态列级约束、动态列级约束 是修改列定义或列值时应满足的约束条件,包括下面两方面:是修改列定义或列值时应满足的约束条件,包括下面两方面: (1)(1)修改列定义时的约束修改列定义时的约束 (2)(2)修改列值时的约束(修改列值时的约束(如:如:职工工资调整不得低于其原来的工资)职工工资调整不得低于其原来的工资)5、动态元组约束、动态元组约束 是指修改元组的值时元组中各个字段间需要满足某种约束条件。是指修改元组的值时元组中各个字段间需要满足某种约束条件。 如:如:新工资不得低于原工资新工资不得低于原工资+工龄工龄*1.56、动态关系约束、动态关系约束 是加在关系变化前后状态上的限制条件,例如事务一致性、原子性等约束条是加在关系变化前后状态上的限制条件,例如事务一致性、原子性等约束条件。件。7.3 数据库的完整性控制三、三、SQLSQL中的完整性约束中的完整性约束 约束分类约束分类列级约束:只能应用在一列上。列级约束:只能应用在一列上。表级约束:可以应用在一个表中的多列上。表级约束:可以应用在一个表中的多列上。 当约束用于表级时,应按下列形式设置:当约束用于表级时,应按下列形式设置: CONSTRAINT CONSTRAINT 各种约束形各种约束形式式例:例:CREATE TABLE book (CREATE TABLE book ( bid int bid int NOT NULLNOT NULL, , -列级列级约束约束 bname char(8) bname char(8) NOT NULLNOT NULL, , -列级列级约束约束 authorid char(10)authorid char(10) ) )7.3 数据库的完整性控制1 1、基本表的约束、基本表的约束(1 1)主码约束)主码约束 主码能够惟一地确定表中的每一条记录,主码能够惟一地确定表中的每一条记录,主码不能取空值。主码约束可以保证实体的主码不能取空值。主码约束可以保证实体的完整性。完整性。 格式:格式:PRIMARY KEY (PRIMARY KEY ()例:例:CREATE TABLE book (CREATE TABLE book ( bid int bid int PRIMARY KEYPRIMARY KEY, , bname char(8) bname char(8) NOT NULLNOT NULL, , authorid char(10) authorid char(10) ) ) 7.3 数据库的完整性控制例例:CREATE TABLE sc (CREATE TABLE sc ( sno char(8), sno char(8), cno char(4) , cno char(4) , grade int, grade int, CONSTRAINT pk_sc primary CONSTRAINT pk_sc primary key(sno,cno)key(sno,cno) ) )7.3 数据库的完整性控制(2 2)外码约束)外码约束 外码约束主要用来维护两个表之间数据外码约束主要用来维护两个表之间数据的一致性,实现表之间的参照完整性。的一致性,实现表之间的参照完整性。格式:格式: FOREIGN KEY (FOREIGN KEY () REFERENCES REFERENCES () ON DELETE ON DELETE ON UPDATE ON UPDATE :NO ACTION:NO ACTION、CASCADECASCADE、RESTRICTRESTRICT、SET NULLSET NULL、SET DEFAULTSET DEFAULT7.3 数据库的完整性控制例例:CREATE TABLE authors (CREATE TABLE authors ( authorid int PRIMARY KEY, authorid int PRIMARY KEY, authorname char(20), authorname char(20), address char(30) address char(30) ) ) CREATE TABLE book ( CREATE TABLE book ( bid int PRIMARY KEY, bid int PRIMARY KEY, bname char(8) NOT NULL, bname char(8) NOT NULL, authorid int, authorid int, CONSTRAINT fk_book FOREIGN CONSTRAINT fk_book FOREIGN KEY(authorid)KEY(authorid) REFERENCES authors(authorid) REFERENCES authors(authorid) ) )7.3 数据库的完整性控制 假定被参照关系称为父表,参照关系称为子表。假定被参照关系称为父表,参照关系称为子表。 当删除当删除(DELETE)(DELETE)或修改或修改(UPDATE)(UPDATE)父表中的某行时,对子表采取父表中的某行时,对子表采取的动作可有下列的选择:的动作可有下列的选择: CASCADE (CASCADE (级联级联):): 删除或修改父表中的行并自动删除或修改在删除或修改父表中的行并自动删除或修改在子表中匹配的行。子表中匹配的行。 RESTRICT (RESTRICT (受限受限) ):只有当子表外码中没有与父表要删除或修只有当子表外码中没有与父表要删除或修改的主码相同时,才能删除父表中的行,否则拒绝执行此操作。改的主码相同时,才能删除父表中的行,否则拒绝执行此操作。 SET NULL (SET NULL (置空值置空值) ):删除或修改父表中的行并将子表中的外删除或修改父表中的行并将子表中的外码设置为码设置为NULLNULL。只有当外码没有被设置成。只有当外码没有被设置成NOT NULLNOT NULL时才有效。时才有效。 SET DEFAULT (SET DEFAULT (置默认值置默认值) ):删除或修改父表中的行并将子表中删除或修改父表中的行并将子表中的外码设置为指定的默认值。只有外码指定了默认值时才有效。的外码设置为指定的默认值。只有外码指定了默认值时才有效。 NOT ACTIONNOT ACTION:拒绝对父表进行删除或修改。拒绝对父表进行删除或修改。7.3 数据库的完整性控制(3) (3) 惟一约束惟一约束 惟一约束用于指定一个或多个列的组合值具有惟一性,惟一约束用于指定一个或多个列的组合值具有惟一性,以防止在列中输入重复的值。以防止在列中输入重复的值。应用场合应用场合:每个表中只能有一个主码,因此当表中已经有一:每个表中只能有一个主码,因此当表中已经有一个主码时,如果还要保证其他的标识符惟一时,就可以使用个主码时,如果还要保证其他的标识符惟一时,就可以使用惟一性约束。惟一性约束。例例:CREATE TABLE student (CREATE TABLE student ( sno int PRIMARY KEY, sno int PRIMARY KEY, sname char(8) NOT NULL, sname char(8) NOT NULL, sex char (2), sex char (2), cardno char(18) cardno char(18) UNIQUEUNIQUE ) )7.3 数据库的完整性控制(4 4)检查约束)检查约束 检查约束对输入列或者整个表中的值设置检查条件,以限检查约束对输入列或者整个表中的值设置检查条件,以限制输入值。制输入值。格式:格式:CHECK (CHECK () 例例:CREATE TABLE student (CREATE TABLE student ( sno int PRIMARY KEY, sno int PRIMARY KEY, sname char(8) NOT NULL, sname char(8) NOT NULL, sex char(2) sex char(2), cardno char(18) UNIQUE,cardno char(18) UNIQUE, CONSTRAINT chk_sex check (sex in (CONSTRAINT chk_sex check (sex in (男男, ,女女) ) )7.3 数据库的完整性控制(5) (5) 默认约束默认约束 默认约束指在插入操作中没有提供输入值时,系统自动默认约束指在插入操作中没有提供输入值时,系统自动指定值。指定值。例例:CREATE TABLE student (CREATE TABLE student ( sno int PRIMARY KEY, sno int PRIMARY KEY, sname char(8) sname char(8) NOT NULLNOT NULL, , sex char(2) sex char(2) DEFAULT DEFAULT 男男 cardno char(18) UNIQUE,cardno char(18) UNIQUE, CONSTRAINT chk_sex check (sex in (CONSTRAINT chk_sex check (sex in (男男, ,女女) ) )7.3 数据库的完整性控制2 2、域约束、域约束 CREATE DOMAIN CREATE DOMAIN CHECK CHECK () 例例7.137.13 CREATE DOMAIN Grade CHAR(1) CREATE DOMAIN Grade CHAR(1) DEFAULT DEFAULT ? ? CONSTRAINT Valid_grade CONSTRAINT Valid_grade CHECK (VALUE IN CHECK (VALUE IN ( (A A, ,B B, ,C C, ,D D, ,E E, ,? ?) ););7.3 数据库的完整性控制3 3、断言、断言 CHECKCHECK子句只对子句只对定义它的表起作用定义它的表起作用,对其它表不起作用。,对其它表不起作用。 例例7.11 7.11 对关系对关系SCSC的定义加入子句:的定义加入子句: CHECK (sno IN (SELECT sno CHECK (sno IN (SELECT sno FROM StudentFROM Student) CHECK (cno IN (SELECT cno CHECK (cno IN (SELECT cno FROM CourseFROM Course) 当对表当对表StudentStudent中删除一个元组时,这个操作与关系中删除一个元组时,这个操作与关系SCSC的的CHECKCHECK无无关。关。 CHECKCHECK子句中的条件尽量不要涉及其他关系。子句中的条件尽量不要涉及其他关系。7.3 数据库的完整性控制 当约束条件涉及多个表、使用聚集操作时应使用断言。当约束条件涉及多个表、使用聚集操作时应使用断言。 格式:格式:CREATE ASSERTION CREATE ASSERTION CHECK ( CHECK () 例例 7.15 7.15 每门课程只允许每门课程只允许100100个学生选修。个学生选修。 CREATE ASSERTION Asser1CREATE ASSERTION Asser1 CHECK (ALL(SELECT COUNT(sno) CHECK (ALL(SELECT COUNT(sno) FROM SC FROM SC GROUP BY cno)=100); GROUP BY cno)=100); 例例 7.16 7.16 不允许计算机学院的学生选修不允许计算机学院的学生选修019019号课程。号课程。 CREATE ASSERTION Asser2CREATE ASSERTION Asser2 CHECK NOT EXISTS CHECK NOT EXISTS (SELECT * (SELECT * FROM Student,SC FROM Student,SC WHERE Student.sno=SC.sno AND WHERE Student.sno=SC.sno AND Student.dept=Student.dept=计算机学院计算机学院 AND SC.cno=AND SC.cno=019019););7.4 触发器 n 触发器:是靠事件驱动的特殊过程。n 触发器与存储过程的区别: 存储过程通过其他程序的调用来运行,或直接启动运行,可传递参数;而触发器的启动运行必须由一个发生的事件来激发,它是自动隐式运行的,触发器不能接收参数,也不能被调用。n 触发器的类型:n DML触发器:它是在执行insert、update或delete语句时被激发执行的,它只能定义在表上。n 替代触发器:是被激发用以代替执行DML语句,它可以定义在表或视图上。n 系统触发器:它是在执行create、alter或drop语句;执行数据库的启动或关闭、用户的登录或退出语句时被激发执行的。n 7.4 触发器 n 触发器的主要用途:n 审计:可记录登录数据库的用户。将更新数据的用户和时间日期等信息记录在审计表中。n 实现复杂的业务规则:如将被删除的用户保存在用户历史信息中;更新股票表只能在上市交易时间内。n 可进行系统事件的处理:在表中内容发生变更时,自动通知其他程序采取相应的处理。n 增强表的完整性约束:如更新职工的工资时更新后的工资不能低于更新前的工资。7.4 触发器 n 触发器的组成:n 触发事件n 触发条件n 触发器动作n 触发器的一般模型: CREATE TRIGGER BEFORE|AFTER|INSTEAD OF ON REFERENCING OLD AS NEW AS OLD TABLE AS NEW TABLE AS FOR EACH ROW|STATEMENT WHEN 7.4 触发器 n : INSERT|DELETE|UPDATEOF n FOR EACH ROW|STATEMENT: 指定触发器的粒度。n FOR EACH ROW: 为行级触发器,当该触发器监视的表中的元组发生改变时,就激活触发器,每变更一行就触发一次。n FOR EACH STATEMENT(默认): 为语句级触发器。在被监控表上执行INSERT、DELETE或UPDATE语句,就会激活触发器,而不管该语句的执行会改变多少元组(即使没有改变发生也会激活触发器)。该触发器就在语句执行之前或之后只激发一次。 n REFERENCING: 指向更新前或更新后的内容。n BEFORE|AFTER|INSTEAD OF: 指定触发器执行的时机。7.4 触发器 n 在行级触发器中,REFERENCING的格式: REFERENCING OLD AS NEW AS 触发事件 旧行别名 新行别名insert 无 指定update 指定 指定delete 指定 无7.4 触发器 n BEFORE 触发器 (前触发器) 在触发事件之前执行。不允许它们修改数据库,但可以检测WHEN子句中定义的前提条件,接受或终止触发事件。BEFORE触发器的一个典型用途是保持应用指定的数据完整性。n 例:有关系 Transcript(sno,cno,semester,grade) CrsLimits(cno,semester,limit) 创建一个触发器,它监控插入到Transcript中的元组,以限制课程注册的人数。CREATE TRIGGER CountCheck BEFORE INSERT ON Transcript REFERENCING NEW AS N FOR EACH ROW WHEN (SELECT COUNT(T.sno) FROM Transcript T WHERE T.cno=N.cno AND T.semester=N.semester) =(SELECT limit FROM CrsLimits L WHERE L.cno=N.cno AND L.semester=N.semester) ROLLBACK7.4 触发器 n AFTER 触发器 (后触发器) 在触发事件已经改变数据库之后执行。允许它们可以改变数据库,因此它们可以激活其他触发器。AFTER触发器作用于应用逻辑的扩展。n 例:有关系 EMP(eno,ename,esex,salary,dno) 创建一个触发器,它监控雇员工资的涨幅不能超过5%。CREATE TRIGGER LimitSalaryRaise AFTER UPDATE OF salary ON EMP REFERENCING OLD AS O NEW AS N FOR EACH ROW WHEN (N.salary-O.salary0.05*O.salary) UPDATE EMP SET salary=1.05*O.salary WHERE eno=O.eno7.4 触发器 例例7.187.18 规定修改规定修改SCSC表的表的gradegrade值时,修改后的值不能低于值时,修改后的值不能低于修改前的值。修改前的值。 CREATE TRIGGER Trig_gradeCREATE TRIGGER Trig_grade AFTER UPDATE OF grade AFTER UPDATE OF grade ON SC ON SC REFERENCING OLD AS oldg NEW AS newg REFERENCING OLD AS oldg NEW AS newg FOR EACH ROW FOR EACH ROW WHEN (oldg.gradenewg.grade) WHEN (oldg.gradenewg.grade) UPDATE SC UPDATE SC SET grade=oldg.grade SET grade=oldg.grade WHERE cno=newg.cno; WHERE cno=newg.cno;触发事件触发条件触发器动作7.4 触发器 n 例:有关系 EMP(eno,ename,esex,salary,dno) 创建一个触发器,每次工资增长之后将所有雇员新的平均工资记录到LOG表中。CREATE TRIGGER RecordNewAverage AFTER UPDATE OF salary ON EMP FOR EACH STATEMENT INSERT INTO LOG VALUES (CURRENT_DATE, (SELECT AVG(salary) FROM EMP) 7.4 触发器 n 例:有关系:Transcript(sno,cno,semester,grade) Teaching(tno,cno,semester) 有视图:IdleTeaching(cno,semester),该视图仅包含那些Teaching表中与Transcript表中没有相关元组的课程(既没有学生选修的课程)。 创建一个触发器,当学生放弃或修改选修的课程时,从Teaching表中删除所有在IdleTeaching中发现的元组。CREATE TRIGGER MainTainCoursesNonEmpty AFTER DELETE,UPDATE OF cno,semester ON Transcript FOR EACH STATEMENT DELETE FROM Teaching WHERE EXISTS (SELECT * FROM IdleTeaching T WHERE semester=T.semester AND cno=T.cno) 7.4 触发器 n INSTEAD OF 触发器 (替换触发器) INSTEAD OF触发器最普遍的应用是对视图的维护。视图上的更新事件可以通过触发器监控,但替换更新的是视图的基础表。n 例:有关系 EMP(eno,ename,esex,salary,dno) DEPT(dno,dname) 有下面的视图: CREATE VIEW WorksIn(eno,dname) AS SELECT (EMP.eno,DEPT.dname) FROM EMP,DEPT WHERE EMP.dno=DEPT.dno 7.4 触发器 n 假设在视图上执行下面的操作: DELETE FROM WorksIn WHERE eno=11111111 该操作被转换为该视图基础表EMP和DEPT上相应的操作。但是,可能会有多种转换:可以删除eno为11111111的雇员所在的部门;可以删除雇员;可以将雇员元组中的dno字段置为NULL。 无法自动决定这三种可能性中哪种是正确的。可以设计INSTEAD OF触发器来指定合适的动作。如: CREATE TRIGGER WorksInTrigi INSTEAD OF DELETE ON WorksIn REFERENCING OLD AS O FOR EACH ROW UPDATE EMP SET dno=NULL WHERE eno=O.enoSQL Server中触发器的创建 CREATE TRIGGER trigger_name ON table | view WITH ENCRYPTION - 加密文本加密文本 FOR | AFTER | INSTEAD OF -触触发类型型INSERT , UPDATE -触触发事件事件AS IF UPDATE ( column ) - 测试在在指指定定列列上上进行行的的INSERT或或UPDATE操作操作 AND | OR UPDATE ( column ) n | IF (COLUMNS_UPDATED() bitwise_operator -测试是是否否插插入入或或修改了提及的列。修改了提及的列。 updated_bitmask) comparison_operator column_bitmask n sql_statement n -触触发器器动作作 inserted表和deleted表 在触在触发器器执行的行的时候,会候,会产生两个生两个临时表:表:inserted表表和和deleted表表。 deleted表用于存表用于存储DELETE和和UPDATE语句所影响的行句所影响的行的副本。在的副本。在执行行DELETE或或UPDATE语句句时,行从触,行从触发器表器表中中删除,并除,并传输到到deleted表中。表中。 inserted表用于存表用于存储INSERT和和UPDATE语句所影响的行句所影响的行的副本。在一个插入或更新事的副本。在一个插入或更新事务处理中,新建行被同理中,新建行被同时添加添加到到inserted表和触表和触发器表中。器表中。 inserted表和deleted表 在在对具有触具有触发器的表器的表进行操作行操作时,将,将进行下列操作:行下列操作:执行行INSERT操操作作插插入入到到触触发器器表表中中的的新新行行被被插插入到入到inserted表中。表中。执行行DELETE操操作作从从触触发器器表表中中删除除的的行行被被插插入到入到deleted表中。表中。执行行UPDATE操操作作先先从从触触发器器表表中中删除除旧旧行行,然然后后再再插插入入新新行行。其其中中被被删除除的的旧旧行行被被插插入入到到deleted表表中中,插插入入的的新新行行被被插插入入到到inserted表表中。中。 创建触发器例例例1:创建一个能建一个能实现删除除student表中的学表中的学生生记录时,同,同时删除除sc表中表中对应的成的成绩记录的触的触发器。器。CREATE TRIGGER trig1 /*创建触建触发器器trig1*/ON studentFOR DELETEAS DELETE sc WHERE sc.sno= (SELECT sno FROM deleted)创建触发器例例例2:创建一个触建一个触发器,要求修改器,要求修改SC表的表的grade值时,修改后的,修改后的值不能低不能低于修改前的于修改前的值。DECLARE oldvalue int,newvalue intCREATE TRIGGER trig2 /*创建触建触发器器trig1*/ON scFOR UPDATEAS IF UPDATE(grade) BEGIN SELECT oldvalue=grade FROM deleted SELECT newvalue=grade FROM inserted IF newvalueoldvalue UPDATE SC SET grade=olavalue WHERE sno=(SELECT sno FROM deleted) AND cno=(SELECT cno FROM deleted) END第七章 数据库安全性与完整性 小结习题:P.229第10 (c)、(e)、(f)第12 (2)、(4) 数据库安全控制技术 用户标识与鉴别 存取控制(自主、强制存取控制) 审计 视图 密码存储 DBMS的完整性控制功能: 定义功能、检查功能、防范功能 DBMS的完整性控制策略: 利用主码实现实体完整性 利用外码实现参照完整性 利用一般约束、SQL断言等实现用户定义完整性(用触发器实现特殊要求的完整性)
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号