2023年8月1日发(作者:)
数据库原理 课程教案
授课题目(教学章、节或主题):
第六章 数据库安全和完整性:包括计算机安全性概述,数据库安全性控制,视图机制,审计,数据加密,统计数据库安全性;数据库的完整性约束,SQL的完整性控制,包括域完整性、实体完整性和参照完整性。
教学目的、要求(分掌握、熟悉、了解三个层次):
了解:数据库安全性的基本概念。
计算机系统安全性的基本概念。
数据库的完整性的基本概念。
理解:统计数据库安全性
Oracle数据库的安全性措施
数据库的完整性约束条件
掌握:掌握什么是数据库的安全性问题,牢固掌握数据库管理系统实现数据库安全性控制的常用方法和技术。
什么是数据库的完整性
用SQL语言定义关系模式的完整性约束条件。
重点:使用SQL中的GRANT 语句和 REVOKE 语句来实现数据库的实现自主存取控制功能。使用SQL中CREATE ROLE语句创建角色,用GRANT 语句给角色授权。掌握视图机制在数据库安全保护中的作用。
牢固掌握DBMS完整性控制机制的三个方面,即完整性约束条件的定义、完整性约束条件的检查和违约反应。需要举一反三的:用SQL语言定义关系模式的完整性约束条件。包括定义每个模式的主码;定义参照完整性;定义与应用有关的完整性。
难点:强制存取控制(MAC)机制中确定主体能否存取客体的存取规则,同学们要理解并掌握存取规则为什么要这样规定。
RDBMS如何实现完整性的策略,即当操作违反实体完整性、参照完整性和用户定义的完整性约束条件时,RDBMS如何进行处理,以确保数据的正确与有效。其中比较复杂的是参照完整性的实现机制。
- 1 - 课时安排:6节
授课方式:理论课
教学基本内容:
以教师为中心的讲授、提问及论证等的教学方法,教学手段使用板书与多媒体相结合的手段。
第六章 数据库安全和完整性
6.1 概述
数据库的数据保护主要包括数据库的安全性和完整性保护机制。
问题的提出
数据库的一大特点是数据可以共享
数据共享必然带来数据库的安全性问题
数据库系统中的数据共享不能是无条件的共享
例: 军事秘密、国家机密、新产品实验数据、市场需求分析、市场营销策略、销售计划、
客户档案、医疗档案、银行储蓄数据
数据库安全性
的用户访问允许他存取的数据
数据库中数据的共享是在DBMS统一的严格的控制之下的共享,即只允许有合法使用权限
数据库系统的安全保护措施是否有效是数据库系统主要的性能指标之一
什么是数据库的安全性
数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏,从而确保数据库中数据的安全。
数据库完整性
数据库的完整性
数据的正确性和相容性
是数据库的一个重要特征,也是保证数据库中的数据切实有效、防止错误、实现商业规则的一种重要机制。
数据的完整性和安全性是两个不同概念
- 2 - 数据的完整性
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
防范对象:不合语义的、不正确的数据
数据的安全性
保护数据库防止恶意的破坏和非法的存取
防范对象:非法用户和非法操作
为维护数据库的完整性,DBMS必须:
1.提供定义完整性约束条件的机制
2.提供完整性检查的方法
3.违约处理
6.2 数据库的安全性
非法使用数据库的情况
编写合法程序绕过DBMS 及其授权机制
直接或编写应用程序执行非授权操作
通过多次合法查询数据库从中推导出一些保密数据
计算机系统中,安全措施是一级一级层层设置
计算机系统的安全模型
数据库安全性控制的常用方法
用户标识和鉴定
存取控制
视图
审计
密码存储
- 3 - 6.2.1 用户标识与鉴别
用户标识与鉴别
(Identification & Authentication )
系统提供的最外层安全保护措施
用户标识
口令
系统核对口令以鉴别用户身份
用户名和口令易被窃取
每个用户预先约定好一个计算过程或者函数
6.2.2 存取控制
存取控制机制组成
定义用户权限
合法权限检查
用户权限定义和合法权检查机制一起组成了 DBMS 的安全子系统
常用存取控制方法
自主存取控制 (Discretionary Access Control , 简称DAC )
C2 级
灵活
强制存取控制 (Mandatory Access Control , 简称 MAC )
B1 级
严格
1、自主存取控制方法
通过 SQL 的 GRANT 语句和 REVOKE 语句实现
用户权限组成
数据对象
操作类型
定义用户存取权限:定义用户可以在哪些数据库对象上进行哪些类型的操作
- 4 - 定义存取权限称为授权
关系数据库系统中存取控制对象
对象类对象
型
数据库 模式
基本表
模式
数据
视图
索引
操 作 类 型
CREATE SCHEMA
CREATE TABLE,ALTER TABLE
CREATE VIEW
CREATE INDEX
数据
基本表和视SELECT,INSERT,UPDATE,DELETE,图
REFERENCES,
ALL PRIVILEGES
属性列 SELECT,INSERT,UPDATE, REFERENCES
ALL PRIVILEGES
授权与回收
一、GRANT
GRANT语句的一般格式:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
语义:将对指定操作对象的指定操作权限授予指定的用户
发出GRANT:
DBA
数据库对象创建者(即属主Owner)
拥有该权限的用户
按受权限的用户
一个或多个具体用户
PUBLIC(全体用户)
WITH GRANT OPTION 子句
WITH GRANT OPTION子句:
- 5 -
指定:可以再授予
没有指定:不能传播
不允许循环授权
例题
[例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;
[ 例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;
传播权限
- 6 - 执行例5后,U5不仅拥有了对表SC的INSERT权限,
还可以传播此权限:
[例6] GRANT INSERT ON TABLE SC TO U6
WITH GRANT OPTION;
同样,U6还可以将此权限授予U7:
[例7] GRANT INSERT ON TABLE SC TO U7;
但U7不能再传播此权限。
下表是执行了[例1]到[例7]的语句后,学生-课程数据库中的用户权限定义表
授权用户名
DBA
DBA
DBA
DBA
DBA
DBA
DBA
DBA
DBA
U5
U6
被授权用户名 数据库对象名
U1
U2
U2
U3
U3
PUBLIC
U4
U4
U5
U6
U7
关系Student
关系Student
关系Course
关系Student
关系Course
关系SC
关系Student
属性
关系SC
关系SC
关系SC
允许的操作类型 能否转授权
SELECT
ALL
ALL
ALL
ALL
SELECT
SELECT
TE
列UPDAINSERT
INSERT
INSERT
不能
不能
不能
不能
不能
不能
不能
不能
能
能
不能
二、REVOKE
授予的权限可以由DBA 或其他授权者用REVOKE 语句收回
REVOKE 语句的一般格式为:
REVOKE < 权限>[,< 权限>]...
[ON < 对象类型> < 对象名>]
FROM < 用户>[,< 用户>]...;
[ 例8] 把用户U4 修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
- 7 - [ 例9] 收回所有用户对表SC 的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
[ 例10] 把用户U5 对SC 表的INSERT 权限收回
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE ;
将用户U5的INSERT权限收回的时候必须级联(CASCADE)收回
系统只收回直接或间接从U5处获得的权限
执行[例8]到[例10]的语句后,学生-课程数据库中的用户权限定义表
授权用户名
DBA
DBA
DBA
DBA
DBA
DBA
被授权用户名 数据库对象名 允许的操作类型 能否转授权
U1
U2
U2
U3
U3
U4
关系Student
关系Student
关系Course
关系Student
关系Course
关系Student
SELECT
ALL
ALL
ALL
ALL
SELECT
不能
不能
不能
不能
不能
不能
小结:SQL灵活的授权机制
DBA:拥有所有对象的所有权限
不同的权限授予不同的用户
用户:拥有自己建立的对象的全部的操作权限
GRANT:授予其他用户
被授权的用户
“继续授权”许可:再授予
所有授予出去的权力在必要时又都可用REVOKE语句收回
三、创建数据库模式的权限
DBA在创建用户时实现
- 8 - CREATE USER语句格式
CREATE USER
[WITH][DBA | RESOURCE | CONNECT]
拥有的权限
可否执行的操作
CREATE
USER
DBA
可以
RESOURCE
不可以
CONNECT
不可以
CREATE
SCHEMA
可以
不可以
不可以
CREATE
TABLE
可以
不可以
不可以
登录数据库 执行数据查询和操纵
可以
不可以
可以,但必须拥有相应权限
数据库角色
数据库角色:被命名的一组与数据库操作相关的权限
角色是权限的集合
可以为一组具有相同权限的用户创建一个角色
简化授权的过程
一、角色的创建
CREATE ROLE <角色名>
二、给角色授权
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…
三、将一个角色授予其他的角色或用户
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION]
四、角色权限的收回
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
- 9 - FROM <角色>[,<角色>]…
[例11] 通过角色来实现将一组权限授予一个用户。
步骤如下:
1. 首先创建一个角色 R1
CREATE ROLE R1;
2. 然后使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限
GRANT SELECT,UPDATE,INSERT
ON TABLE Student
TO R1;
3. 将这个角色授予王平,张明,赵玲。使他们具有角色R1 所包含的全部权限
GRANT R1
TO 王平,张明,赵玲;
4. 可以一次性通过R1 来回收王平的这3 个权限
REVOKE R1
FROM 王平;
[ 例12] 角色的权限修改
GRANT DELETE
ON TABLE Student
TO R1
[ 例13]
REVOKE SELECT
ON TABLE Student
FROM R1 ;
2、强制存取控制方法
自主存取控制缺点
可能存在数据的“无意泄露”
原因:这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记
解决:对系统控制下的所有主客体实施强制存取控制策略
- 10 -
强制存取控制(MAC)
保证更高程度的安全性
用户能不能直接感知或进行控制
适用于对数据有严格而固定密级分类的部门
军事部门
政府部门
主体 是系统中的活动实体
DBMS 所管理的实际用户
代表用户的各进程
客体 是系统中的被动实体,是受主体操纵的
文件
基表
索引
视图
敏感度标记(Label)
绝密(Top Secret)
机密(Secret)
可信(Confidential)
公开(Public)
主体的敏感度标记称为许可证级别(Clearance Level)
客体的敏感度标记称为密级(Classification Level)
强制存取控制规则
(1) 仅当主体的许可证级别大于或等于 客体的密级时,该主体才能读 取相应的客体
(2) 仅当主体的许可证级别等于 客体的密级时,该主体才能写 相应的客体
修正规则
主体的许可证级别 <= 客体的密级 主体能写客体
规则的共同点
- 11 - 禁止了拥有高许可证级别的主体更新低密级的数据对象
MAC与DAC
DAC与MAC共同构成DBMS的安全机制
实现MAC时要首先实现DAC
原因:较高安全性级别提供的安全保护要包含较低级别的所有保护
DAC + MAC 安全检查示意图
SQL 语法分析 & 语义检查
DAC 检 查
安全检查
MAC 检 查
继 续
先进行DAC检查,通过DAC检查的数据对象再由系统进行MAC检查,只有通过MAC检查的数据对象方可存取。
6.2.3 视图机制
把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护
主要功能是提供数据独立性,无法完全满足要求
间接实现了支持存取谓词的用户权限定义
[例14]建立计算机系学生的视图,把对该视图的SELECT权限授于王平,把该视图上的所有操作权限授于张明
先建立计算机系学生的视图CS_Student
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept='CS';
在视图上进一步定义存取权限
- 12 - GRANT SELECT
ON CS_Student
TO 王平 ;
GRANT ALL PRIVILIGES
ON CS_Student
TO 张明;
6.2.4 数据加密
数据加密
防止数据库中数据在存储和传输中失密的有效手段
加密的基本思想
加密方法
替换方法
置换方法
混合方法
DBMS中的数据加密
6.2.5 跟踪审计
什么是审计
审计日志(Audit Log )
将用户对数据库的所有操作记录在上面
DBA 利用审计日志
找出非法存取数据的人、时间和内容
C2 以上安全级别的DBMS 必须具有
审计分为
用户级审计
针对自己创建的数据库表或视图进行审计
记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的- 13 - SQL操作
系统级审计
DBA设置
监测成功或失败的登录要求
监测GRANT和REVOKE操作以及其他数据库级权限下的操作
AUDIT 语句: 设置审计功能
NOAUDIT 语句:取消审计功能
[例15]对修改SC表结构或修改SC表数据的操作进行审计
AUDIT ALTER,UPDATE
ON SC;
[例16]取消对SC表的一切审计
NOAUDIT ALTER,UPDATE
ON SC;
6.2.6 统计数据库安全性
统计数据库
允许用户查询聚集类型的信息(如合计、平均值等)
不允许查询单个记录信息
统计数据库中特殊的安全性问题
隐蔽的信息通道
能从合法的查询中推导出不合法的信息
规则1:任何查询至少要涉及N(N足够大)个以上的记录
规则2:任意两个查询的相交数据项不能超过M个
规则3:任一用户的查询次数不能超过1+(N-2)/M
数据库安全机制的设计目标:
试图破坏安全的人所花费的代价 >> 得到的利益
- 14 - 6.3 数据库的完整性约束
6.3.1 实体完整性
6.3.1.1 实体完整性定义
关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
单属性构成的码有两种说明方法
定义为列级约束条件
定义为表级约束条件
对多个属性构成的码只有一种说明方法
定义为表级约束条件
[例1] 将Student表中的Sno属性定义为码
(1)在列级定义主码
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20));
(2)在表级定义主码
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
- 15 - [例2]将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno) /*只能在表级定义主码*/
);
6.3.1.2 实体完整性检查和违约处理
插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:
1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改
2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
检查记录中主码值是否唯一的一种方法是进行全表扫描
索引
- 16 -
6.3.2 参照完整性
6.3.2.1 参照完整性定义
关系模型的参照完整性定义
在CREATE TABLE 中用FOREIGN KEY 短语定义哪些列为外码
用REFERENCES 短语指明这些外码参照哪些表的主码
例如,关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno,Cno分别参照引用Student表的主码和Course表的主码
[例3] 定义SC中的参照完整性
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/*在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*在表级定义参照完整性*/
- 17 - );
6.3.2.2 参照完整性检查和违约处理
可能破坏参照完整性的情况及违约处理
被参照表(例如Student) 参照表(例如SC)
可能破坏参照完整性
可能破坏参照完整性
删除元组
修改主码值
参照完整性违约处理
1. 拒绝(NO ACTION)执行
默认策略
2. 级联(CASCADE)操作
3. 设置为空值(SET-NULL)
对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
[例4] 显式说明参照完整性的违约处理示例
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
插入元组
修改外码值
违约处理
拒绝
拒绝
可能破坏参照完整性 拒绝/级连删除/设置为空值
可能破坏参照完整性 拒绝/级连修改/设置为空值
FOREIGN KEY (Sno) REFERENCES Student(Sno)
ON DELETE CASCADE /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
- 18 - ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/
);
6.3.3 用户定义的完整性
用户定义的完整性就是针对某一具体应用 的数据必须满足的语义要求 RDBMS 提供,而不必由应用程序承担
6.3.3.1 属性上的约束条件的定义
CREATE TABLE 时定义
列值非空(NOT NULL )
列值唯一(UNIQUE )
检查列值是否满足一个布尔表达式(CHECK )
1.不允许取空值
[例5] 在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT NOT NULL,
PRIMARY KEY (Sno, Cno),
/* 如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在列级不允许取空值的定义就不必写了 * /
);
2.列值唯一
[例6] 建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码
CREATE TABLE DEPT
(Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE,/*要求Dname列值唯一*/
Location CHAR(10),
PRIMARY KEY (Deptno)
- 19 -
);
3. 用CHECK短语指定列值应该满足的条件
[例7] Student表的Ssex只允许取“男”或“女”。
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK (Ssex IN („男‟,„女‟) ) ,
/*性别属性Ssex只允许取'男'或'女' */
Sage SMALLINT,
Sdept CHAR(20)
);
6.3.3 用户定义的完整性
6.3.3.1 属性上的约束条件的定义
6.3.3.2 属性上的约束条件检查和违约处理
插入元组或修改属性的值时,RDBMS 检查属性上的约束条件是否被满足, 如果不满足则操作被拒绝执行
6.3.3.3 元组上的约束条件的定义
在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制
同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件
[例9] 当学生的性别是男时,其名字不能以Ms.打头。
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno),
- 20 - CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
/*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/
);
性别是女性的元组都能通过该项检查,因为Ssex=„女‟成立;
当性别是男性时,要通过检查则名字一定不能以Ms.打头
6.3.3.4 元组上的约束条件检查和违约处理
插入元组或修改属性的值时,RDBMS检查元组上的约束条件是否被满足
如果不满足则操作被拒绝执行
6.3.4 完整性约束命名子句
1、CONSTRAINT 约束
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
[例10] 建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
CREATE TABLE Student
(Sno NUMERIC(6)
CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname CHAR(20)
CONSTRAINT C2 NOT NULL,
Sage NUMERIC(3)
CONSTRAINT C3 CHECK (Sage < 30),
Ssex CHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ( '男','女')),
CONSTRAINT StudentKey PRIMARY KEY(Sno)
);
- 21 - 在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束。
2. 修改表中的完整性限制
使用ALTER TABLE语句修改表中的完整性限制
[例13] 修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40
可以先删除原来的约束条件,再增加新的约束条件
ALTER TABLE Student
DROP CONSTRAINT C1;
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999),
ALTER TABLE Student
DROP CONSTRAINT C3;
ALTER TABLE Student
ADD CONSTRAINT C3 CHECK (Sage < 40);
6.3.5 域中的完整性限制
SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件。
[例14]建立一个性别域,并声明性别域的取值范围
CREATE DOMAIN GenderDomain CHAR(2)
CHECK (VALUE IN ('男','女') );
这样[例10]中对Ssex的说明可以改写为
Ssex GenderDomain
[例15]建立一个性别域GenderDomain,并对其中的限制命名
CREATE DOMAIN GenderDomain CHAR(2)
CONSTRAINT GD CHECK ( VALUE IN ('男','女') );
[例16]删除域GenderDomain的限制条件GD。
ALTER DOMAIN GenderDomain
- 22 - DROP CONSTRAINT GD;
[例17]在域GenderDomain上增加限制条件GDD。
ALTER DOMAIN GenderDomain
ADD CONSTRAINT GDD CHECK (VALUE IN ( '1','0') );
通过[例16]和[例17],就把性别的取值范围由('男','女')改为 ( '1','0')
6.4 触发器
触发器(Trigger )是用户定义在关系表上的一类由事件驱动 的特殊过程
由服务器自动激活
可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力
6.4.1 定义触发器
CREATE TRIGGER语法格式
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>
定义触发器的语法说明:
1. 创建者:表的拥有者
2. 触发器名
3. 表名:触发器的目标表
4. 触发事件:INSERT 、DELETE 、UPDATE
5. 触发器类型
行级触发器(FOR EACH ROW)
语句级触发器(FOR EACH STATEMENT)
例如,假设在[例11]的TEACHER表上创建了一个AFTER UPDATE触发器。如果表TEACHER- 23 - 有1000行,执行如下语句:
UPDATE TEACHER SET Deptno=5;
如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次
如果是行级触发器,触发动作将执行1000次
6. 触发条件
触发条件为真
省略WHEN触发条件
7. 触发动作体
触发动作体可以是一个匿名PL/SQL过程块
也可以是对已创建存储过程的调用
[例18] 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
/*触发事件是插入或更新操作*/
FOR EACH ROW /*行级触发器*/
AS BEGIN /*定义触发动作体,是PL/SQL过程块*/
IF (='教授') AND ( < 4000) THEN
:=4000;
END IF;
END;
[例19]定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录
首先建立工资变化表Sal_log
- 24 - CREATE TABLE Sal_log
(Eno NUMERIC(4) references teacher(eno),
Sal NUMERIC(7,2),
Username char(10),
Date TIMESTAMP
);
CREATE TRIGGER Insert_Sal
AFTER INSERT ON Teacher /*触发事件是INSERT*/
FOR EACH ROW
AS BEGIN
INSERT INTO Sal_log VALUES(
,,CURRENT_USER,CURRENT_TIMESTAMP);
END;
CREATE TRIGGER Update_Sal
AFTER UPDATE ON Teacher
FOR EACH ROW
AS BEGIN
IF ( <> ) THEN INSERT INTO Sal_log VALUES(
,,CURRENT_USER,CURRENT_TIMESTAMP);
END IF;
END;
/*触发事件是UPDATE */
6.4.2 激活触发器
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行一个数据表上可能定义了多个触发器
同一个表上的多个触发器激活时遵循如下的执行顺序:
(1 ) 执行该表上的BEFORE 触发器;
(2 ) 激活触发器的SQL 语句;
(3 ) 执行该表上的AFTER 触发器。
[例20]执行修改某个教师工资的SQL语句,激活上述定义的触发器。
- 25 - UPDATE Teacher SET Sal=800 WHERE Ename='陈平';
执行顺序是:
执行触发器Insert_Or_Update_Sal
执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename='陈平';”
执行触发器Insert_Sal;
执行触发器Update_Sal
6.4.3 删除触发器
删除触发器的SQL语法:
DROP TRIGGER <触发器名> ON <表名>;
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。
[例21] 删除教师表Teacher上的触发器Insert_Sal
DROP TRIGGER Insert_Sal ON Teacher;
6.7 小结
数据的共享日益加强,数据的安全保密越来越重要
DBMS是管理数据的核心,因而其自身必须具有一整套完整而有效的安全性机制
TCSEC和CC
实现数据库系统安全性的技术和方法
存取控制技术
视图技术
审计技术
自主存取控制功能
通过SQL 的GRANT语句和REVOKE语句实现
角色
使用角色来管理数据库权限可以简化授权过程
CREATE ROLE语句创建角色
GRANT 语句给角色授权
- 26 - 完整性
数据库的完整性是为了保证数据库中存储的数据是正确的
RDBMS 完整性实现的机制
完整性约束定义机制
完整性检查机制
违背完整性约束条件时RDBMS 应采取的动作
作业:6.2,6.7,6.8,6.9
- 27 -
2023年8月1日发(作者:)
数据库原理 课程教案
授课题目(教学章、节或主题):
第六章 数据库安全和完整性:包括计算机安全性概述,数据库安全性控制,视图机制,审计,数据加密,统计数据库安全性;数据库的完整性约束,SQL的完整性控制,包括域完整性、实体完整性和参照完整性。
教学目的、要求(分掌握、熟悉、了解三个层次):
了解:数据库安全性的基本概念。
计算机系统安全性的基本概念。
数据库的完整性的基本概念。
理解:统计数据库安全性
Oracle数据库的安全性措施
数据库的完整性约束条件
掌握:掌握什么是数据库的安全性问题,牢固掌握数据库管理系统实现数据库安全性控制的常用方法和技术。
什么是数据库的完整性
用SQL语言定义关系模式的完整性约束条件。
重点:使用SQL中的GRANT 语句和 REVOKE 语句来实现数据库的实现自主存取控制功能。使用SQL中CREATE ROLE语句创建角色,用GRANT 语句给角色授权。掌握视图机制在数据库安全保护中的作用。
牢固掌握DBMS完整性控制机制的三个方面,即完整性约束条件的定义、完整性约束条件的检查和违约反应。需要举一反三的:用SQL语言定义关系模式的完整性约束条件。包括定义每个模式的主码;定义参照完整性;定义与应用有关的完整性。
难点:强制存取控制(MAC)机制中确定主体能否存取客体的存取规则,同学们要理解并掌握存取规则为什么要这样规定。
RDBMS如何实现完整性的策略,即当操作违反实体完整性、参照完整性和用户定义的完整性约束条件时,RDBMS如何进行处理,以确保数据的正确与有效。其中比较复杂的是参照完整性的实现机制。
- 1 - 课时安排:6节
授课方式:理论课
教学基本内容:
以教师为中心的讲授、提问及论证等的教学方法,教学手段使用板书与多媒体相结合的手段。
第六章 数据库安全和完整性
6.1 概述
数据库的数据保护主要包括数据库的安全性和完整性保护机制。
问题的提出
数据库的一大特点是数据可以共享
数据共享必然带来数据库的安全性问题
数据库系统中的数据共享不能是无条件的共享
例: 军事秘密、国家机密、新产品实验数据、市场需求分析、市场营销策略、销售计划、
客户档案、医疗档案、银行储蓄数据
数据库安全性
的用户访问允许他存取的数据
数据库中数据的共享是在DBMS统一的严格的控制之下的共享,即只允许有合法使用权限
数据库系统的安全保护措施是否有效是数据库系统主要的性能指标之一
什么是数据库的安全性
数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏,从而确保数据库中数据的安全。
数据库完整性
数据库的完整性
数据的正确性和相容性
是数据库的一个重要特征,也是保证数据库中的数据切实有效、防止错误、实现商业规则的一种重要机制。
数据的完整性和安全性是两个不同概念
- 2 - 数据的完整性
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
防范对象:不合语义的、不正确的数据
数据的安全性
保护数据库防止恶意的破坏和非法的存取
防范对象:非法用户和非法操作
为维护数据库的完整性,DBMS必须:
1.提供定义完整性约束条件的机制
2.提供完整性检查的方法
3.违约处理
6.2 数据库的安全性
非法使用数据库的情况
编写合法程序绕过DBMS 及其授权机制
直接或编写应用程序执行非授权操作
通过多次合法查询数据库从中推导出一些保密数据
计算机系统中,安全措施是一级一级层层设置
计算机系统的安全模型
数据库安全性控制的常用方法
用户标识和鉴定
存取控制
视图
审计
密码存储
- 3 - 6.2.1 用户标识与鉴别
用户标识与鉴别
(Identification & Authentication )
系统提供的最外层安全保护措施
用户标识
口令
系统核对口令以鉴别用户身份
用户名和口令易被窃取
每个用户预先约定好一个计算过程或者函数
6.2.2 存取控制
存取控制机制组成
定义用户权限
合法权限检查
用户权限定义和合法权检查机制一起组成了 DBMS 的安全子系统
常用存取控制方法
自主存取控制 (Discretionary Access Control , 简称DAC )
C2 级
灵活
强制存取控制 (Mandatory Access Control , 简称 MAC )
B1 级
严格
1、自主存取控制方法
通过 SQL 的 GRANT 语句和 REVOKE 语句实现
用户权限组成
数据对象
操作类型
定义用户存取权限:定义用户可以在哪些数据库对象上进行哪些类型的操作
- 4 - 定义存取权限称为授权
关系数据库系统中存取控制对象
对象类对象
型
数据库 模式
基本表
模式
数据
视图
索引
操 作 类 型
CREATE SCHEMA
CREATE TABLE,ALTER TABLE
CREATE VIEW
CREATE INDEX
数据
基本表和视SELECT,INSERT,UPDATE,DELETE,图
REFERENCES,
ALL PRIVILEGES
属性列 SELECT,INSERT,UPDATE, REFERENCES
ALL PRIVILEGES
授权与回收
一、GRANT
GRANT语句的一般格式:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
语义:将对指定操作对象的指定操作权限授予指定的用户
发出GRANT:
DBA
数据库对象创建者(即属主Owner)
拥有该权限的用户
按受权限的用户
一个或多个具体用户
PUBLIC(全体用户)
WITH GRANT OPTION 子句
WITH GRANT OPTION子句:
- 5 -
指定:可以再授予
没有指定:不能传播
不允许循环授权
例题
[例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;
[ 例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;
传播权限
- 6 - 执行例5后,U5不仅拥有了对表SC的INSERT权限,
还可以传播此权限:
[例6] GRANT INSERT ON TABLE SC TO U6
WITH GRANT OPTION;
同样,U6还可以将此权限授予U7:
[例7] GRANT INSERT ON TABLE SC TO U7;
但U7不能再传播此权限。
下表是执行了[例1]到[例7]的语句后,学生-课程数据库中的用户权限定义表
授权用户名
DBA
DBA
DBA
DBA
DBA
DBA
DBA
DBA
DBA
U5
U6
被授权用户名 数据库对象名
U1
U2
U2
U3
U3
PUBLIC
U4
U4
U5
U6
U7
关系Student
关系Student
关系Course
关系Student
关系Course
关系SC
关系Student
属性
关系SC
关系SC
关系SC
允许的操作类型 能否转授权
SELECT
ALL
ALL
ALL
ALL
SELECT
SELECT
TE
列UPDAINSERT
INSERT
INSERT
不能
不能
不能
不能
不能
不能
不能
不能
能
能
不能
二、REVOKE
授予的权限可以由DBA 或其他授权者用REVOKE 语句收回
REVOKE 语句的一般格式为:
REVOKE < 权限>[,< 权限>]...
[ON < 对象类型> < 对象名>]
FROM < 用户>[,< 用户>]...;
[ 例8] 把用户U4 修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
- 7 - [ 例9] 收回所有用户对表SC 的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
[ 例10] 把用户U5 对SC 表的INSERT 权限收回
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE ;
将用户U5的INSERT权限收回的时候必须级联(CASCADE)收回
系统只收回直接或间接从U5处获得的权限
执行[例8]到[例10]的语句后,学生-课程数据库中的用户权限定义表
授权用户名
DBA
DBA
DBA
DBA
DBA
DBA
被授权用户名 数据库对象名 允许的操作类型 能否转授权
U1
U2
U2
U3
U3
U4
关系Student
关系Student
关系Course
关系Student
关系Course
关系Student
SELECT
ALL
ALL
ALL
ALL
SELECT
不能
不能
不能
不能
不能
不能
小结:SQL灵活的授权机制
DBA:拥有所有对象的所有权限
不同的权限授予不同的用户
用户:拥有自己建立的对象的全部的操作权限
GRANT:授予其他用户
被授权的用户
“继续授权”许可:再授予
所有授予出去的权力在必要时又都可用REVOKE语句收回
三、创建数据库模式的权限
DBA在创建用户时实现
- 8 - CREATE USER语句格式
CREATE USER
[WITH][DBA | RESOURCE | CONNECT]
拥有的权限
可否执行的操作
CREATE
USER
DBA
可以
RESOURCE
不可以
CONNECT
不可以
CREATE
SCHEMA
可以
不可以
不可以
CREATE
TABLE
可以
不可以
不可以
登录数据库 执行数据查询和操纵
可以
不可以
可以,但必须拥有相应权限
数据库角色
数据库角色:被命名的一组与数据库操作相关的权限
角色是权限的集合
可以为一组具有相同权限的用户创建一个角色
简化授权的过程
一、角色的创建
CREATE ROLE <角色名>
二、给角色授权
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…
三、将一个角色授予其他的角色或用户
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION]
四、角色权限的收回
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
- 9 - FROM <角色>[,<角色>]…
[例11] 通过角色来实现将一组权限授予一个用户。
步骤如下:
1. 首先创建一个角色 R1
CREATE ROLE R1;
2. 然后使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限
GRANT SELECT,UPDATE,INSERT
ON TABLE Student
TO R1;
3. 将这个角色授予王平,张明,赵玲。使他们具有角色R1 所包含的全部权限
GRANT R1
TO 王平,张明,赵玲;
4. 可以一次性通过R1 来回收王平的这3 个权限
REVOKE R1
FROM 王平;
[ 例12] 角色的权限修改
GRANT DELETE
ON TABLE Student
TO R1
[ 例13]
REVOKE SELECT
ON TABLE Student
FROM R1 ;
2、强制存取控制方法
自主存取控制缺点
可能存在数据的“无意泄露”
原因:这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记
解决:对系统控制下的所有主客体实施强制存取控制策略
- 10 -
强制存取控制(MAC)
保证更高程度的安全性
用户能不能直接感知或进行控制
适用于对数据有严格而固定密级分类的部门
军事部门
政府部门
主体 是系统中的活动实体
DBMS 所管理的实际用户
代表用户的各进程
客体 是系统中的被动实体,是受主体操纵的
文件
基表
索引
视图
敏感度标记(Label)
绝密(Top Secret)
机密(Secret)
可信(Confidential)
公开(Public)
主体的敏感度标记称为许可证级别(Clearance Level)
客体的敏感度标记称为密级(Classification Level)
强制存取控制规则
(1) 仅当主体的许可证级别大于或等于 客体的密级时,该主体才能读 取相应的客体
(2) 仅当主体的许可证级别等于 客体的密级时,该主体才能写 相应的客体
修正规则
主体的许可证级别 <= 客体的密级 主体能写客体
规则的共同点
- 11 - 禁止了拥有高许可证级别的主体更新低密级的数据对象
MAC与DAC
DAC与MAC共同构成DBMS的安全机制
实现MAC时要首先实现DAC
原因:较高安全性级别提供的安全保护要包含较低级别的所有保护
DAC + MAC 安全检查示意图
SQL 语法分析 & 语义检查
DAC 检 查
安全检查
MAC 检 查
继 续
先进行DAC检查,通过DAC检查的数据对象再由系统进行MAC检查,只有通过MAC检查的数据对象方可存取。
6.2.3 视图机制
把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护
主要功能是提供数据独立性,无法完全满足要求
间接实现了支持存取谓词的用户权限定义
[例14]建立计算机系学生的视图,把对该视图的SELECT权限授于王平,把该视图上的所有操作权限授于张明
先建立计算机系学生的视图CS_Student
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept='CS';
在视图上进一步定义存取权限
- 12 - GRANT SELECT
ON CS_Student
TO 王平 ;
GRANT ALL PRIVILIGES
ON CS_Student
TO 张明;
6.2.4 数据加密
数据加密
防止数据库中数据在存储和传输中失密的有效手段
加密的基本思想
加密方法
替换方法
置换方法
混合方法
DBMS中的数据加密
6.2.5 跟踪审计
什么是审计
审计日志(Audit Log )
将用户对数据库的所有操作记录在上面
DBA 利用审计日志
找出非法存取数据的人、时间和内容
C2 以上安全级别的DBMS 必须具有
审计分为
用户级审计
针对自己创建的数据库表或视图进行审计
记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的- 13 - SQL操作
系统级审计
DBA设置
监测成功或失败的登录要求
监测GRANT和REVOKE操作以及其他数据库级权限下的操作
AUDIT 语句: 设置审计功能
NOAUDIT 语句:取消审计功能
[例15]对修改SC表结构或修改SC表数据的操作进行审计
AUDIT ALTER,UPDATE
ON SC;
[例16]取消对SC表的一切审计
NOAUDIT ALTER,UPDATE
ON SC;
6.2.6 统计数据库安全性
统计数据库
允许用户查询聚集类型的信息(如合计、平均值等)
不允许查询单个记录信息
统计数据库中特殊的安全性问题
隐蔽的信息通道
能从合法的查询中推导出不合法的信息
规则1:任何查询至少要涉及N(N足够大)个以上的记录
规则2:任意两个查询的相交数据项不能超过M个
规则3:任一用户的查询次数不能超过1+(N-2)/M
数据库安全机制的设计目标:
试图破坏安全的人所花费的代价 >> 得到的利益
- 14 - 6.3 数据库的完整性约束
6.3.1 实体完整性
6.3.1.1 实体完整性定义
关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
单属性构成的码有两种说明方法
定义为列级约束条件
定义为表级约束条件
对多个属性构成的码只有一种说明方法
定义为表级约束条件
[例1] 将Student表中的Sno属性定义为码
(1)在列级定义主码
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20));
(2)在表级定义主码
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
- 15 - [例2]将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno) /*只能在表级定义主码*/
);
6.3.1.2 实体完整性检查和违约处理
插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:
1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改
2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
检查记录中主码值是否唯一的一种方法是进行全表扫描
索引
- 16 -
6.3.2 参照完整性
6.3.2.1 参照完整性定义
关系模型的参照完整性定义
在CREATE TABLE 中用FOREIGN KEY 短语定义哪些列为外码
用REFERENCES 短语指明这些外码参照哪些表的主码
例如,关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno,Cno分别参照引用Student表的主码和Course表的主码
[例3] 定义SC中的参照完整性
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/*在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*在表级定义参照完整性*/
- 17 - );
6.3.2.2 参照完整性检查和违约处理
可能破坏参照完整性的情况及违约处理
被参照表(例如Student) 参照表(例如SC)
可能破坏参照完整性
可能破坏参照完整性
删除元组
修改主码值
参照完整性违约处理
1. 拒绝(NO ACTION)执行
默认策略
2. 级联(CASCADE)操作
3. 设置为空值(SET-NULL)
对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
[例4] 显式说明参照完整性的违约处理示例
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
插入元组
修改外码值
违约处理
拒绝
拒绝
可能破坏参照完整性 拒绝/级连删除/设置为空值
可能破坏参照完整性 拒绝/级连修改/设置为空值
FOREIGN KEY (Sno) REFERENCES Student(Sno)
ON DELETE CASCADE /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
- 18 - ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/
);
6.3.3 用户定义的完整性
用户定义的完整性就是针对某一具体应用 的数据必须满足的语义要求 RDBMS 提供,而不必由应用程序承担
6.3.3.1 属性上的约束条件的定义
CREATE TABLE 时定义
列值非空(NOT NULL )
列值唯一(UNIQUE )
检查列值是否满足一个布尔表达式(CHECK )
1.不允许取空值
[例5] 在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT NOT NULL,
PRIMARY KEY (Sno, Cno),
/* 如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在列级不允许取空值的定义就不必写了 * /
);
2.列值唯一
[例6] 建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码
CREATE TABLE DEPT
(Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE,/*要求Dname列值唯一*/
Location CHAR(10),
PRIMARY KEY (Deptno)
- 19 -
);
3. 用CHECK短语指定列值应该满足的条件
[例7] Student表的Ssex只允许取“男”或“女”。
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK (Ssex IN („男‟,„女‟) ) ,
/*性别属性Ssex只允许取'男'或'女' */
Sage SMALLINT,
Sdept CHAR(20)
);
6.3.3 用户定义的完整性
6.3.3.1 属性上的约束条件的定义
6.3.3.2 属性上的约束条件检查和违约处理
插入元组或修改属性的值时,RDBMS 检查属性上的约束条件是否被满足, 如果不满足则操作被拒绝执行
6.3.3.3 元组上的约束条件的定义
在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制
同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件
[例9] 当学生的性别是男时,其名字不能以Ms.打头。
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno),
- 20 - CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
/*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/
);
性别是女性的元组都能通过该项检查,因为Ssex=„女‟成立;
当性别是男性时,要通过检查则名字一定不能以Ms.打头
6.3.3.4 元组上的约束条件检查和违约处理
插入元组或修改属性的值时,RDBMS检查元组上的约束条件是否被满足
如果不满足则操作被拒绝执行
6.3.4 完整性约束命名子句
1、CONSTRAINT 约束
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
[例10] 建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
CREATE TABLE Student
(Sno NUMERIC(6)
CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname CHAR(20)
CONSTRAINT C2 NOT NULL,
Sage NUMERIC(3)
CONSTRAINT C3 CHECK (Sage < 30),
Ssex CHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ( '男','女')),
CONSTRAINT StudentKey PRIMARY KEY(Sno)
);
- 21 - 在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束。
2. 修改表中的完整性限制
使用ALTER TABLE语句修改表中的完整性限制
[例13] 修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40
可以先删除原来的约束条件,再增加新的约束条件
ALTER TABLE Student
DROP CONSTRAINT C1;
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999),
ALTER TABLE Student
DROP CONSTRAINT C3;
ALTER TABLE Student
ADD CONSTRAINT C3 CHECK (Sage < 40);
6.3.5 域中的完整性限制
SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件。
[例14]建立一个性别域,并声明性别域的取值范围
CREATE DOMAIN GenderDomain CHAR(2)
CHECK (VALUE IN ('男','女') );
这样[例10]中对Ssex的说明可以改写为
Ssex GenderDomain
[例15]建立一个性别域GenderDomain,并对其中的限制命名
CREATE DOMAIN GenderDomain CHAR(2)
CONSTRAINT GD CHECK ( VALUE IN ('男','女') );
[例16]删除域GenderDomain的限制条件GD。
ALTER DOMAIN GenderDomain
- 22 - DROP CONSTRAINT GD;
[例17]在域GenderDomain上增加限制条件GDD。
ALTER DOMAIN GenderDomain
ADD CONSTRAINT GDD CHECK (VALUE IN ( '1','0') );
通过[例16]和[例17],就把性别的取值范围由('男','女')改为 ( '1','0')
6.4 触发器
触发器(Trigger )是用户定义在关系表上的一类由事件驱动 的特殊过程
由服务器自动激活
可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力
6.4.1 定义触发器
CREATE TRIGGER语法格式
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>
定义触发器的语法说明:
1. 创建者:表的拥有者
2. 触发器名
3. 表名:触发器的目标表
4. 触发事件:INSERT 、DELETE 、UPDATE
5. 触发器类型
行级触发器(FOR EACH ROW)
语句级触发器(FOR EACH STATEMENT)
例如,假设在[例11]的TEACHER表上创建了一个AFTER UPDATE触发器。如果表TEACHER- 23 - 有1000行,执行如下语句:
UPDATE TEACHER SET Deptno=5;
如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次
如果是行级触发器,触发动作将执行1000次
6. 触发条件
触发条件为真
省略WHEN触发条件
7. 触发动作体
触发动作体可以是一个匿名PL/SQL过程块
也可以是对已创建存储过程的调用
[例18] 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
/*触发事件是插入或更新操作*/
FOR EACH ROW /*行级触发器*/
AS BEGIN /*定义触发动作体,是PL/SQL过程块*/
IF (='教授') AND ( < 4000) THEN
:=4000;
END IF;
END;
[例19]定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录
首先建立工资变化表Sal_log
- 24 - CREATE TABLE Sal_log
(Eno NUMERIC(4) references teacher(eno),
Sal NUMERIC(7,2),
Username char(10),
Date TIMESTAMP
);
CREATE TRIGGER Insert_Sal
AFTER INSERT ON Teacher /*触发事件是INSERT*/
FOR EACH ROW
AS BEGIN
INSERT INTO Sal_log VALUES(
,,CURRENT_USER,CURRENT_TIMESTAMP);
END;
CREATE TRIGGER Update_Sal
AFTER UPDATE ON Teacher
FOR EACH ROW
AS BEGIN
IF ( <> ) THEN INSERT INTO Sal_log VALUES(
,,CURRENT_USER,CURRENT_TIMESTAMP);
END IF;
END;
/*触发事件是UPDATE */
6.4.2 激活触发器
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行一个数据表上可能定义了多个触发器
同一个表上的多个触发器激活时遵循如下的执行顺序:
(1 ) 执行该表上的BEFORE 触发器;
(2 ) 激活触发器的SQL 语句;
(3 ) 执行该表上的AFTER 触发器。
[例20]执行修改某个教师工资的SQL语句,激活上述定义的触发器。
- 25 - UPDATE Teacher SET Sal=800 WHERE Ename='陈平';
执行顺序是:
执行触发器Insert_Or_Update_Sal
执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename='陈平';”
执行触发器Insert_Sal;
执行触发器Update_Sal
6.4.3 删除触发器
删除触发器的SQL语法:
DROP TRIGGER <触发器名> ON <表名>;
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。
[例21] 删除教师表Teacher上的触发器Insert_Sal
DROP TRIGGER Insert_Sal ON Teacher;
6.7 小结
数据的共享日益加强,数据的安全保密越来越重要
DBMS是管理数据的核心,因而其自身必须具有一整套完整而有效的安全性机制
TCSEC和CC
实现数据库系统安全性的技术和方法
存取控制技术
视图技术
审计技术
自主存取控制功能
通过SQL 的GRANT语句和REVOKE语句实现
角色
使用角色来管理数据库权限可以简化授权过程
CREATE ROLE语句创建角色
GRANT 语句给角色授权
- 26 - 完整性
数据库的完整性是为了保证数据库中存储的数据是正确的
RDBMS 完整性实现的机制
完整性约束定义机制
完整性检查机制
违背完整性约束条件时RDBMS 应采取的动作
作业:6.2,6.7,6.8,6.9
- 27 -
发布评论