数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 1页第 10章 SQL语言高级功能本章概述本章的学习目标主要内容数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 2页本章概述
任何一种优秀产品都有这样一种特点,它不但具备了所有此类产品的基本功能,而且还具备了其他产品所没有的特点。就是这种独特的个性,使得这种优秀产品美名远扬。
作为一种数据库语言,SQL语言也同此理。
第 9章介绍了 SQL语言的基本特征,这是所有数据库语言都可以提供的基本操作,但是仅凭这些特征,SQL语言还无法在数据库查询语言领域居于主导地位。
本章将要介绍 SQL语言所拥有的约束、触发器等高级功能,
正是这些强大的功能和它的灵活性,使得 SQL语言具有其他数据库语言无法比拟的,也是 SQL语言垄断数据库查询语言的重要因素。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 3页本章的学习目标
理解 SQL语言的特征;
了解和掌握约束的概念、作用和定义方法;
了解和掌握触发器的作用和定义方式;
了解和掌握游标的概念和定义过程技术;
理解嵌入式 SQL语言的基本概念;
了解 SQL安全控制和用户授权语句的概念和特点。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 4页主要内容
10.1 约束
10.2 触发器
10.3 游标
10.4 嵌入式 SQL语言
10.5 安全控制和权限管理
10.6 动手练习
10.7 本章小结数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 5页
10.1 约束
在建立数据库模式时,我们强调了需要为数据库约束建立模式,因为这些约束也是数据库模式的一部分。
同样,在定义关系模式时,也需要定义许多约束形式,这些约束包括键码约束、外键码约束、非空约束,CHECK约束和断言约束。定义这些约束形式,可以大大提高关系 (表 )中数据的质量。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 6页键码约束
在数据库建模中,最重要的约束类型是声明某个属性或属性集是关系 (表 )的键码。键码的含义就是禁止关系中的两个元组在组成键码的属性上取值一致。
根据键码的作用不同,可以把键码划分成主键码和候选键码两种类型。主键码使用关键字 PRIMARY KEY说明,而候选键码的说明使用关键字 UNIQUE。两种键码的主要区别在于前者的键码属性不允许空值,一个表中最多有一个主键码,而后者的键码属性允许空值,且一个表中可以有多个候选键码。当然,这两种键码都不允许出现键码属性取值相同的两个或两个以上的元组同时存在。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 7页外键码约束
数据库中存储的数据是客观现实的实体和实体之间的联系。也就是说,存储的信息包括实体本身的信息和实体之间联系的信息。前面讲过的内容基本上都是用来说明如何处理实体本身的信息,
现在我们将要介绍如何存储实体之间的联系信息。
外键码约束就是实现实体之间联系信息存储的方式,也是数据库中非常重要的一种约束。外键码约束实现了两个关系之间属性互相依赖存在的意义。如果把一个关系的属性或属性集定义为外键码,那么它会参照另一个关系 (或同一个关系 )的某一个或多个属性。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 8页非空约束
最简单的一种约束是非空约束,这种约束使用关键字 NOT NULL说明。该约束的效果就是不接受该属性为空的元组。该约束的定义也是在
CREATE TABLE语句中的属性的数据类型后面说明。
例如,图 10-5就是一个使用了非空约束定义的
CREATE TABLE语句。在这里,除了第 (4)行的属性之外,都包含了非空约束,只是第 (4)行属性
pageNumber的约束定义为可空约束。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 9页
CHECK约束
在数据库中,经常需要提供一些措施保证数据满足复杂的要求。例如,要求在关系 Author中,插入的作者性别要么是“男”,要么是“女”,而不能是其他数据。在关系
Book中,要求插入的图书价格大于 2.5元但是小于 168元且不能等于 50元和 100元。这些约束都是用户可能会碰到的。如果不能保证这些约束的实现,那么数据库中的数据质量就无法得到保障。幸运的是,在 SQL语言中,可以使用 CHECK约束来实现这种复杂的约束要求。
CHECK约束就是用来指定某一个或多个属性可以满足的条件。当关系中的某个属性定义一个 CHECK约束后,所有的元组插入就需要检查是否满足这种 CHECK约束要求。
只有满足这种约束的数据才能执行成功,否则就被系统拒绝执行。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 10页断言约束
前面讲述的约束虽然功能非常强大,但是都局限在一个关系模式中,如果希望在多个关系之间保持数据的一致性,
那么这些约束就无能为力了。但是,SQL语言又提供了一个可以保证关系之间数据完整的约束,这种约束称为断言
ASSERTION。
就像许多其他数据库对象一样,断言约束也可以使用
CREATE ASSERTION语句来定义。 CREATE
ASSERTION语句的基本元素包括关键字 CREATE
ASSERTION、断言名称、关键字 CHECK和使用括号括起来的条件。具体的 CREATE ASSERTION语句的语法形式如图 10-9所示。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 11页主要内容
10.1 约束
10.2 触发器
10.3 游标
10.4 嵌入式 SQL语言
10.5 安全控制和权限管理
10.6 动手练习
10.7 本章小结数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 12页
10.2 触发器
触发器,英文名称是 Trigger,含义是枪的板机,具有一触即发的意义。触发器是一组可以由系统自动执行对数据库修改的语句。
有时候,触发器也称为主动规则 (active
rule),或称为事件 —条件 —动作规则
(event – condition – action rule,ECA规则 )。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 13页触发器的结构数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 14页触发器示例数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 15页主要内容
10.1 约束
10.2 触发器
10.3 游标
10.4 嵌入式 SQL语言
10.5 安全控制和权限管理
10.6 动手练习
10.7 本章小结数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 16页
10.3 游标
对于查询语句例如 SELECT的执行结果,
我们只能察看,无法对这些数据采取逐行处理的方式。如果希望对查询的结果关系进行逐行处理,那么可以使用 SQL语言中的游标功能。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 17页定义游标
游标的定义过程是非常规范的。只有声明的游标,
才能使用。但是声明的游标,只有在打开时候,
才能逐行使用。当游标不使用的时候,还必须把游标关闭。这是因为游标非常消耗系统的内存资源。
下面介绍游标的定义过程。
(1) 声明游标。
(2) 打开游标。
(3) 取游标数据。
(4) 关闭游标。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 18页游标的选项
游标具有强大的灵活的功能,这些功能需要使用游标选项来定义。例如,可以指定取出元组的顺序、限制游标的基表数据修改时对游标的影响、改变游标的移动方式等。
可以在游标的声明语句中增加关键字 ORDER BY来对游标中的数据进行排序,这样可以方便对游标数据的处理。
例如,在上面的游标示例中,可以指定游标中的价格数据按照从高到低的顺序进行排列。
如果游标正在处理的时候,其基表中的数据发生了变化,
那么这种变化是否能反映到游标中呢?大多数情况下,用户只是需要打开游标时刻的数据,不要求游标中的数据发生变化,那么可以使用 INSENSITIVE选项来声明游标为不敏感的。该选项也可以用在 DECLARE语句中。
游标的移动方式也可以进行改变。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 19页主要内容
10.1 约束
10.2 触发器
10.3 游标
10.4 嵌入式 SQL语言
10.5 安全控制和权限管理
10.6 动手练习
10.7 本章小结数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 20页
10.4 嵌入式 SQL语言
前面介绍的 SQL语言都是单独的 SQL语言,
与其他程序设计语言毫不相干。但是,很多情况下,SQL语言将嵌入在其他宿主语言中,经过编译和链接之后,可以执行更加强大和灵活的操作。
支持嵌入式 SQL语言的宿主语言包括 C、
COBOL,Fortran,PASCAL等其他高级程序设计语言以及许多脚本语言,例如
VBScript等。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 21页主要内容
10.1 约束
10.2 触发器
10.3 游标
10.4 嵌入式 SQL语言
10.5 安全控制和权限管理
10.6 动手练习
10.7 本章小结数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 22页
10.5 安全控制和权限管理
数据库中存储了大量的系统和用户数据,
这些数据不能够被非授权用户操作和使用。
只有经过授权的用户,才能使用那些允许他使用的数据。这种安全性的实现依赖于数据库中权限的控制和管理。
本节将要介绍权限的类型和如何执行授权操作。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 23页权限的类型
对于用户使用数据而言,在 SQL语言中,定义了
6种类型的权限。只有经过授权的用户才能使用这些权限来使用相应的数据。
这些用户权限如下所示:
SELECT
INSERT
DELETE
UPDATE
REFERENCES
USAGE
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 24页授权和收权
用户必须拥有了对相应数据的权限,才能使用相应的数据。授权可以使用 GRANT语句,该语句的组成元素包括关键字 GRANT、一个或多个权限的列表、关键字 ON、一个数据库对象、关键字 TO、
一个或多个用户的列表和可选的关键字 WITH
GRANT OPTION。在权限列表中,可以使用关键字 ALL PRIVILEGES代替所有的权限
如果希望把所授的权限收回,那么可以使用
REVOKE语句。 REVOKE语句的组成元素包括关键字 REVOKE、一个或多个权限的列表、关键字
ON、一个数据库对象、关键字 FROM、一个或多个用户的列表。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 25页主要内容
10.1 约束
10.2 触发器
10.3 游标
10.4 嵌入式 SQL语言
10.5 安全控制和权限管理
10.6 动手练习
10.7 本章小结数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 26页
10.6 动手练习
首先使用 Microsoft SQL Server系统。在如图 10-30所示的窗口中,使用
sp_helptext存储过程查看
employee_insupd触发器的文本。由触发器 employee_insupd的文本可以看到,该触发器的类型是 INSERT和 UPDATE。当有
INSERT操作或 UPDATE操作影响表
employee时,该触发器就被触发执行。
数据库系统原理与应用教程 (第二版 ) 第 10章 SQL语言高级功能 第 27页主要内容
10.1 约束
10.2 触发器
10.3 游标
10.4 嵌入式 SQL语言
10.5 安全控制和权限管理
10.6 动手练习
10.7 本章小结