西华师范大学计算机学院
第三章 关系数据库标准语言 SQL
(续 2)
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
3.6 数据控制
? 概述
? 3.6.1 授权
? 3.6.2 收回权限
? 小结
概述
数据控制亦称为数据保护, 包括数据的:
? 安全性控制
? 完整性控制
? 并发控制
? 恢复
SQL语言的数据控制功能
SQL语言提供了数据控制功能, 能够在一
定程度上保证数据库中数据的安全性,
完整性, 并提供了一定的并发控制及恢
复能力 。
1,完整性
数据库系统必须保证数据库中的数据
是完整的。在更新数据库时,关系中不
能出现不符合完整性要求的元组,这样
才能给用户提供正确、有效的信息。实
现这一目的的最直接方法,是要求用户
在编写数据库应用程序时,对每个插入、
删除、修改操作,都加入必要的完整性
检查代码。
实体完整性和主码
? 在 SQL中, 实体完整性是通过主码 ( Primary Key)
来实现的 。 一旦某个属性或属性组被定义为主码,
该主码的每个属性就不能为空值, 并且在关系中
不能出现主码值完全相同的两个元组 。 主码可在
定 义 关 系 的 CREATE TABLE 语 句 中 使 用
PRIMARY KEY关键字加以定义 。 有两种定义主码
的方法, 一种是在 属性后增加关键字, 另一种是
在属性表中加入 额外的定义主码的子句,
PRIMARY KEY(主码属性名表 )
例 在 employee表中说明 eno为主码, 有两
种方法:
1)使 eno为主码
CREATE TABLE employee
(eno char(4) PRIMARY KEY,
name varchar(8),
sex char(2),
age integer,
dno char(2));
2)单独说明主码
CREATE TABLE employee
(eno char(4),
name varchar(8),
sex char(2),
age integer,
dno char(2),
PRIMARY KEY(eno));
如果关系的主码只含有单个属性,
上面的两种方法都可以使用 。 如果主码
由两个或两个以上属性组成, 只能使用
第 2)种方法 。 如 itememp表的主码由 ino和
eno 组成, 则只能采用第 2)种方法,
PRIMARY KEY子句应说明成:
PRIMARY KEY(ino,eno)
SQL中, 并没有强制规定必须为每个关系指
定主码, 但为每个关系指定主码通常更好一些 。
除了主码, SQL中使用关键字 UNIQUE,说明该
属性 ( 或属性组 ) 的值不能重复出现 。 但说明为
UNIQUE的属性可以定义为空值, 与主码又有所
不同 。 并且一个表中只能有一个主码, 但可以有
多个, UNIQUE”说明 。
例 说明 employee表中职工不能重名,有两种方法:
(1)在 name属性后面加上 UNIQUE说明:
name varchar(8) UNIQUE,
(2)在属性列表后使用 UNIQUE说明:
UNIQUE( name)
外部码约束的说明
说明外部码的方法有两种:
(1)在该属性的说明 ( 属性名, 类型 ) 后直接加
上关键字 REFERENCES,后跟对应表的主码说明 。
格式为
REFERENCES <表名 >(<属性名 >)
其中表名为参照关系名, 属性名为参照关系的主码 。
(2)在 CREATE TABLE语句的属性清单后, 加上
外部码的说明子句, 格式为
FOREIGN KEY <属性名表 > REFERENCES <表名 >(<属性名表 >)
其中, 属性名表中的属性可以多于一个, 但必须前后
对应 。
例 说明 employee表中 dno为外部码, 参照关系
为 department。 两种方法分别如下:
1)
CREATE TABLE employee
(eno char(4) PRIMARY KEY,
name verchar(8),
sex char(2),
age integer,
dno char(2) REFERENCES department(dno));
2)
CREATE TABLE employee
(eno char(4) PRIMARY KEY,
name varchar(8),
sex char(2),
age integer,
dno char(2),
FOREIGN KEY dno REFERENCES department(dno));
? 注意,在说明 dno为 employee的外部码时,
department关系中的 dno必须已被说明为主码。
用户自定义完整性约束
用户自定义完整性约束取决于应用
环境的需要, 因此不同数据库应用系统
的自定义完整性要求是千差万别的, 有
些较简单, 有些则较复杂 。 SQL中提供
了非空约束, 对属性的 CHECK约束, 对
元组的 CHECK约束, 触发器等来实现用
户的各种完整性要求 。
一, 基于属性的 CHECK约束
使用 CHECK( 检查 ) 子句可保证属
性值满足某些前提条件 。 CHECK子句的
一般格式为
CHECK <条件 >
属性的 CHECK约束既可跟在属性的
定义后, 也可在定义语句中另增一子句
加以说明 。
例:规定 employee表中属性 age的值不能小于 18,大
于 65。 只需将 age属性说明为如下的形式:
age integer CHECK(age>=18 AND age<=65)
或在属性列表的最后加上
CHECK(age>=18 AND age<=65)
CHECK还可以模拟枚举类型,例如,可在
CREATE TABLE语句中用以下子句说明属性 sex
的取值只能取, 男, 或, 女,,
Sex char(2) CHECK(sex IN("男 ","女 "))
例如
CREATE TABLE publishers
( pub_id char(4) NOT NULL
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') )
二, 基于元组的约束
对 表 内 元 组 说 明 约 束 时, 在
CREATE TABLE语句中的属性表, 主码,
外部码的说明之后加上 CHECK子句 。 每
当对元组进行插入或修改操作时, 都要
对 CHECK子句的条件表达式求值, 如果
条件为假, 违背了约束, 系统将拒绝该
插入或修改操作 。
例,工资表 salary的定义:
CREATE TABLE salary
(Eno char(4) PRIMARY KEY,
Basepay decimal(7,2),
Service decimal(7,2),
Price decimal(7,2),
Rest decimal(7,2),
Insure decimal(7,2),
Fund decimal(7,2),
CHECK(Insure+Fund<Basepay));
约束的更新
约束与数据库中的表, 视图等一样,
可以进行增加, 删除和修改的更新操作 。
为了修改和删除约束, 需要在定义约束
时对约束进行命名, 在约束前加上关键
字 CONSTRAINT和该约束的名称 。
例如说明 employee表中的主码和外部码时,
分别命名为 PK-employee和 FK-employee:
Eno char(4) CONSTRAINT PK-employee PRIMARY
KEY,
dno char(4) CONSTRAINT FK-employee FOREIGN
KEY
REFERENCES department(dno)
上例中的约束可以在定义时命名:
CONSTRAINT RightSalary
CHECK(Insure+Fund<Basepay)
例 删除 employee表中的外部码约束 FK-employee:
ALTER TABLE employee DROP CONSTRAINT FK-employee;
例,修改对 Salary的约束 RightSalary中的表达式为:
Insure+Fund<Rest。
由于 SQL不能直接修改约束, 可通过以下两步完成对约
束的修改:
(1)删除原约束,ALTER TABLE Salary DROP CONSTRAINT
RightSalary;
(2)增加同名约束,ALTER TABLE Salary ADD CONSTRAINT
RightSalary CHECK( Insure+Fund<Rest);
SQL中的触发器
当用户要实现的完整性约束比较复杂
时, 上面介绍的 CHECK等约束方式有时无
法实现, 而通过触发器则可实现复杂的用户
定义完整性约束 。 所谓触发器就是一类由事
件驱动的特殊过程, 一旦由某个用户定义,
任何用户对该触发器指定的数据进行增, 删
或改操作时, 系统将自动激活相应的触发器,
在核心层进行集中的完整性控制 。
触发器的组成和类型
触发器的定义包括两个方面:
? ·指明触发器的触发事件;
? ·指明触发器执行的动作 。
? 触发事件包括表中行的插入, 删除和
修改, 即执行 INSERT,DELETE,UPDATE语
句 。 在修改操作 ( UPDATE) 中, 还可以指定,
特定的属性或属性组的修改为触发条件 。 事件
的触发还有两个相关的时间,Before和 After。
Before触发器是在事件发生之前触发, After触
发器是在事件发生之后触发 。
? 触发动作实际上是一系列 SQL语句, 可以有两
种方式:
(1)对被事件影响的每一行 ( FOR EACH ROW) ——
每一元组执行触发过程, 称为行级触发器 。
(2)对整个事件只执行一次触发过程( FOR EACH
STATEMENT),称为语句级触发器。该方式是
触发器的默认方式。
SQL中的存储过程
? 存储过程类似于高级语言中的函数, 同触发器
一样, 由一组 SQL语句组成, 预先编译后存储
在数据库中, 可供应用程序多次调用, 类似于
高级语言中的函数 。 使用存储过程既能方便软
件开发, 又减少了解释执行 SQL语句时句法分
析和查询优化的时间, 提高了效率 。
? 如在客户 /服务器体系结构下, 应用程序 ( 客户
端 ) 只需向服务器发出一次请求调用一个存储
过程, 服务器上就可一次执行一批 SQL命令,
中间结果不用送回客户端, 大大降低了网络流
量和服务器的开销 。
2,并发控制
? 并发控制, 当多个用户并发地对数据库进行操作时,对
他们加以控制、协调,以保证并发操作正确执行,保
持数据库的一致性。
? SQL语言并发控制能力:
提供事务、事务开始、事务结束、提交等概念
所谓事务,就是用户定义的一个数据库操作序列,是
一个不可分割的工作单位。不论有无故障,数据库系
统必须保证事务的正确执行 ——或者执行整个事务或者
属于该事务的操作一个也不执行。 SQL的一个事务,
可以是一条 SQL语句、一组 SQL语句或整个程序。一
般地,一个程序中包含有多个事务。
3,恢复
? 恢复, 当发生各种类型的故障导致数据库处于
不一致状态时,将数据库恢复到一致状态的功
能。
? SQL语言恢复功能:
提供事务回滚、重做等概念
( UNDO,REDO)
4,安全性
? 安全性:保护数据库, 防止不合法的使
用所造成的数据泄露和破坏 。
? 保证数据安全性的主要措施
存取控制:控制用户只能存取他有权存取的数据
规定不同用户对于不同数据对象所允许执行的操作
DBMS实现数据安全性保护的过程
? 用户或 DBA把授权决定告知系统
? SQL的 GRANT和 REVOKE
? DBMS把授权的结果存入数据字典
? 当用户提出操作请求时, DBMS根据授
权定义进行检查, 以决定是否执行操作
请求
安全性 (续 )
? 谁定义?
DBA和表的建立者(即表的属主)
? 如何定义?
SQL语句:
GRANT
REVOKE
3.6.1 授 权
? GRANT语句的一般格式:
GRANT <权限 >[,<权限 >]...
[ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >]...
[WITH GRANT OPTION];
? 谁定义? DBA和表的建立者 ( 即表的属主 )
? REVOKE功能:将对指定操作对象的指定操作
权限授予指定的用户 。
(1) 操作权限
(2) 用户的权限
? 建表 ( CREATETAB) 的权限,属于 DBA
? DBA授予 -->普通用户
? 基本表或视图的属主拥有对该表或视图
的一切操作权限
? 接受权限的用户,
一个或多个具体用户
PUBLIC(全体用户)
(4) WITH GRANT OPTION子句
? 指定了 WITH GRANT OPTION子句,
获得某种权限的用户还可以把这种权限
再授予 别的用户。
? 没有指定 WITH GRANT OPTION子句,
获得某种权限的用户只能使用该权限,
不能传播 该权限
例题
例 1 把查询 Student表权限授给用户 U1
GRANT SELECT
ON TABLE Student
TO U1;
例题(续)
例 2 把对 Student表和 Course表的全部权限
授予用户 U2和 U3
GRANT ALL PRIVILIGES
ON TABLE Student,Course
TO U2,U3;
例 4
例题(续)
例 3 把对表 SC的查询权限授予所有用户
GRANT SELECT
ON TABLE SC
TO PUBLIC;
例题(续)
例 4 把查询 Student表和修改学生学号的
权限授给用户 U4
GRANT UPDATE(Sno),SELECT
ON TABLE Student
TO U4;
例题(续)
例 5 把对表 SC的 INSERT权限授予 U5用户,
并允许他再将此权限授予其他用户
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;
传播权限
执行例 5后, U5不仅拥有了对表 SC的 INSERT权限,
还可以传播此权限,
GRANT INSERT ON TABLE SC TO U6
WITH GRANT OPTION;
同样, U6还可以将此权限授予 U7:
GRANT INSERT ON TABLE SC TO U7;
但 U7不能再传播此权限 。
U5--> U6--> U7
例题(续)
例 6 DBA把在数据库 S_C中建立表的权限授
予用户 U8
GRANT CREATETAB
ON DATABASE S_C
TO U8;
例题
下面的语句将把对 Northwind数据库中 customers
表的查询权限赋予用户 test:
use northwind
grant select
on customers
to test
可以用以下语句查询表的存取权限
exec sp_helprotect customers
3.6 数据控制
? 概述
? 3.6.1 授权
? 3.6.2 收回权限
? 小结
SQL收回权限的功能
? REVOKE语句的一般格式为:
REVOKE <权限 >[,<权限 >]...
[ON <对象类型 > <对象名 >]
FROM <用户 >[,<用户 >]...;
? 功能:从指定 用户 那里收回对指定 对象
的指定 权限
例题
例 7 把用户 U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
例题(续)
例 8 收回所有用户对表 SC的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
例题(续)
例 9 把用户 U5对 SC表的 INSERT权限收回
REVOKE INSERT
ON TABLE SC
FROM U5;
例题
下面的语句将收回用户 test对 Northwind数据库
中 customers表的查询权限:
use northwind
revoke select
on customers
to test
权限的级联回收
系统将收回直接或间接从 U5处获得的对 SC
表的 INSERT权限,
-->U5--> U6--> U7
收回 U5,U6,U7获得的对 SC表的 INSERT
权限,
<--U5<-- U6<-- U7
小结,SQL灵活的授权机制
? DBA拥有对数据库中所有对象的所有权限,并可以根据
应用的需要将不同的权限授予不同的用户。
? 用户对自己建立的基本表和视图拥有全部的操作权限,
并且可以用 GRANT语句把其中某些权限授予其他用户 。
? 被授权的用户如果有, 继续授权, 的许可, 还可以把
获得的权限再授予其他用户 。
? 所有授予出去的权力在必要时又都可以用 REVOKE语句
收回。