目录
一.数据库基本概念
1.两类模型
2数据模型组成要素
3数据库系统结构
二.关系数据库
1.三种类型(关系)
2.关系模式
3.关系操作
4.关系语言:结构化查询语言
5.关系完整性
6.关系代数
三.关系数据库语言SQL
1.1定义模式
1.2删除模式
2.1定义表
2.2修改基本表
2.3删除基本表
3. 索引的建立与删除
4.数据字典
5.数据查询(重点*)
5.1语句格式
5.2选择表中的若干元组
5.3 ORDER BY子句
5.4聚集函数
5.5 GROUP BY子句
5.6.连接查询
6.数据更新
7.空值处理
8.视图
四.数据库安全性
1. 计算机安全性概述
2. 数据库安全性控制
2.1常用的存取控制方法
2.2授权与回收
2.3创建数据库模式的权限
2.4数据库角色
2.5强制存取控制方法
2.6视图机制
2.7审计
2.8数据加密
五.数据库的完整性
数据库的完整性:
1.1数据库的完整性
1.2关系模型的实体完整性
1.3 参照完整性
1.4用户定义的完整性
1.5断言
1.6触发器
一.数据库基本概念
1.数据(Data):描述事物的符号记录 数据与其语义不可分
2.数据库(DB):长期存储在计算机内,有组织,可共享的大量数据集合
3.数据库管理系统(DBMS):计算机的基础软件
功能:
(1)定义
(2)组织,存储
(3)操纵(增,删,改,查)
(4)运行管理(安全性,完整性,并发控制,恢复)
(5)建立,维护
(6)其他
4.数据库系统(DBS)
| 数据库系统(DBS) | 数据库DB |
| 数据库管理系统DBMS | |
| 应用程序 | |
| 数据库管理员DBA |
1.数据模型 :对现实世界数据特征的抽象
1.两类模型
(1)概念模型----------》用户
(2)数据模型----------》机器
2数据模型组成要素
(1)数据结构:组成对象和对象之间联系
(2)数据操作:对对象型值允许操作和规则
(3)完整性约束条件
1.2.2概念模型(实体,属性,码,实体型,实体集,联系)
1.2.3数据模型(层次,网状,关系,面向对象,对象关系,半结构化)
层次模型(层次模型采用树形结构):(1)只有一个根节点 (2)根以外有且只有一个双亲结点
优点:简单,查询效率高; 缺点:多对多表示不自然,限制多
网状模型:————典型代表(DBTG系统)
特点:直接处理一对多
关系模型:操作对象和结果都是关系
3数据库系统结构
数据库系统三级模式和两级映象的系统结构保证了数据库系统中的数据能够具有较高的逻辑独立性与物理独立性。
1.三级模式
(1)模式(逻辑模式)
(2)外模式(子模式)
(3)内模式(存储模式)压缩加密————保证数据库安全性的一个有力措施 ,每个用户只能看见和访问所对应的外模式中的数据
一个数据库只有一个内模式
2.二级映像
(1)外模式/模式——逻辑独立性
(2)模式/内模式——物理独立性
二.关系数据库
1.三种类型(关系)
(1)基本表(实际存在)
(2)查询表
(3)视图表
2.关系模式
R(U, D, DOM, F)
R:关系名
U:属性集
D:来自的域
DOM:映像集合
F:数据属性间关系集合
3.关系操作
R(U, D, DOM, F)
R:关系名
U:属性集
D:来自的域
DOM:映像集合
F:数据属性间关系集合
查询,插入,删除,修改
查询(选择,投影,并,差,笛卡尔)
4.关系语言:结构化查询语言
5.关系完整性
(1)实体完整性(不能取空值(主码))
(2)参照完整性
(3)用户定义完整性
6.关系代数
1.(选择)查询信息系(is)所有学生:sdept='is'(Student)
2.(投影)查询学生姓名和所在系:sname,sdept(Student)
基本格式
———— (____(表表))
3.连接查询
关系代数运算 并、差、交、笛卡尔积、投影、选择、连接、除 (有“全部”字眼)
基本运算 并、差、笛卡尔积、投影、选择 交、连接、除
三.关系数据库语言SQL
数据定义
1.1定义模式
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
1.2删除模式
DROp SCHEMA <模式名>
DROp SCHEMA <模式名>
CASCADE(级联) 删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制) 如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
2.1定义表
建立“学生”表Student,学号是主码,姓名取值唯一
CREATE TABLE Student
(Sno CHAr(9) PRIMARY KEY,
Sname CHAr(20) UNIQUE,
Ssex CHAr(2),
Sage SMALLINT,
Sdept CHAr(20) );
PRIMARY KEY 主码 UNIQUE 约束,取唯一值
2.2修改基本表
ALTER TABLE <表名>
[ ADD [COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ];
2.2修改基本表
ALTER TABLE <表名>
[ ADD [COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ];
[例】向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD S_entrance DATE;
2.3删除基本表
DROP TABLE <表名> [CASCADE|RESTRICT];
若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可以删除表,视图也自动删除。
3. 索引的建立与删除
建立索引的目的:加快查询速度
B+树索引 散列(HASH)索引
3.1建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
3.2删除索引
DROP INDEX <索引名>;
3.3修改索引
ALTER INDEX<旧名>RENAME TO<新索引名>
4.数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有定义信息: 关系模式定义, 视图定义 ,索引定义 ,完整性约束定义 ,各类用户对数据库的操作权限 ,统计信息等
5.数据查询(重点*)
5.1语句格式
SELECT [ALL|DISTINCT] <目标>
FROM <表名或视图名>[, <表名或视图名> ]
[ WHERe <条件> ]
[ GROUP BY <列名1> [ HAVINg <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT [ALL|DISTINCT] <目标> FROM <表名或视图名>[, <表名或视图名> ] [ WHERe <条件> ] [ GROUP BY <列名1> [ HAVINg <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ];
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组
HAVINg短语:只有满足指定条件的组才予以输出
ORDER BY子句:对查询结果表按指定列值的升序(ASC)或降序(DESC)排序
[例] 查询全体学生的详细记录
SELECt Sno,Sname,Ssex,Sage,Sdept FROM Student; 或 SELECt * FROM Student;
5.2选择表中的若干元组
(1)消除取值重复的行(DISTINCT)
[例] 查询考试成绩有不及格的学生的学号。 SELECt DISTINCT Sno FROM SC WHERe Grade<60;
(2)查询满足条件的元组
① 空值: IS NULL 或 IS NOT NULL
[例] 某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。 SELECt Sno, Cno FROM SC WHERe Grade IS NULL
多重条件 and or not 连接
②范围: (NOT) BETWEEN 20 AND 23 (20<=x<=30)
[例] 查询年龄不在20~23岁之间的学生姓名、系别和年龄 SELECt Sname, Sdept, Sage FROM Student WHERe Sage NOT BETWEEN 20 AND 23;
③确定集合:IN <值表>, NOT IN <值表>
[例]查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECt Sname, Ssex
FROM Student
WHERe Sdept IN ('IS','MA','CS');
④ 字符匹配
“%”(百分号)代表任意长度(长度可以为0)的字符串。 例如a%b 表示以a 开头,以b 结尾的任意长度的字符串
通配符“_”(下横线)代表任意单个字符。 例如a_b 表示以a 开头,以b 结尾的长度为3的任意字符串 如果字符串中包含通配符,使用ESCAPE ’’。
[例] 查询名字中第2个字为"阳"字的学生的姓名和学号。 SELECt Sname,Sno FROM Student WHERe Sname LIKE ‘_阳%’;
5.3 ORDER BY子句
升序:ASC; 降序:DESC;
[例] 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。 SELECt Sno,Grade FROM SC WHERe Cno= ' 3 ' ORDER BY Grade DESC;
5.4聚集函数
COUNT(属性名) 计算一列中值的个数
COUNT(*) 计算元组个数
SUM(属性名) 求某一属性值的总和(此列必须是数值型)
AVG(属性名) 求某一属性值的平均值(此列必须是数值型)
MAX(属性名) 求某一属性值的最大值
MIN(属性名) 求某一属性值的最小值
函数可用于SELECt、WHERe、HAVINg子句中
5.5 GROUP BY子句 ——————对查询结果进行分组
[例] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
查询结果:
Cno COUNT(Sno)
1 22
2 34
3 44
4 33
5 48
COUNT(属性名) 计算一列中值的个数
COUNT(*) 计算元组个数
SUM(属性名) 求某一属性值的总和(此列必须是数值型)
AVG(属性名) 求某一属性值的平均值(此列必须是数值型)
MAX(属性名) 求某一属性值的最大值
MIN(属性名) 求某一属性值的最小值
函数可用于SELECt、WHERe、HAVINg子句中
[例] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
查询结果:
Cno COUNT(Sno)
1 22
2 34
3 44
4 33
5 48
WHERe子句中是不能用聚集函数作为条件表达式,用HAVINg短句
[例] 查询平均成绩大于等于90分的学生学号和平均成绩 下面的语句是不对的:
SELECt SNO,AVG(Grade) FROM SC GROUP BY SNO 先分组 HAVINg AVG(Grade)>=90; 再筛选
5.6.连接查询(同时涉及多个表的查询)
1.等值连接:连接运算符为=
2.自身连接:一个表与其自己进行连接
[例35]查询每一门课的间接先修课(即先修课的先修课)
SELECt FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERe FIRST.Cpno = SECOND.Cno;
3.外连接
4.多表连接
[例]查询每个学生的学号、姓名、选修的课程名及成绩
SELECt Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERe Student.Sno = SC.Sno
and SC.Cno = Course.Cno;
5.嵌套查询
SELECt Sname
FROM Student
WHERe Sno IN
(SELECt Sno
FROM SC
WHERe Cno= ' 2 ');
5.1带有IN谓词的子查询
[例]查询选修了课程名为“信息系统”的学生学号和姓名 SELECt Sno,Sname ③ 最后在Student关系中 FROM Student 取出Sno和Sname WHERe Sno IN (SELECt Sno ② 然后在SC关系中找出选 FROM SC 修了3号课程的学生学号 WHERe Cno IN (SELECt Cno ① 首先在Course关系中找出 FROM Course “信息系统”的课程号,为3号 WHERe Cname= ‘信息系统’ ) );用连接查询实现例题选修了课程名为“信息系统”的学生学号和姓名 SELECt Student.Sno,Sname FROM Student,SC,Course WHERe Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Course.Cname=‘信息系统’;
5.2 带有比较运算符的子查询
[例]找出每个学生超过他选修课程平均成绩的课程号。(相关子查询)
SELECt Sno, Cno
FROM SC x
WHERe Grade >=
(SELECt AVG(Grade)
FROM SC y
WHERe y.Sno=x.Sno);
5.3 带有ANY(SOME)或ALL谓词的子查询
ANY:任意一个值 ALL:所有值
[例] 查询非计算机系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
方法一:用ALL谓词
SELECt Sname,Sage FROM Student WHERe Sage < ALL(SELECt Sage FROM Student WHERe Sdept= ' CS ') AND Sdept <> ' CS ’;
方法二:用聚集函数
SELECt Sname,Sage FROM Student WHERe Sage <(SELECt MIN(Sage) FROM Student WHERe Sdept= ' CS ') AND Sdept <>' CS ’;
5.4(难点)带有EXISTS谓词的子查询(代表的是存在量词),有“至少”,“全部”字影;
6.集合查询
集合操作的种类
并操作 UNIOn
交操作 INTERSECT
差操作 EXCEPT
小结:
SELECt语句的一般格式
SELECT [ALL|DISTINCT] <目标列表达式> [别名] [ ,<目标列表达式> [别名]] … FROM <表名或视图名> [别名] [ ,<表名或视图名> [别名]] … [WHERe <条件表达式>] [GROUP BY <列名1> [HAVINg <条件表达式>]] [ORDER BY <列名2> [ASC|DESC]
6.数据更新
6.1两种插入数据方式 插入元组 插入子查询
插入元组:
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
功能 将新元组插入指定表中
[例]将学生张成民的信息插入到Student表中。 INSERT INTO Student VALUES ('201215126','张成民','男’,18,'CS');
6.2修改(更新)数据
语句格式
UPDATe <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERe <条件>];
如果省略WHERe子句,表示要修改表中的所有元组
三种修改方式 :
修改某一个元组的值
[例] 将学生201215121的年龄改为22岁
UPDATE Student
SET Sage=22
WHERe Sno=' 201215121 ';
修改多个元组的值
[例] 将所有学生的年龄增加1岁。
UPDATE Student
SET Sage= Sage+1;
带子查询的修改语句
[例] 将计算机科学系全体学生的成绩置零。
UPDATE SC
SET Grade=0
WHERe Sno IN
(SELETE Sno
FROM Student
WHERe Sdept= 'CS' );
6.3删除数据
语句格式
DELETe
FROM <表名>
[WHERe <条件>];
功能: 删除指定表中满足WHERe子句条件的元组
WHERe子句 指定要删除的元组 缺省表示要删除表中的全部元组
三种删除方式 :
删除某一个元组的值
删除多个元组的值
带子查询的删除语句
7.空值处理
空值就是“不知道”或“不存在”或“无意义”的值
属性定义(或者域定义)中 有NOT NULL约束条件的不能取空值 ,加了UNIQUE限制的属性不能取空值 ,码属性不能取空值
[例 ] 选出选修1号课程的不及格的学生以及缺考的学生。
SELECt Sno FROM SC WHERe Grade < 60 AND Cno='1' UNIOn SELECt Sno FROM SC WHERe Grade IS NULL AND Cno='1' 或者 SELECt Sno FROM SC WHERe Cno='1' AND (Grade<60 OR Grade IS NULL);
8.视图(外模式)
视图的特点:
虚表,是从一个或几个基本表(或视图)导出的表
只存放视图的定义,不存放视图对应的数据
基表中的数据发生变化,从视图中查询出的数据也随之改变
8.1建立视图
语句格式
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
WITH CHECK OPTION 对视图进行UPDATe,INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则决定具体系统的实现。
[例] 建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)。
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERe Sdept= 'IS' AND
Student.Sno=SC.Sno AND
SC.Cno= '1';
8.2删除视图
语句的格式: DROp VIEW <视图名>[CASCADE];
8.3查询视图 用户角度:查询视图与查询基本表相同
8.4更新视图 允许对行列子集视图进行更新
8.5视图的作用:
①视图能够简化用户的操作
②视图能多种角度看待数据
③视图对重构数据库提供了一定程度的逻辑独立性 数据库重构 :
④视图能够对机密数据提供安全保护
⑤适当的利用视图可以更清晰的表达查询
小结:SQL可以分为数据定义、数据查询、数据更新、数据控制四大部分
四.数据库安全性
1. 计算机安全性概述
数据库的安全性:是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
保护计算机系统中的硬件、软件及数据
1.1不安全因素:
①恶意存取和破坏
②敏感数据被泄露
③安全环境脆弱性
1.2 TECT(桔皮书) TCSEC/TDI(紫皮书),从四个方面来描述安全性级别划分的指标
- 安全策略
- 责任
- 保证
- 文档
2. 数据库安全性控制
数据库安全性控制的常用方法
- 用户标识和鉴定
- 存取控制
- 视图
- 审计
- 密码存储
2.1常用的存取控制方法
自主存取控制(DAC) C2级 灵活
强制存取控制( MAC) B1级 严格
2.2授权与回收
自主存取控制(DAC) C2级 灵活
强制存取控制( MAC) B1级 严格
授权:GRANT
GRANT <权限>[,<权限>]... [ON <对象类型> <对象名>] TO <用户>[,<用户>]... [WITH GRANT OPTION]; 允不允许再授权
ALL PRIVILEGES 所有权限
PUBLIC 所有用户
[例] 把查询Student表和修改学生学号的权限授给所有用户,并允许他再将此权限授予其他用户
GRANT UPDATE(Sno), SELECT ON TABLE Student TO PUBLIC; WITH GRANT OPTION;
收回:REVOKE
REVOKE <权限>[,<权限>]... [ON <对象类型> <对象名>] FROM <用户>[,<用户>]...;
[例] 把用户U5对SC表的INSERT权限收回 REVOKE INSERT ON TABLE SC FROM U5 CASCADE ;
2.3创建数据库模式的权限
CREATE USER
WITH][DBA | RESOURCE | CONNECT]
新创建的数据库用户有三种权限:CONNECT、RESOURCE和DBA
2.4数据库角色:被命名的一组与数据库操作相关的权限
CREATE USERWITH][DBA | RESOURCE | CONNECT]
新创建的数据库用户有三种权限:CONNECT、RESOURCE和DBA
1.角色创建
CREATE ROLE <角色名>
2.给角色授权
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…
3.将一个角色授予其他的角色或用户
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
WITH ADMIN OPTION]
4.、角色权限的收回
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…
5.删除角色
Drop role R1;
2.5强制存取控制方法
强制存取控制(MAC):是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性。
主体是系统中的活动实体
客体是系统中的被动实体,是受主体操纵的 (文件 基本表 索引 视图)
2.6视图机制
建立计算机系学生的视图,把对该视图的SELECT权限授于王平,把该视图上的所有操作权限授于张明
先建立计算机系学生的视图CS_Student
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERe Sdept='CS';
在视图上进一步定义存取权限
GRANT SELECt
ON CS_Student
TO 王平 ;
GRANT ALL PRIVILEGES
ON CS_Student
TO 张明;
2.7审计
建立计算机系学生的视图,把对该视图的SELECT权限授于王平,把该视图上的所有操作权限授于张明
先建立计算机系学生的视图CS_Student
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERe Sdept='CS';
在视图上进一步定义存取权限
GRANT SELECt
ON CS_Student
TO 王平 ;
GRANT ALL PRIVILEGES
ON CS_Student
TO 张明;
审计日志(Audit Log) 将用户对数据库的所有操作记录在上面
审计分为 :用户级审计和系统级审计
AUDIT语句:设置审计功能 NOAUDIT语句:取消审计功能
2.8数据加密
数据加密是:将原始数据(明文)变换为不可直接识别的格式(密文)
加密方法: 存储加密 传输加密
2.9统计数据库
隐蔽信道 处理强制存取控制未解决的问题
统计数据库: 允许用户查询聚集类型的信息(如合计、平均值等)
不允许查询单个记录信息
小结:
实现数据库系统安全性的技术和方法
- 用户身份鉴别
- 存取控制技术:DAC & MAC.
- 视图技术
- 审计技术
- 数据加密存储和加密传输
自主存取控制功能
通过SQL 的GRANT语句和REVOKE语句实现
角色
- 使用角色来管理数据库权限可以简化授权过程
- CREATE ROLE语句创建角色
- GRANT 语句给角色授权
五.数据库的完整性
1.数据库的完整性:
1.1数据库的完整性 :指数据的正确性 和 数据的相容性,防止数据库中存在不符合语义,保护数据库 防止恶意的破坏和非法的存取
为维护数据库的完整性,数据库管理系统必须:
1.提供定义完整性约束条件的机制
2.提供完整性检查的方法(一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查)
3.违约处理(拒绝(NO ACTION)执行该操作 极连(CASCADE)执行其他操作)
1.2关系模型的实体完整性 CREATE TABLE中用PRIMARY KEY定义
[例] 将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC
( Sno CHAr(9) NOT NULL,
Cno CHAr(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno)
);
1.1数据库的完整性 :指数据的正确性 和 数据的相容性,防止数据库中存在不符合语义,保护数据库 防止恶意的破坏和非法的存取
为维护数据库的完整性,数据库管理系统必须:
1.提供定义完整性约束条件的机制
2.提供完整性检查的方法(一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查)
3.违约处理(拒绝(NO ACTION)执行该操作 极连(CASCADE)执行其他操作)
1.2关系模型的实体完整性 CREATE TABLE中用PRIMARY KEY定义
[例] 将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC
( Sno CHAr(9) NOT NULL,
Cno CHAr(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno)
);
为维护数据库的完整性,数据库管理系统必须:
1.提供定义完整性约束条件的机制
2.提供完整性检查的方法(一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查)
3.违约处理(拒绝(NO ACTION)执行该操作 极连(CASCADE)执行其他操作)
[例] 将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC
( Sno CHAr(9) NOT NULL,
Cno CHAr(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno)
);
实体完整性检查和违约处理
插入或对主码列进行更新操作时,关系数据库管理系统按照实体完整性规则自动进行检查。包括:
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
1.3 参照完整性
关系模型的参照完整性定义 在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
[例]定义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)
);
参照完整性违约处理:
(1) 拒绝(NO ACTION)执行
不允许该操作执行。该策略一般设置为默认策略
(2) 级联(CASCADE)操作
当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中的所有造成不一致的元组
(3)设置为空值(SET-NULL)
当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。
1.4用户定义的完整性
属性上定义:
CREATE TABLE时定义属性上的约束条件
- 列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 检查列值是否满足一个条件表达式(CHECK)
-
[例] Student表的Ssex只允许取“男”或“女”。
CREATE TABLE Student
( Sno CHAr(9) PRIMARY KEY,
Sname CHAr(8) NOT NULL,
Ssex CHAr(2) CHECK (Ssex IN (‘男’,’女’)),
Sage SMALLINT,
Sdept CHAr(20)
);
1.5断言
创建断言的语句格式
CREATE ASSERTION<断言名> 每个断言都被赋予一个名字,中的约束条件与WHERe子句的条件表达式类似。
属性上定义:
CREATE TABLE时定义属性上的约束条件
- 列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 检查列值是否满足一个条件表达式(CHECK)
-
[例] Student表的Ssex只允许取“男”或“女”。 CREATE TABLE Student ( Sno CHAr(9) PRIMARY KEY, Sname CHAr(8) NOT NULL, Ssex CHAr(2) CHECK (Ssex IN (‘男’,’女’)), Sage SMALLINT, Sdept CHAr(20) );
创建断言的语句格式
CREATE ASSERTION<断言名>
每个断言都被赋予一个名字, 中的约束条件与WHERe子句的条件表达式类似。
删除断言的语句格式为 DROP ASSERTION <断言名>;
1.6触发器
(触发器又叫做事件-条件-动作(event-condition-action)规则。)
CREATE TRIGGER语法格式
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
REFERENCING NEW|OLD ROW AS<变量>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]<触发动作体>
CREATE TRIGGER语法格式
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
REFERENCING NEW|OLD ROW AS<变量>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]<触发动作体>
1.定义触发器的语法说明
(1)表的拥有者才可以在表上创建触发器
(2)触发器名 触发器名可以包含模式名,也可以不包含模式名 同一模式下,触发器名必须是唯一的 触发器名和表名必须在同一模式下
(3)表名 触发器只能定义在基本表上,不能定义在视图上 当基本表的数据发生变化时,将激活定义在该表上相应触 发事件的触发器
4)触发事件 触发事件可以是(INSERT、DELETE或UPDATE )也可以是这几个事件的组合 还可以UPDATE OF<触发列,...>,即进一步指明修改哪些列时激活触发器
AFTER/BEFORE是触发的时机:
- AFTER表示在触发事件的操作执行之后激活触发器
- BEFORE表示在触发事件的操作执行之前激活触发器
(5)触发器类型
行级触发器(FOR EACH ROW) 语句级触发器(FOR EACH STATEMENT)
(6)触发条件
触发器被激活时,只有当触发条件为真时触发动作体才执行;否则触发动作体不执行。
如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行
(7)触发动作体
触发动作体可以是一个匿名PL/SQL过程块
[例] 当对表SC的Grade属性进行修改时,若分数增加了10%则将此次操作记录到下面表中:
SC_U(Sno,Cno,Oldgrade,Newgrade)其中Oldgrade是修改前的分数,Newgrade是修改后的分数。
CREATE TRIGGER SC_T AFTER UPDATE OF Grade ON SC REFERENCING OLD row AS OldTuple, NEW row AS NewTuple FOR EACH ROW WHEN (NewTuple.Grade >= 1.1*OldTuple.Grade) INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade) VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)
[例] 将每次对表Student的插入操作所增加的学生个数记录到表StudentInsertLog中。
CREATE TRIGGER Student_Count AFTER INSERT ON Student REFERENCING NEW TABLE AS DELTA FOR EACH STATEMENT INSERT INTO StudentInsertLog (Numbers) SELECT COUNT(*) FROM DELTA
[例] 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
CREATE TRIGGER Insert_Or_Update_Sal BEFORE INSERT OR UPDATE ON Teacher FOR EACH ROW BEGIN IF (new.Job='教授') AND (new.Sal < 4000) THEN new.Sal :=4000; END IF; END;
2.激活触发器 :
一个数据表上可能定义了多个触发器,遵循如下的执行顺序:
(1) 执行该表上的BEFORE触发器;(多个时按谁先创建谁先执行)
(2) 激活触发器的SQL语句;
(3) 执行该表上的AFTER触发器。
3.删除触发器
删除触发器的SQL语法: DROP TRIGGER <触发器名> ON <表名>;



