第三章关系数据库标准语言
SQL语言
§ 3.1 SQL概述一,SQL的由来
SQL是 Structured Query Language
(结构化查询语言 )的缩写。
1972年 SQUARE (Specifying Queries As
Relational Expression) 语言 ;
1974年改为 SEQUEL(Structured English
QUEry Language) 语言,后简称 SQL.
1986年 美国国家标准局 ANSI的数据库委员会
X3H2批准并公布了 SQL标准文本 (SQL-86)。
1987年 国际标准化组织 ISO 把 SQL-86采纳为国际标准。
1989年 ISO颁步了增强完整性特征的 SQL-89标准。
1992年 ISO公布了修改扩充后的 SQL-92(即
SQL2)标准。
目前最新标准为 SQL-99(即 SQL3)。
二,SQL数据库的体系结构三,SQL的组成 (分类 )
DATABASE
TABLE
CREATE VIEW
INDEX
SQL DDL:
ALTER
DROP
SQL QUERY,SELECT … FROM …
INSERT …
SQL SQL DML,UPDATE …
DELETE …
GRANT
SQL DCL,REVOKE
AUDIT
嵌入式 SQL:
四,SQL的特点
SQL语言集数据查询、数据操纵、数据定义、数据控制的功能于一体,其主要特点包括,
综合统一
高度非过程化
面向集合的操作方式
一种语法结构,两种使用方式
语言简捷,易学易用
§ 3.2 SQL语言的基本概念一,数据类型
1、字符型,CHAR(n)
2、数字型,INT,NUMBER(n,m),REAL,…
3、日期型,DATE,TIME,DATETIME
4、其它类型,LONG
二、函数
1,数字函数,常见的有 16个
ABS(X),SQRT(X),EXP(X),LOG(X),…
2,字符函数,常见的有 9个
LENGTH(X$),LOWER(X$),…
3,分组函数,常见的有 5个
COUNT(* ),MAX(X),MIN(X),AVG(X),

4,日期函数:
5,转换函数:
6,其他函数,PI,POWER(X,Y),…
三、运算符
1,句法操作符,&,&&,
2,数值操作符,+,-,*,/,‖,…
3,逻辑操作符,
=,>,<,≤,≥,≠,IN,ANY,ALL,…
4,查询表达式操作符,UNION,EXCEPT,…
5,其它操作符,*,(+),…
四、查询表结构
DESCRIBE [user.]表名;
§ 3.3 查询语句一、语句格式,
SELECT [ALL|DISTINCT] [表名,]{*|列名 |表达式 [AS 新列名 ]}
[INTO,主变量 1[,:主变量 2]… ]
FROM 表名 [表别名 ],…
[WHERE 条件表达式 |子查询 ]
[GROUP BY 列名 1,…
[HAVING 分组表达式 ]]
[{UNION|INTERSECT |EXCEPT}SELECT… FROM… ]
[ORDER BY 列名 |列序号 [ASC|DESC],… ];
SELECT… FROM常用语句执行过程
SELECT… ⑤ 投影
FROM… ① TABLE→ 内存
WHERE… ② 选取元组
GROUP… ③ 分组
HAVING… ④ 选择分组
[{UNION|… } ⑥ 查徇结果的集合运算
SELECT… ] ① ~⑤
ORDER BY…… ⑦ 排序输出二、单表查询
1,选择表中的列例 1.求学生所在系及姓名
SELECT SD,SN
FROM S;
例 2.求学生的全部信息
SELECT S#,SN,SA,SD @
FROM S;
@ (SELECT *)
2,选择表中的行
1) 消除重复行,DISTINCT (缺省为 ALL)
例,求选修了课程的学生号
SELECT DISTINCT S#
FROM S;
2) 选满足一定条件的行:
用 WHERE子句实现例,求计算机系年龄小于 19的姓名及年龄
SELECT SN,SA
FROM S
WHERE SD=’CS’ AND SA<19;
例,求年龄在 18~ 22 (含 18,22)之间的学生名及年龄 (或不在 18~ 22之间 )
SELECT SN,SA
FROM S
WHERE SA BETWEEN 18 AND 22;
(WHERE SA>=18 AND SA<=22);
(WHERE SA NOT BETWEEW 18 AND 22);
(WHERE SA<18 OR SA>22);
3)查询条件来自集合:
用 IN or NOT IN
例,求信息工程系、计算机系、数学系的系名、
学生名 (或不是这些系的学生 )
SELECT SD DEPT,SN NAME
FROM S
WHERE SD IN (‘IE’,‘CS’,‘MA’);
(WHERE SD=‘IE’ OR SD=‘CS’ OR SD=‘MA’)
(WHERE SD NOT IN (‘IE’,‘CS’,‘MA’);
(WHERE SD!=‘IE’ AND SD!=‘CS’ AND SD!=‘MA’)
4) 字符匹配,
格式,
[NOT] LIKE ‘匹配串’ [ESCAPE ‘换码字符’ ]
%,表示任意长度 (≥0的任意字符
__,表示单个的任意字符
ESCAPE ‘换码字符’,
匹配串中‘换码字符’之后的字
(%,__),被定义为普通字符 (不作通配符用 )
例 1,求课程名中有’数据库’的课程记录
SELECT *
FROM C
WHERE CN LIKE ‘%数据库 %’;
例 2,求倒数第三、四个汉字为 ’ 系统 ’ 的课程名
SELECT CN
FROM C
WHERE CN LIKE ‘%系统 ____’;
例 3,求以 ‘ DATA_BASE’开头且倒数第五个字符为 ’ S’的课程名
SELECT CN
FROM C
WHERE CN LIKE
‘DATA\_BASE%S____’ ESCAPE’\’;
3、分组与组函数,
1) 组函数的使用格式:
COUNT([DISTINCT|ALL] *|列名 )
SUM([DISTINCT|ALL] 列名 )
AVG([DISTINCT|ALL] 列名 )
MAX([DISTINCT|ALL] 列名 )
MIN([DISTINCT|ALL] 列名 )
2) 组函数可用于 SELECT子句中的目标列表中,或在 HAVING子句的分组表达式中用作条件。
3) 分组用 GROUP BY对一列或若干列的值分组,同值的分为一组。
4) 对分出的每一组用 HAVING进行筛选,
筛选条件要用到组函数。
例 1,求选修了课程的学生人数
SELECT COUNT(DISTINCT S#)
FROM SC;
例 2,求选修各门课的人数及平均成绩
SELECT C#,COUNT(S#),AVG(ALL GR)
FROM SC
GROUP BY C#;
例 3,求选修课程在 5门以上且都及格的学生号及总平均分
SELECT S#,AVG(ALL GR)
FROM SC
GROUP BY S#
HAVING COUNT(C#)>5
AND MIN(GR)≥60 ;
4、排序
1) 用 ORDER BY子句对查询结果按照一个或多个列的值进行升 /降排列输出
2) 升序为 ASC;降序为 DESC
3) 空值将作为最大值排序例 1,对选修 ’ C5’课程的学生按成绩降序排列,同分数者按学号升序排列
SELECT S#,GR
FROM SC
WHERE C#=’C5’
ORDER BY GR DESC,S# ASC;
例 2,求每个学生的总分并按总分降序排列,
学号升序
SELECT S#,SUM(ALL GR)
FROM SC
GROUP BY S#
ORDER BY 2 DESC,S# ASC;
三、连接查询若一个查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系数据库中主要的查询,包括多表连接查询、单表连接查询、外连接查询和复合条件连接查询等。
* 几个示范表
EMP(EMPNO,ENAME,JOB,MGR,SAL,COMM,DEPTNO)
DEPT(DEPTNO,DNAME,CITY)
SALGRADE(GRADE,LOSAL,HISAL)
S(S#,SN,SA,SD) C(C#,CN,CT,PC#)
SC(S#,C#,GR)
1、多表连接:
1) 连接条件一:
[表名 1.] 列名 1 比较运算符 [表名 2.]列名 2
2) 连接条件二:
[表名 1.]列名 1 BETWEEN [表名 2.]列名 2
AND [表名 3.]列名 3
3) 连接条件中的列名称为连接字段,其各字段应是可比的。
执行过程:
在表 1中找到第一个元组,然后从头开始扫描表 2,查找到满足条件的元组即进行串接并存入结果表中;再继续扫描表 2,依次类推,直到表 2末尾 。 再从表 1中取第二个元组,重复上述的操作,
直到表 1中的元组全部处理完毕 。
例 1,求选课情况,要求输出学号,姓名,课程名与成绩
SELECT S.S#,SN,CN,GR
FROM S,C,SC
WHERE S.S#=SC.S# AND C.C#=SC.C#;
例 2,求每个职工的工资级别
SELECT ENAME,SAL,GRADE
FROM EMP,SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL;
2、单表连接用表别名把一个表定义为两个不同性质的表进行连接。
例 1,求每门课的间接先修课名 ( 即先修课的先修课 )
SELECT FIRST.C#,FIRST.CN,
SECOND.PC#,THIRD.CN
FROM C FIRST,C SECOND,C THIRD
WHERE FIRST.PC#=SECOND.C#
AND SECOND.PC#=THIRD.C#;
例 2,求比本部门职工工资低的部门负责人
SELECT W.ENAME,W.SAL,
M.ENAME,M.SAL
FROM EMP W,EMP M
WHERE W.MGR=M,EMPNO
AND W.SAL>M.SAL;
3、外连接在连接条件的某侧加上 (* ) 或 (+),表示该侧所对应的表中可形成一个各数据项均为空值的万能替代行,用来与另一侧对应的表中所有不满足条件的元组进行连接 。 外连接符 (* )或 ( +) 出现在左侧称为左外连接,出现在右侧称为右连接,两侧都出现的称为全外连接 。
例 1,求各部门名及职工名,工种,要求输出无职工的部门 ( 职工以空值出现 )
SELECT DNAME,ENAME,JOB
FROM DEPT,EMP
WHERE DEPT.DEPTNO=EMP.DEPTNO(*);
例 2,求各部门名及职工名,工种,要求输出未分配部门的职工 ( 部门以空值出现 )
SELECT DNAME,ENAME,JOB
FROM DEPT,EMP
WHERE DEPT.DEPTNO(*)=EMP.DEPTNO;
例 3,求各部门名及职工名,工种,要求输出无职工的部门和未分配部门的职工
SELECT DNAME,ENAME,JOB
FROM DEPT,EMP
WHERE DEPT.DEPTNO(*)=EMP.DEPTNO(*) ;
4、复合条件连接
WHERE子句中除了连接条件,还有其它限制条件。
例,求选修’ C6’课程且成绩超过 90分的学生名与成绩
SELECT SN,GR
FROM S,SC
WHERE S.S#=SC.S# 连接条件
AND SC.C#=’C6’ 限制条件 C#=’C6’
AND SC.GR>90; 限制条件 GR>90
四、空值处理列值为空值的测试条件为:
列名 IS NULL
例,求未确定系名的学生姓名
SELECT SN
FROM S
WHERE SD IS NULL;
五、嵌套查询
在 SELECT … FROM … WHERE语句结构的
WHERE子句中可嵌入一个 SELECT语句块
其上层 查询称为外层查询或父查询
其下层 查询称为内层查询或子查询
SQL语言允许使用多重嵌套查询
在 子查询中不允许使用 ORDER BY子句
嵌套查询的实现一般是从里到外,即先进行子查询,再把其结果用于父查询作为条件
1、返回单个值的子查询例,求与‘刘力’同一个系的学生名,年龄
SELECT SN,SA
FROM S
WHERE SD=( SELECT SD
FROM S
WHERE SN=‘刘力 ’ );
2、返回一组值的子查询例 1,求选修 ‘ C6‘课程且成绩超过 90分的学生
SELECT *
FROM S
WHERE S# IN
( SELECT S#
FROM SC
WHERE C#=‘C6’
AND GR> 90);
例 2,求选修 ‘ C6‘课程且成绩超过 90分的学生
SELECT S.*
FROM S,SC
WHERE S.S#=SC.S# (连接查询 )
AND GR> 90
AND C#=’C6’;
例 3,求比计算机系中某一学生年龄小的其他系的学生方法一:
SELECT *
FROM S
WHERE SD!=’CS’
AND SA< ANY
( SELECT SA
FROM S
WHERE SD=‘CS’);
方法二:
SELECT *
FROM S
WHERE SD!=’CS’
AND SA<
( SELECT MAX(SA)
FROM S
WHERE SD=‘CS’);
3、多重子查询例 1,求 10#部门中工种与‘ SALES’部门
(销售)中任一工种相同的职工
SELECT ENAME,JOB,SAL
FROM EMP
WHERE DEPTNO=‘10’
AND JOB IN
(SELECT JOB
FROM EMP
WHERE DEPTNO=
( SELECT DEPTNO
FROM DEPT
WHERE DNAME=‘SALES’));
例 2,求工资介于‘ CLARK’与 ‘ MILLER’两个之间的职工
SELECT *
FROM EMP
WHERE SAL> =
(SELECT MIN(SAL)
FROM EMP
WHERE ENAHE IN (‘CLARK’,‘ MILLER’))
AND SAL< =
(SELECT MAX(SAL)
FROM EMP
WHERE ENAME IN( ‘ CLARK’,‘MILLER’);
例 3,求工种与在纽约的职工的工种相同的职工
SELECT DEPTND,ENAME,JOB,SAL
FROM EMP
WHERE JOB IN
(SELECT JOB
FROM EMP
WHERE DEPTND IN
(SELECT DEPTND
FROM DEPT
WHERE LOC=’NEW YORK’));
六、带有 EXISTS
EXISTS表示存在量词
带有 EXISTS的子查询不返回任何记录的数据,只返回逻辑值 ‘ True’或 ‘ False’
不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询 (Correlated Subquery),带 EXISTS
的子查询就是相关子查询例 1,求所有选修了 ‘ C1’课程的学生名 。
SELECT SN
FROM S
WHERE EXISTS
(SELECT *
FROM SC
WHERE S.S#=SC.S#
AND C#=‘C1’);
在例 1中,使用了 EXISTS后,若子查询结果非空,则父查询的 WHERE子句处返回逻辑值 ‘ TRUE’,否则返回 ‘ FALSE’。
由于只须返回 ‘ TRUE’或 ‘ FALSE’,所以由 EXISTS引出的子查询中的目标列表通常用 *。
相关子查询的求解过程先在外层查询中取 S表的第一个元组(记录),用该记录的相关的属性值(在内层 WHERE子句中给定的)处理内层查询,
若外层的 WHERE子句返回 ‘ TRUE’值,则此元组送入结果的表中。然后再取下一个元组;重复上述过程直到外层表的记录全部遍历一次为止。
NOT EXISTS,若子查询结果为空,返回
‘ TRUE’值,否则返回 ‘ FALSE’。
例 2,求选修了全部课程的学生名
SELECT SN
FROM S
WHERE NOT EXISTS
(SELECT *
FROM C
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE S.S#=SC.S#
AND C.C#=SC.C#));
§ 3.4 更新语句
SQL更新语句 (SQL DML)
SQL的 DML有:
INSERT 插入
UPDATE 修改
DELETE 删除一、插入操作
1、插入单个元组格式,INSERT INTO 表名 [(列名 1,… )]
VALUES (列值 1,… );
例 1,插入一已知元组的全部列值
INSERT INTO S
VALUES(‘990021’,‘陈冬 ’,18,‘CS’,‘男 ’ );
例 2,插入一已知元组的部分列值
INSERT INTO SC( S#,C#)
VALUES(‘9807121’,‘C175’);
例 3,插入一个不确定值的元组
INSERT INTO S
VALUES(‘& S#’,‘& SNAME’,‘& SA’,‘&
SD’);
2、插入子查询的结果格式,INSERT INTO 表名 [(列名 1,… )]
(子查询 );
例,设关系 S_G(S#,AVG_G),把平均成绩大于 80的学生的学号及平均成绩存入 S_G中。
INSERT INTO S-G(S#,AVG-G)
(SELECT S#,AVG(ALL.G)
FROM SC
WHERE S# IN
(SELECT S#
FROM S
WHERE SEX=‘男 ’ )
GROUP BY S#
HAVING AVG(ALL G)>80);
二、删除操作格式,DELETE FROM 表名
[WHERE 条件 ];
例,删除选修‘ C4’且成绩小于该课程的平均成绩的记录
DELETE FROM SC
WHERE C#=‘C4’
AND G <
(SELECT AVG(ALL G)
FROM SC
WHERE C#=‘C4’);
三、修改操作格式 1,UPDATE 表名 [别名 ]
SET 列名 =表达式,…
[WHERE 条件 ];
格式 2,UPDATE 表名 [别名 ]
SET (列名,… )=(子查询 )
[WHERE 条件 ];
例 1,名为 MARTIN的职工的工种改为
MANAGER,工资增加收入 20%,佣金为空。
UPDATE EMP
SET JOB=‘MSNSHRT’,
SAL=SAL*1.2,
COMM=NULL
WHERE ENDME=‘MARTIN’;
例 2,工种为 SALESMEN的职工的工资改为工种平均工资的 110%,佣金为最低值。
UPDATE EMP
SET (SAL,COMM)=
(SELECT 1.1*AVG(ALL SAL),MIN(COMM)
FROM EMP
WHERE JOB=‘SALESMEN’)
WHERE JOB=‘SALESMEN’;
例 3,计算机系全体学生成绩上浮 15%
UPDATE SC
SET GR=GR*1.15,
WHERE S# N
(SELECT S#
FROM S
WHERE SD=‘CS’);
§ 3.5 SQL DDL
一、定义数据库
1、格式,CREATE DATABSE 数据库名 … ;
作用,生成一个新的数据库。
2、格式,ALTER DATABASE 数据库名 … ;
作用,用来改变已存在的数据库的特征。
3、格式,DROP DATABASE 数据库名 1,… ;
作用,从服务器中删除指定的数据库以及与其相关的对象及存储空间。
二、定义模式
1,格式,CREATE SCHEMA 模式名
[AUTHORIZATION 用户名 ];
作用,建立一个模式,并指明拥有该模式的用户,省略为 CREATE SCHEMA的用户
2,格式,DROP SCHEMA 模式名 [RESTRICT];
作用,从服务器上删除一个模式;
RESTRICT选项确保该模式在删除时,模式内没有任何对象。
三、定义表
1,格式,CREATE TABLE 表名
(列名 类型 (长度 ) [NOT NULL]
[DEFAULT {常量 |系统变量 |NULL}]
[列约束 ],… )
[PRIMARY KEY (列名,… )]
[FOREIGN KEY (列名,… )
REFERENCES 表名 (列名,… )]
[CHECK 条件 ];
作用,建立一个新表,表中无记录
2,格式,CREATE TABLE 表名 [(列名
[NOT NULL],… )]
[PRIMARY KEY (列名,… )]
[FOREIGN KEY (列名,… )
REFERENCES 表名 1(列名,… )]
AS 子查询作用,建立一个带有子查询结果记录的新表例,建立学生 S、课程 C、选课 SC等三个表
CREATE TABLE S
(S# CHAR(6) NOT NULL,
SNAME CHAR(8) NOT NULL,
SAGE SMALLINT,
SD CHAR(10),
SEX CHAR(2) DEFAULT ‘男 ’
CHELK ‘男 ’ OR ‘女 ’ )
PRIMARY KEY (S#);
CREATE TABLE C
(C# CHAR(6) NOT NULL,
CNAME CHAR(30) NOT NULL,
TNAME CHAR(8),
PC# CHAR(6))
PRIMARY KEY (C#);
CREATE TABLE SC
(S# CHAR(6) NOT NULL,
C# CHAR(6) NOT NULL,
GR SMALLINT DEFAULT NULL)
PRIMARY KEY (S#,C#)
FOREIGN KEY (S#) REFERENCES S(S#)
FOREIGN KDY (C#) REFERENCES C(C#)
CHECK (G IS NULL)
OR (G BETWEEN O AND 100);
3,格式,ALTER TABLE 表名
[ADD 新列名 类型 (长度 )[NOT NULL]
[列约束 ],… ]
[MODIFY 旧列名 类型 (长度 )]
[DROP 列约束 ]
[DROP 列名 [CASCADE|RESTRICT]];
作用,增加新列,修改列,删除列 及列的完整性约束
CASCADE连同引用与约束一起自动删除
RESTRICT无引用该列时,才可删除例 1,在 S表中增加一个入学时间,为日期型
ALETR TABLE S ADD SCOME DATE;
例 2,把 SA列的类型改为半字长整数
ALETR TABLE S MODIFY SA SMALLINT;
例 3,删除对 SN列的唯一约束
ALETR TABLE S DROP UNIQUE(SN);
表的修改包括:
改变表名,增加列、改变列的数据类型、
删除列的约束,删除列、改变列名
对 删除列、改变列名 的操作,可采取如下步骤实现:
1) CREATE TABLE … AS (子查询 )建一新表
2) 删除旧表
3) 改变表名
4,格式:
DROP TABLE 表名 [CASCADE|RESTRICT];
作用,删除一个表,及与该表相关的索引、视图、码和外部码。
CASCADE连同引用该表的视图、完整性约束一起自动撤消
RESTRICT无引用时,才可撤消四、索引
1,格式:
CREATE[UNIQUE][CLUSTER]INDEX 索引名
ON 表名 (列名 [ASC|DESC],… );
作用,对指定的表的列建立索引
UNIQUE表示索引值唯一
CLUSTER表示索引是聚簇索引
索引一旦建立,交由系统使用和维护例:
CREATE UNIQUE INDEX SIDX ON S(S# ASC);
CREATE CLUSTER INDEX SNCDX
ON S(SNAME ASC);
CREATE UNIQUE INDEX CIDX ON C(C# ASC);
CREATE UNIQUE INDEX SCIDX
ON SC(S# ASC,C# DESC);
2,格式,DROP INDEX 索引名;
作用,删除索引例,DROP INDEX CIDX;
§ 3.6 SQL DCL
SQL的 DCL含授权,回收 (撤消 )权限,
审计等。
一、授权 (标准 SQL)
SQL标准中对用户的授权分为 DATABASE
和 TABLE二类对象 。
1,DATABASE:
格式,GRANT CREATETAB ON DATABASE
数据库名 TO {用户名,… |PUBLIC}
[WITH GRANT OPTION];
作用,授予用户建立表的权限
由 DBA授权,只有 CREATETAB一种权限
WITH GRANT OPTION允许用户转授权
(权限传播 )
PUBLIC表示所有用户
2,TABLE级的基本表格式,GRANT[{SELECT|INSERT|UPDATE|
DELETE|ALTER|INDEX|ALL PRIVICEES}]
ON TABLE 表名 TO {用户名,… |PUBLIC}
[WITH GRANT OPTION];
作用,授予用户对表的操作权限
WITH GRANT OPTION允许用户转授权
由拥有该表的用户授权
PUBLIC表示所有用户
3、视图 (VIEW)
格式,GRANT{SELEG|INSERT|UPDATE|
DELETE|ALL PRIVIIEGES}
ON TABLE 视图名
TO {用户名,… |PUBLIC}
[WITH GRANT OPTION];
作用,授予用户对视图的操作权限
由拥有该视图的用户授权
4、列格式,GRANT{SELECT|INSERT|UPDATE|
DELETE|ALL PRIVILEGES }
(列名,…) ON TABLE {表名 |视图名 }
TO {用户名,… |PUBLIC}
[WITH GRANT OPTION];
作用,授予用户对列的操作权限
由拥有该表或视图的用户授权例:
GRANT CREATETAB ON DATABASE
教学系统 TO USER1;
GRANT SELECT,INSERT ON TABLE SC
TO USER1,USER2,USER5
WITH GARNT OPTION;
GRANT ALL PRIVILEGES ON TABLE SC
TO USER3,USER4,USER7;
二,ORACLE授权机制在 ORACLE 中对用户的授权分为系统级、表级、视图级
1,系统级:
格式,GRANT [CONNECT[,RESOURCE[,DBA]]]
TO {用户名,… |PUBLIC}
[IDENTIFIED BY 口令,… ];
作用,授予用户对 ORACLE系统的操作权限
CONNECT,允许用户登录数据库,在获得表级或视图级授权后可作相应操作,
但不能建立表 (CREATE TABLE)
RESOURCE,允许建表
DBA,超级用户
2、表级:格式与标准 SQL类似
3、表级:格式与标准 SQL类似例:
GRANT CONNECT,RESOURCE TO XUNS;
GRANT TO USER6 IDENTIFIED BY QWE;
三、撤消权限由 DBA或授于 DBA权限的用户对其他用户进行权限回收。
1,格式,REVOKE CREATETAB
ON DATABASE 数据库名
FROM {用户名,… |PUBLIC};
2,格式,REVOKE {权限列表 }
ON TABLE {表名 |视图名 }
FROM {用户名,… |PUBLIC};
3,格式,REVORE {权限列表 } (列名,… )
ON TABLE {表名 |视图名 }
FROM {用户名,… |PUBLIC};
4,格式,REVOKE (DBA[,RESOURCE
[,CONNECT]])
FROM {用户名,… |PUBLIC};
四、审计 (AUDIT)
以 ORACLE为例,分为系统级审计和用户级审计两种
1、系统级审计,由 DBA进行,可监测登录要求,GRANT,REVOKE及其他数据库级的操作
2、用户级审计,由用户设置,主要针对用户自己创建的表或视图进行审计,监测对表或视图的访问及其他操作。
3、设置审计:
格式,AUDIT 操作列表 ON
{表名 |视图名 |SYSTEM}
4、取消审计:
格式,NOAUDIT 操作列表 ON
{表名 |视图名 |SYSTEM}
5、审计结果存放:
内容在数据字典表 SYS.AUDIT_TRAIL中;
可用 SELECT * FROM SYS.AUDIT_TRAIL; 查看。
§ 3.6 视图视图是从一个或几个表 (或视图 )导出的一个特殊的表 。
视图是一个虚表
数据库中只存放视图的定义
视图对应的数据仍存放在原来的表中
随着表中数据的变化,视图的数据随之改变 。
对视图的查询与基本表一样
对视图的更新将受到一定的限制一、定义视图
1、建立视图格式,CREATE VIEW 视图名 [(列名,… )]
AS 子查询
[WITH {CHECK OPTION|READ ONLY}];
2、有关说明
1) WITH READ ONLY表示视图不可更新
2) 视图列名全部省略或全部指定,全部省略时,以 SELECT的标志为准
3) WITH CHECK OPTION是针对可更新视图,规定更新的行要满足视图的定义
(即子查询中的 WHERE子句的条件表达式 )。
4) 下述三种情况是,必须指定全部列名
某个目标列是组函数或表达式
多表连接时,目标列中出现同名列
不用原基本表的列名作为视图名
5) 虚拟列:定义视图时,为由基本数据经过各种计算派生出的数据所设置的派生属性列 。
1) 定义视图的子查询不允许含有 ORDER
BY子句和 DISTINCT。
3、视图分类
行列子集视图:从单个基本表导出,
保留基本表的码,但去掉其它的某些列和部分行的视图 。
表达式视图:带虚拟列的视图 。
分组视图:子查询目标表带有组函数或子查询带有 GROUP BY子句的视图 。
例 1,建立计算机系学生视图
CREATE VIEW CS_S
AS (SELECT S#,SN,SEX,SA
FROM S
WHERE SD=‘CS’)
WITH CHECK OPTION;
(行列子集视图 )
例 2,建立计算机系选修 ‘ 计算机体系结构 ’ 课程的学生视图
CREATE VIEW CS_SCA(S#,NAME,GR)
AS SELECT S.S#,SN,GR
FROM S,SC,C
WHERE S.S#=SC.S#
AND C.C#=SC.C#
AND S.SD=‘CS’
AND CN=‘计算机体系结构 ’ ;
例 3,建立学生出生年份的视图
CREATE VIEW
BT_S(SNO,NAME,BIRTH)
AS SELECT S#,SN,2000_SA
FROM S;
(表达式视图 )
(虚拟列 )
例 4,建立学生平均成绩视图
CREATE VIEW S_AVG_G(SNO,AVG_G)
AS SELECT S#,AVG(ALL GR)
FROM SC
GROUP BY S#;
(分组视图 )
二、查询视图在对视图查询时,DBMS将进行有效性检查 ( 表及视图 ) 。
若存在,则从数据字典中取出视图定义,并把定义中的子查询与用户查询结合起来转换为等价的对基本表的查询,
然后再执行 。
该转换过程称为 视图消解 (View
Resolution)。
例 1,求计算机系年龄小于 20的学生
SELECT S#,SN
FROM CS_S
WHERE SA<20;
视图消解
SELECT S#,SN
FROM S
WHERE SD=‘CS’ AND SA<20;
例 2,求计算机系选修 ‘ C2’课程的学生
SELECT SN#,SN
FROM CS_S,SC
WHERE CS_S.S#=SC.S#
AND SC.C#=‘C2’;
例 3,在学生平均成绩视图 S_AVG_G中查询平均成绩在 90分以上的学生号及成绩
SELECT *
FROM S_AVG_G
WHERE AVG_G>=90;
(系统转换后 )
SELECT S#,AVG( ALL GR)
FROM SC
WHERE AVG(ALL GR)>=90
GROUP BY S#;
SELECT S#,AVG(ALL GR)
FROM SC
GROUP BY S#
HAVING AVG(ALL GR)>=90;
(正确的转换结果 )
三、更新视图
1,更新视图即通过视图插入 (INSERT),删除 (DELETE)和修改 (UPDATE)数据,实质上转换为对基本表的更新 。
2,为了防止用户对超出视图范围的基本表的数据进行操作,在定义视图时,应加上 WITH CHECK OPTION子句,则在视图上更新数据时,DBMS将检查视图定义中的条件,不满足将拒绝执行。
例 1,SC_S视图的 ‘ 刘茜 ’ 的年龄改为 20
转换前:
UPDATE CS_S
SET SA=20
WHERE SN=‘刘茜 ’ ;
转换后:
UPDATE S
SET SA=20
WHERE SN=‘刘茜 ’
AND DS=‘C5’;
例 2,在 CS_S中插入 ‘ 990075,吴迪,女,19’
的学生记录转换前:
INSERT INT CS_S
VALUES(‘990075’,
‘ 吴迪 ’,‘女 ’,19);
转换后:
INSERT INTO S
VALUES(‘990075’,‘吴迪 ’,19,‘CS’,‘女
’ );
例 3,删除 CS_S中年龄大于 23的学生转换前:
DELETE FROM CS_S
WHERE SA>23;
转换后:
DELETE FROM S
WHERE SA>23
AND SD=’C5;
例 4,修改‘ 990075’学生平均成绩为 90
转换前:
UPDATE S_AVG_G
SET AVG_G=90
WHERE SNO=’990075’;
不可转换。
左边程序操作失败。
3,一般情况下,行列子集视图是可更新的,所以各 RDBS均只允许对行列子集视图进行更新 。
4,不可更新的视图(各系统不太一致)
由多个表导出的视图,不可更新
视图的列来自表达式或常数,不可插,改,可删
视图列是来自组函数,不可更新
视图定义中含有 GROUP BY子句,不可更新
视图定义中有 DISTINCT短语,不可更新
视图定义中内层嵌套的表与查询目标同一个表,
不可更新
在不允许更新的视图上定义的视图,不可更新四、使用视图的优点
提供数据的逻辑独立性
提供数据的安全保护功能
简化用户的操作 ( 对系统构成的视图,用户不必关心各表间的联系 )
同一数据多种用法
§ 3.8 嵌入式 SQL
将 SQL语言嵌入到某种高级语言中使用,利用高级语言的过程性结构来弥补
SQL语言实现复杂应用方面的不足。
这种方式下使用的 SQL语言称为嵌入式 SQL(Embedded SQL)。
嵌入 SQL的高级语言称为主语言或宿主语言。
一、嵌入式 SQL一般形式
在所有的嵌入式 SQL语句之前均加上前缀
EXEC SQL
嵌入式 SQL语句的结束标志可以是 ‘ ; ’,
END_EXEC等
嵌入式语句分为说明性语句和可执行语句两种
说明性语句出现在允许出现主语言说明性语句的地方
可执行 SQL语句出现在允许出现主语句可执行语句的地方二,SQL语句与主语言通信
1,SQL通信区 (SQLCA)
SQLCA,SQL Communication Area
作用,向主语言传递 SQL语句的执行状态信息等
DBMS工作状态、运行信息 SQLCA应用程序 后继语句
SQLCA是一种数据结构,在应用程序中用
EXEC SQL INCLUDE SQLCA 加以定义
SQLCODE,SQLCA中的一个存放返回代码的变量;每次 SQL语句执行后均返回一个值,表示该 SQL语句执行是否成功,以及不成功的原因。
通常用预定义的常量 SUCCESS表示成功;
否则在 SQLCODE中将存放错误代码。
2、主变量,主语言中定义的变量,在
SQL语句中使用。 主变量分为输入主变量和输出主变量两种。
输入主变量 由应用程序赋值,在 SQL语句中引用
输出主变量 由 SQL语句赋值,在应用程序中引用
指示变量 ( 整型变量 ),用于指示所指主变量的值或条件;是由主变量附带,
检测主变量是否为空 。
定义主变量,主变量及指示变量应在 SQL
语句的
EXEC SQL BEGIN DECLARE SECTION
… … …
EXEC SQL END DECLARE SECTION
之间说明 。
引用主变量,在 SQL语句中引用主变量和指示变量时,其变量名前应加 ‘,’ 。
3、游标,游标是系统为存放 SQL语句的执行结果而开设的一个数据缓冲区,每个游标区有一个名字。用户可通过游标逐一获取该缓冲区的记录,并赋给主变量,
交由主语言进一步处理。使用游标的步骤为:
说明游标:用 DECLARE语句为一条 SELECT
语句定义游标 。 DECLARE语句的一般形式为,EXEC SQL DECLARE 游标名
CURSOR FOR SELECT语句;
打开游标:用 OPEN语句将定义的游标打开 。
OPEN语句的一般形式为:
EXEC SQL OPEN 游标名;
拨动游标:取游标指针指示的当前记录并 。
推进游标指针 。
用 FETCH语句把游标指针向前推进一条记录,同时将缓冲区中的当前记录取出来送到主变量供主语言进一步处理 。 FETCH语句的一般 形式为:
EXEC SQL FETCH 游标名
INTO,主变量 [:指示变量 ],… ;
关闭游标:用 CLOSE语句关闭游标,释放结果集占用的缓冲区及其他资源 。 CLOSE
语句的一般形式为:
EXEC SQL CLOSE 游标名;
游标被关闭后,就不再和原来的查询结果集相联系;但被关闭的游标可以再次被打开,与新的查询结果相联系。
第四章 数据库设计
§ 4.1 数据库设计步骤一、数据库设计的特点数据库设计是一项涉及多学科的综合性技术,是一项庞大的工程项目 。
特点一:数据库建设是硬件,软件和干件 (技术与管理的界面称为干件 )的结合 。
特点二:数据库设计应该和应用系统设计相结合,在整个设计过程中要把结构
(数据 )设计和行为 (处理,功能 )设计密切结合起来 。
二、数据库设计的基本步骤数据库设计分为六个阶段:
需求分析
概念结构设计
逻辑结构设计
物理结构设计
数据库实施
数据库运行和维护
1,需求分析阶段进行数据库设计首先必须准确了解与分析用户需求 (包括数据与处理,功能 )。
需求分析是整个设计过程的基础,是最困难,最耗时间的一步 。
2,概念结构设计阶段概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合,归纳与抽象,形成一个独立于具体 DBMS的概念模型 。
3,逻辑结构设计阶段逻辑结构设计是将概念结构转换为某个 DBMS所支持的数据模型,并对其进行优化 。
4,物理结构设计阶段数据库物理设计是为逻辑数据模型选取一个最适合应用环境的物理结构 (包括存储结构和存取方法 )。
5,数据库实施阶段在数据库实施阶段,设计人员运用 DBMS
提供的数据语言及其宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行 。
6,数据库运行和维护阶段数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。
§ 4.2 数据库 的实施阶段一、数据库的实施阶段数据库实施阶段的两项重要工作:
数据的 载入 和应用程序的 编码与调试
数据的载入
数据输入子系统
应用程序的调试二、数据库的试运行在输入一小部分数据到数据库后,可对数据库系统进行联合调试,即数据库的试运行。
运行数据库应用程序,执行对数据库的各种操作;测试应用程序的功能;
测试系统的性能指标
§ 4.3 数据库 的运行和维护在数据库的运行阶段,对数据库的经常性的维护工作主要由 DBA来实践。
数据库运行阶段的主要维护工作有:
数据库的转储和恢复
数据库的安全性、完整性控制
数据库性能的监督、分析与改造
数据库的重组织与重构造
1,数据库的转储与恢复数据库的转储和恢复是系统正式运行后最重要的维护工作之一 。 DBA要针对不同的应用要求制定不同的转储计划,
以保证一旦发生故障能尽快将数据库恢复到某种一致状态,并尽可能减少对数据库的破坏 。
2,数据库的安全性,完整性控制在数据库运行过程中,由于应用环境的变化,对安全性的要求也会发生变化,需要 DBA根据实际情况修改原有的安全性控制。
同样,数据库的完整性约束条件也会变化,也需要 DBA不断修正,以满足用户要求。
3,数据库性能的监督,分析和改造在数据库运行过程中,监督系统运行,对监测数据进行分析,找出改进系统性能的方法是 DBA的又一重要任务。
4,数据库的重组织与重构造数据库运行一段时间后,由于记录不断增,删,改,会使数据库的物理存储情况变坏,降低了数据的存取效率,
数据库性能下降,这时 DBA就要对数据库进行重组织,或部分重组织 ( 只对频繁增,删的表进行重组织 ) ;若 原有的数据库设计不能满足新的需求,需对数据库结构进行 重构造 。
重组织,按原设计要求重新安排存储位置,
回收垃圾,减少指针链等,提高系统性能 。
DBMS提供数据重组织用的实用程序 。
重构造,由于数据库应用环境发生变化,
增加了新的应用或新的实体,取消了某些应用,有的实体与实体间的联系也了生了变化等,使原有的数据库设计不能满足新的需求,
需要调整数据库的模式或内模式 。
数据库的重组织,并不修改原设计的逻辑和物理结构;而数据库的重构造是指部分修改数据库的模式和内模式;数据库的重构是有限的,只能部分修改 。
第五章 数据库保护
§ 5.1 数据库安全性数据库安全性 是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏;
系统安全保护措施是否有效是数据库系统的主要指标之一。
一,计算机安全性概论
1.计算机系统安全性:
为计算机系统建立和采取的各种安全保护措施、以保护计算机系统中的硬件、软件及数据,防止其因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露等。
2.计算机系统安全性问题分类:
技术安全类,管理安全类、政策法律类
技术安全:
计算机系统采用具有一定安全性的硬件、软件来实现对计算机系统及其所存数据的安全保护,在系统受到无意或恶意攻击时,仍能保证系统正常运行,数据不增加、不丢失、不泄露。
管理安全:
因管理不善导致的计算机设备和数据介质的物理破坏、丢失;场地的意外世故、软硬件的意外故障造成的安全问题。
政策法律类:
由政府部门制定的有关计算机犯罪、
数据安全保密的法律、法规等。
3,TCSEC/TDI规定的安全性级别安全级别 定 义
A1 验证设计
B3 安全域
B2 结构化保护
B1 标记安全保护
C2 受控的存取保护
C1 自主安全保护
D 最小保护二、数据库安全性控制
1.安全模型用户标识 存取控制 OS 密码存储与鉴别 安全保护
2.用户标识:
用户名或用户标识号用户 DBMS OS DB
3.用户鉴别:
口令( Password)
随机函数法
提问法
符号标记法
指纹
声音
视纹
4.存取控制:
定义用户权限:
授权与权限回收
合法权限检查:
对用户的存取要求,DBMS查找数据字典,进行合法权检查,决定是否执行。
5.数据加密:
根据一定算法将原始数据 (明文,Plain
Text)变换为不可直接识别的格式,既密文 (Cipher Text)。
加密方法:
替换方法:
置换方法,
明键加密法:
6.视图机制
7.审计三,统计数据库安全性四、日志文件
§ 5.2 数据库 完整 性
数据库的完整性是指数据的正确性和相容性
数据库是否具备完整性关系到数据库系统能否真实地反映现实世界
为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓垃圾进垃圾出所造成的无效操作和错误结果 。
DBMS提供一种机制来检查数据库中的数据,看其是否满足语义规定的条件 。
加在数据库数据之上的语义约束条件称为数据库完整性约束条件 。
完整性约束条件作为模式的一部分存入数据库中 。
DBMS中检查数据是否满足完整性条件的机制称为完整性检查 。
完整性机制:
完整性约束条件,完整性检查一,完整性约束条件
静态约束是指数据库每一确定状态时的数据对象所应满足的约束条件,它是反映数据库状态合理性的约束,这是最重要的一类完整性约束 。
动态约束是指数据库从一种状态转变为另一种状态时,新,旧值之间所应满足的约束条件,它是反映数据库状态变迁的约束 。
1,静态列级约束静态列级约束是对一个列的取值域的说明,包括:
对数据类型的约束;
对数据格式的约束;
对取值范围或取值集合的约束
对空值的约束
其他约束
2,静态元组约束静态元组约束就是规定元组的各个列之间的约束关系 。
3,静态关系约束在一个关系的各个元组之间或者若干关系之间存在的约束 。 常见的静态关系约束有:
实体完整性约束
参照完整性约束
函数依赖约束
统计约束
4,动态列级约束动态列级约束是修改列定义或列值时应满足的约束条件,包括:
修改列定义时的约束
修改列值时的约束
5,动态元组约束动态元组约束是指修改元组的值时元组中各个字段需要满足某种约束条件 。
6,动态关系约束动态关系约束是加在关系变化前后状态上的限制条件 。
完整性约束条件:
列级 元组级 关系级静态列定义类型格式值域空值元组值应满足的条件实体完整性约束参照完整性约束函数依赖约束统计约束动态 改变列定义或列值元组新旧值之间应满足的约束条件关系新旧状态间应满足的约束条件二,完整性控制
DBMS的完整性控制机制应具有三个方面的功能:
定义功能,提供定义完整性约束条件的机制 。
检查功能,检查用户发出操作请求是否违背了完整性约束条件 。
如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性 。
1、立即执行约束:
在一个事务中的每一条更新语句执行完后马上进行完整性检查,称为立即执行约束。
2、延迟执行约束:
在一个事务中的每一条更新语句执行完后马上进行完整性检查,要等到整个事务执行结束后再进行完整性检查,检查正确方可提交,称这类约束为延迟执行约束。
三、实现参照完整性的几个问题被参照的关系如 S,C;而参照的关系为 SC。
1,外码能否接受空值问题
2,在被参照关系 S,C中删除元组一般地,当删除被参照关系 S,C的某个元组,而参照关系存在若干元组,其外码值与被参照关系删除元组的主码值相同。
采用的策略:
级联删除将参照关系中所有外码值与被参照关系中要删除元组码值相同的元组一起删除 。
受限删除仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,
系统才执行删除操作,否则拒绝此删除操作 。
置空值删除删除被参照关系的元组,并将参照关系中相应元组的外码值置空值 。
3,在参照关系 SC中插入元组一般地,当参照关系 SC插入某个元组,
而被参照关系 S或 C不存在相应的元组,
其主码值与参照关系 SC插入元组外码值相同 。
采用的策略:
受限插入仅当被参照关系 S或 C中存在相应的元组,
其主码值与参照关系 SC插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作 。
递归插入首先向被参照关系 S或 C中插入相应的元组,
其主码值等于参照关系 SC插入元组的外码值,然后向参照关系 SC插入元组 。
4,修改关系中主码
不允许修改主码有些 RDBMS,不允许修改关系的主码 。
如果需要修改主码值,只能删除该元组,
然后再把具有新主码值的元组插入到关系中 。
允许修改主码有些 RDBMS,允许修改关系主码,但必须保证主码的唯一性和非空,否则拒绝修改 。
当 修改被参照关系 S或 C时,必须检查参照关系 SC,是否存在其外码值等于被参照关系
S或 C中被修改元组的码值的元组;这时与在被参照关系中删除元组时情况类似,可以有:
级联修改,拒绝修改,置空值修改 三种策略加以选择 。
当 修改参照关系 SC时,必须检查被参照关系 S或 C,是否存在这样的元组,其主码值等于参照关系 SC要修改的外码值 。 这时与在参照关系中插入元组时情况类似,可以有,受限修改,递归修改 两种策略加以选择 。
§ 5.3 数据库 并发控制一、并发问题
1、丢失修改 (Lost Update)
2、不可重复读 (Non-Repeatable Read)
3、读,脏,数据 (Dirty Read)
二,并发问题的解决
1、封锁机制
封锁 (Locking)
封锁协议 (Locking Protocol)
利用封锁机制解决并发问题
2、死锁问题
活锁
死锁
3、死锁的预防
一次封锁法
顺序封锁法
4、死锁的诊断与解除
超时法
等待图法
5、两段锁协议
§ 5.4 数据库恢复技术计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意破坏仍是不可避免的,这些故障影响数据库中数据的正确性,破坏数据库,因此数据库管理系统必须具有把数据库从错误状态恢复到某一已知的正确状态,这就是数据库的恢复。
恢复子系统是数据库管理系统的一个重要组成部分,占整个系统代码的百分之十以上。
一,事务的基本概念
1,事务
所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,
是一个不可分割的工作单位 。
事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元 。
一个程序中可以包含多个事务
事务的开始与结束可以由用户显式控制在 SQL语言中,定义事务的语句有三条:
BEGIN TRANSACTION
COMMIT
ROLLBACK
2,事务的特性原子性,一致性,隔离性,持续性
原子性事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做 。
一致性事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态 。
隔离性一个事务的执行不能被其他事务干扰 。
持续性事务一旦提交,它对数据库中数据的改变就应该是永久性的 。
事务 ACID特性可能遭到破坏的因素有:
多个事务并行运行时,不同事务的操作交叉执行
事务在运行过程中被强行停止二,故障的种类
1,事务内部的故障事务故障意味着事务没有达到预期的终点,数据库可能处于不正确状态。
2,系统故障系统故障称为软故障,是指造成系统停止运转的任何事件,使得系统要重新启动。例如,硬件错误、操作系统故障、
DBMS代码错误、突然停电等。这类故障影响正在运行的所有事务,但不破坏数据库。这时数据库缓冲区中的内容都被丢失,所有运行事务都非正常终止。
3,介质故障介质故障称为硬故障,指外存故障,
如磁盘损坏,磁头碰撞,瞬时强磁场干扰等 。 这类故障将破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务 。
4,计算机病毒三、数据转储
DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程,称为数据转储 。
转储 的数据文本称为后备副本或后援副本 。
转储可分为静态转储和动态转储
转储可分为海量转储和增量转储
静态转储:在系统中无事务运行时进行的转储操作 。 而转储期间不允许对数据库的任何存取,修改活动 。 静态转储得到的一定是一个数据一致性的副本 。
动态转储:在转储期间允许对数据库进行修改或存取 。 即转储和用户事务可以并发执行 。
海量转储:每次转储数据库的全部数据
增量转储:每次只转储上一次转储后更新过的数据 。
四,日志文件
1,日志文件用来记录事务对数据库的更新操作的文件
2,日志文件的两种格式
以记录为单位的日志文件
以数据块为单位的日志文件
3、日志文件的内容以记录为单位的日志文件内容:
各个事务的开始标记
各个事务的结束标记
各个事务的所有更新操作以数据块为单位的日志文件内容:
事务标识
被更新的数据块每个日志记录的内容:
事务标识 (指明是哪个事务 )
操作的类型 (插入,修改,删除 )
操作对象 (记录内部标识 )
更新前数据的旧值 (对插入操作而言,
此项为空 )
更新后数据的新值 (对删除操作而言,
此项为空 )
4,日志文件的作用
性能监督与安全监督
故障恢复必须用日志文件在动态转储方式中必须建立日志文件,后援副本和日志文件综合起来才能有地恢复数据库 。
5,登记日志文件登记日志文件时必须遵循两条原则:
登记的次序严格按并发事务执行的时间次序
必须先写日专文件,后写数据库五,恢复的策略恢复机制涉及的两个关键问题是:
如何建立冗余数据
如何利用冗余数据实施数据库恢复
1,事务故障的恢复事务故障的恢复由系统自动完成,恢复步骤如下:
反向扫描文件日志,查找该事务的更新操作 。
对该事务的更新操作执行逆操作 。 即将日志记录中,更新前的值,写入数据库 。
重复上述步骤,直至读到此事务的开始标记为止 。
2,系统故障的恢复系统故障的恢复是由系统在重新启动是自动完成的,不需要用户干预,恢复步骤如下:
正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做 (REDO)
队列 。 同时找出故障发生时尚未完成的事务,
将其事务标识记入撤销 (UNDO)队列 。
对撤消 (UNDO)队列中的各个事务进行撤销处理
对重做 (REDO)队列中的各个事务进行重做处理
3,介质故障的恢复发生介质故障后的恢复方法是重装数据库和日志文件,然后重做已完成的事务 。
具体步骤如下:
装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态 。
装入相应的日志文件副本,重做已完成的事务 。
§ 5.5 数据库 镜像数据库镜像:根据 DBA的要求,自动把整个数据库或其中的关键数据复制到另一个磁盘上 。
主数据库更新时,DBMS自动把更新后的数据复制过去,即 DBMS自动保证镜像数据与主数据的一致性 。
出现介质故障时,可由镜像磁盘继续提供使用,同时 DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本 。
数据库镜像可用于并发操作 。
频繁地复制数据自然会降低系统运行效率,往往只选择对关键数据和日志文件镜像,而且不是对整个数据库进行镜像 。