关系数据库标准语言SQL
SQL概述
引入:自SQL成为国际标准语言后,各厂家纷纷推出自己的SQL软件,使得大多数数据库均用SQL作为共同的数据存取语言和标准接口,使得不同数据库系统之间的互操作有了共同的基础。目前没有一个数据库系统能支持SQL标准的所有概念和特性,同时各厂商又在SQL标准下不同程度拓展。 SQL特点: ①综合统一,包括DDL,DML,DCL于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动。 ②高度非过程化,只提出“做什么”,不关心“怎么做”,提高数据独立性。 ③面向集合的操作方式,操作对象、结果都是元组集合。 ④嵌入式语言,SQL可以作为嵌入式语言,在高级语言程序中使用,语法结构保持一致,提供了灵活性、便捷性。 ⑤语言简单易学,SQL功能强大但只需9个动词即可实现。
数据定义
模式的定义、删除
模式定义:CREATE SCHEMA [<模式名>] AUTHORIZATION <用户名>;
或者在定义时,进一步创建基本表、视图、授权,CREATE SCHEME [<模式名>] AUTHORIZATION <用户名> [<表定义字句> | <视图定义子句> | <授权定义子句>];
创建了模式就创建了一个数据库的命名空间,可以在该框架内定义其他数据对象。 模式删除:DROP SCHEMA <模式名> <CASCADE | RESTRICT> ;
级联删除或者拒绝存在下级对象(表、视图、索引)时删除。
CREATE SCHEMA TEST AUTHORIZATION HUANG
CREATE TABLE TABLE1 ( COL1 INT ,
COL2 CHAR ( 20 ) ) ;
DROP SCHEMA TEST CASCADE ; 级联删除了TABLE1。
基本表的定义、删除、修改
基本表定义:CREATE TABLE <表名> (<列名> <数据类型> [列级完整性约束条件] [,<列名><数据类型>[列级完整性约束条件]] ... [,<表级完整性约束条件>]);
基本表删除:DROP TABLEN <表名> [RESTRICT | CASCADE];
限制为欲删除的基本表不能被其他表的约束所引用(check, foreign key等约束),不能有视图、触发器、存储过程或函数。 基本表修改:ALTER TABLE <表名> [ADD [COLUMN] <新列名><数据类型> [完整性约束]] [ADD <表级完整性约束>] [DROP [COLUMN] <列名> [CASCADE | RESTRICT]] [ALTER COLUMN <列名> <数据类型>] ;
同时支持增加列、约束,删除列、约束,修改列等
CRATE TABLE Student CREATE TABLE Course
( Sno char ( 9 ) primary key , ( Cno char ( 4 ) primary key ,
Sname char ( 20 ) unique , Cname char ( 40 ) not null ,
Ssex char ( 2 ) , Cpno char ( 4 ) ,
Sage smallint , foreign key ( Cpno) prefrences Course( Cno)
Sdept char ( 20 ) ) ; 说明参考表和被参考表可以是同一张表。
) ;
索引的定义、删除
索引:当表的数据量很大时,查询操作会比较耗时,建立索引可以加快查询速度。 索引方式:顺序文件的索引、B+树索引、hash索引、位图索引 索引的定义:CREATE [UNIQUE][CLUSTER] INDEX <索引名> ON <表名> (<列名> [<次序>] [,<列名> [<次序>] ]...);
在基本表上建立优先级索引。 索引的删除:DROP INDEX <索引名>;
索引名的修改:ALTER INDEX <旧索引名> RENAME TO <新索引名>;
CREATE UNIQUE INDEX Stusno ON Student( SNO) ; 按学号升序建立唯一索引。
CREATE UNIQUE INDEX SCno ON SC( Sno ASC , Cno DESC ) ; 按学号升序和课程号降序建立唯一索引。
ALTER INDEX SCno RENAME TO SCSno;
DROP INDEX SCSno;
数据字典
定义:是关系数据库管理系统内部的一组系统表, 它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。系统执行SQL的数据定义语句时,实际上就是对数据字典进行更新。
数据查询
一般格式:SELECT [ALL | DISTINCT] <目标列表达式> FROM <表名或视图名> [WHERE <条件表达式>] [GROUP BY <列名1> [HAVING <条件表达式>]] [ORDER BY <列名2> [ASC | DESC]] ;
即根据where子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表。如果有GROUP BY子句,则将结果进行分组,如果还有HAVING 子句则只有满足指定条件的组才会输出。如果还有ORDER BY子句,则进行相应排序。 目标列表达式:可以是表中的属性列、算术表达式、字符串常量、函数等
单表查询
特点:只涉及单个表的查询。 选择表中的若干列: 指定列、全部列、计算表达式列
SELECT Sname, 'Year of Birth:' , 2014 - Sage, LOWER( Sdept) FROM Student;
SELECT Sname NAME, 'Year of Birth:' BIRTH, 2014 - Sage BIRTHDAY LOWER( Sdept) DEPARTMENT FROM Student; 带别名形式、字符串、函数
选择表中的若干元组:
消除重复的元组:使用DISTINCT消除投影后可能存在的重复行,。SELECT DISTINCT Sno FROM SC;
查询满足条件的元组:使用WHERE 的条件表达式实现,常见的查询条件为下图所示。 通配符:a%b 表示以a开头b结尾的任意长字符串。 a_b 表示单个字符。 转义字符:‘\’表示单个字符的转义,如果用户查找的字符串本身含有通配符时,额外追加 ESCAPE ‘<转义字符>’
比较:SELECT Sname, Sage FROM Student WHERE Sage < 20 ;
确定范围内: SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23 ;
确定集合:SELECT Sname, Ssex FROM Student WHERE Sdept IN ( 'CS' , 'MA' , 'IS' ) ;
字符匹配:SELECT Sname, Sno FROM Student WHERE Sname NOT LIKE '黄%' ;
SELECT Cno FROM Course WHERE Cname LIKE 'DB\_Deisgn' ESCAPE '\'; 课程名为DB_Design,使得_不再表示通配符,而是普通字符。
空值查询:SELECT Sno,Cno FROM SC WHERE Grade IS NULL; 不能用等号,表示分数为空值。
多重条件:SELECT Sname FROM Student WHERE Sdept =' CS' AND Sage < 20 ;
ORDER BY 排序:默认为升序,对于空值,排序时由具体系统决定。 SELECE * FROM Student ORDER BY Sdept,Grade DESC;按所在系的系号升序排列,再按成绩降序排列
聚集函数:方便用户,增强检索功能,SQL提供了许多聚集函数。默认为ALL表示不去重。WHERE条件表达式不能为聚集函数,只能用于 SELECT 子句和 GROUP BY 中的 HAVING 子句。 对于空值,除了COUNT(*)不可以跳过计算,其他的全都跳过空值。
查询学生总人数:SELECT COUNT ( * ) FROM Student;
查询选修了课程的学生人数:SELECT COUNT ( DISCINCT Sno) FROM SC; 从关系SC中对不重复的Sno元组计数。
查询学生201215012 选修课程的总学分数:SELECT SUM ( Credit) FROM SC, Course WHERE Sno = '201215012' AND SC. Cno = Course. Cno;
GROUP BY 分组:将查询结果按照某一列或多列的值分组,值相等的为一组。分组后再使用聚集函数将会作用在各个组内,每个组都将由一个函数值。 如果分组后还要对组进行筛选,输出只满足条件的组,继续使用HAVING短语指定筛选条件。
求各个课程号及对应的选课人数:SELECT Cno, COUNT ( Sno) FROM SC GROUP BY Cno; 首先将按照Cno的值分组,Cno值相等的为一组,然后对每组使用COUNT聚集函数计算,求得改组的学生人数。
查询选修了三门以上课程的学生学号: SELECT Sno FROM SC GROUP BY Sno HAVING COUNT ( * ) > 3 ;
WHERE与HAVING 区别:作用对象不同,WHERE为基本表或视图;HAVING 为组。
连接查询
定义:当一个查询同时涉及两个以上表,则称为连接查询,包括等值连接查询、自然连接、非等值连接、自身连接、外连接查询和复合条件查询等。 连接条件:各连接字段必须是可比的。 等值与非等值连接查询:
一般格式: [表名1.] <列名1><比较运算符>[表名2.]<列名2>
或者[表名1.]<列名1> BETWEEN [表名2.] <列名2> AND [表名2.]<列名3>
等值连接:当比较运算符为 ‘=’时,称为等值连接。
查询每个学生及其选修课程的情况:
SELECT Student. * , SC. * FROM Student, SC WHERE Student. Sno = SC. Sno;
查询选修2 号课程且成绩再90 分以上的所有学生的学号和姓名:(优化—先选择再连接,减少连接的数据量!!!)
SELECT Student. Sno Sname FROM Student SC where Student. Sno = SC. Sno AND SC. Cno = '2' AND SC. GRADE > 90 ;
自身连接:一个表与自己进行连接,为此需要为表取别名。
计算先修课的先修课:SELECT FIRST . Cno, SECOND . Cpno
FROM Course FIRST , Course SECOND
WHERE FIRST . Cpno = SECOND . Cno;
外连接:连接时保留不匹配的悬浮元组。 多表连接:两个以上表的连接。SELECT Student,Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno =SC.Sno AND SC.Cno = Couse.CNO;
嵌套查询
定义:在SQL语句中一个SELECT-FROM-WHERE
语句称为一个查询块,将一个查询块嵌套进入另一个查询块的WHERE子句或HAVING 短语的条件中的查询。 注意:内层查询中的SELECT语句不能使用ORDER BY 子句,ORDER BY 子句只能用于最终查询结果分组排序。
带有IN谓词的子查询:在嵌套查询中,子查询的结果往往是集合, 使用IN可以进一步选择。SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN ( SELECT Sdept FROM Student WHERE Sname = '黄星');
带有比较运算符的子查询:在嵌套查询中,子查询的结果是单个值时, 可以进行比较运算。 带由ANY (SOME)或ALL 谓词的子查询:子查询的结果为多个值时,使用ANY或ALL,同时必须再使用比较运算符。 ANY表示任意一个,ALL表示全部。 带有EXISTS谓词的子查询:带有EXIST谓词的子查询不返回任何数据,只产生逻辑真、假值。
集合查询
定义:SELECT语句的查询结果时元组的集合,多个SELECT语句的结果可进行集合操作。 操作:并(union),交(intersection),差(except),注意:各集合的列数和对应项的数据类型必须相同。
基于派生表的查询
子查询不仅可以出现在WHERE子句中,也可以出现在FROM子句中。在FROM子句中的叫临时派生表,必须指定别名!
找出每个学生超过他自己选修课程平均成绩的课程号:
SELECT Sno, Cno
FROM SC, ( SELECT Sno, Avg ( Grade) FROM SC GROUP BY Sno) AS Avg_sc( avg_sno, avg_grade)
WHERE SC. Sno = Avg_sc. avg_sno AND SC. Grade >= Avg_sc. acg_grade
数据更新
插入数据
定义:SQL的INSERT有两种形式,一种是插入一个元组,另一种是插入子查询结果(一次可以多个元组)。 插入元组:INSERT INTO <表名> [(<属性列1>[,<属性列2>]...)] VALUES(<常量1> [,<常量2>]...);
注意:在定义表时的非空属性不能缺失,否则缺失默认为NULL冲突。当INTO子句没有指明任何属性列时,VALUES必须全部显式给出。字符串用单引号括起来 插入子查询结果:INSERT INTO <表名> [(<属性列1>[,<属性列2>]...) 子查询;
子查询不仅可以嵌套在SELECT、FROM派生表语句中,还可以嵌套在INSERT中,实现插入生成的批量数据。
对每一个系,求学生的平均年龄,并把结果存入数据库:
CREATE TABLE Dept_age INSERT
( Sdept CHAR ( 15 ) INTO Dept_age( Sdept, Avg_age)
Avg_age SAMLLINT) ; SELECT Sdept, AVG ( Sage)
FROM Student
GROUP BY Sdept; 插入批量数据
修改数据
定义:修改又称为更新,一般格式为UPDATE <表名> SET<列名> =<表达式> [WHERE <条件>];
修改指定表中满足WHERE子句条件的元组。如果省略WHERE,则表示修改全部元组。 修改单个元组的值 修改多个元组的值 带子查询的修改语句 :子查询不仅可以嵌套在SELECT、FROM派生表语句中,还可以嵌套在INSERT中,实现插入生成的批量数据,甚至可以嵌套在UPDATE中用以构造修改的条件。
将计算机系全部学生成绩重置为零:
UPDATE SC
SET Grade = 0
WHERE Sno IN
( SELECT Sno
FROM Student
WHERE Sdept = 'CS' ) ;
删除数据
定义:从指定表中删除满足WHERE条件的所有元组。如果省略WHERE,则表示删除全部元组,但是表的定义仍在数据字典中。 删除单个元组的值 删除多个元组的值 带子查询的删除语句:子查询嵌套在DELETE语句中,用以构造执行删除的条件。
删除计算机系所有学生的选课记录:
DELETE
FROM SC
WHERE Sno IN
( SELETE Sno
FROM Student
WHERE Sdept = 'cs' ) ;
空值的处理
意义:NULL表示“暂时不知道”,“不存在”,“无意义”的值。 空值的产生:插入时设置为空;更新为空;外连接时为空;空值的关系运算。 空值的判断:使用IS NULL 或者IS NOT NULL
来判断一个属性的值是否为空值。 空值的约束条件:①属性定义为NOT NULL的不能为空 ②设置为UNIQUE的不能为空 ③码属性不能为空 空值的运算:
NULL与其他值的算数运算仍为NULL; 与其他值比较的比较运算为UNKNOWN
视图
定义:视图是从一个或几个基本表(或视图)中导出的表。它是虚表,只有视图的定义,不会实际存放数据,数据仍存放在原来的基本表中。
定义视图
一般格式:CREATE VIEW <视图名>[(<列名>[,<列名>]...)] AS <子查询> [WITH CHECK OPTION];
特点:
其中子查询可以是任意的SELECT语句。 WITH CHECK OPTION 表示对视图进行数据操作时要保证操作的元组满足视图定义的谓词条件(即子查询中的条件表达式) 视图可以建立在单个基本表上,也可以建立在多个基本表上。 注意:组成视图的属性列要么全部省略,要么全部指定,没有其他选择!定义语句中实际只在数据字典中添加视图定义,并没有执行SELECT语句。
CREATE VIEW IS_Student CREATE VIEW IS_S1( Sno, Sname, Sage) 全部指定
AS AS
SELECT Sno, Sname, Sage SELECT Student. Sno, Sname, Grade
FROM Student FROM Student, SC
WHERE Sdept = 'cs' WHERE Sdept= 'IS' AND
WITH CHECK OPTION ; Student. Sno = SC. Sno
表示以后对该视图操作限制在CS系内部。 SC. Cno = '1' ;
删除视图
一般格式:DROP VIEW <视图名> [CASCADE];
注意:删除视图,会直接删除在数据字典中的定义。基本表删除后,该基本表导出的视图不能使用,但是视图的定义此时仍在数据字典中。所以删除视图只能显式使用DROP语句。
查询视图
定义:视图定义后,就可以像基本表一样对视图进行查询。 视图与派生表的区别:视图一旦定义就永久存在数据字典中;但是派生表只在FROM语句临时定义,执行完后该派生表定义就会被删除。
更新视图
操作:插入、删除、更新 注意:视图是虚表,对视图的最终操作要转换为对基本表的更新。
视图的作用
简化用户的操作:是用户只关心自己关注地数据部分 使用户能以多角度看待同一数据:满足不同类型用户对同一数据地共享 对重构数据库提供了一定的逻辑独立性 对机密数据提高安全保护:对不同用户定义不同的视图,使机密数据不落到其他用户手中。 更清晰地表达查询:对于经常执行固定操作的需求,可以先定义一个视图,再进行操作。
数据库安全性
数据库安全性概述
定义:数据库的数据保护包括数据的安全性和完整性。数据库的安全性是指保护数据库防止不合法使用所造成的数据泄露、更改或破坏。
数据库的不安全因素
非授权用户的攻击 数据库中重要数据遭泄露 环境的脆弱性
安全标准
TCSEC(Trusted Computer System Evalution Criteria):可信计算机系统评估准则,1985年美国国防部发布的计算机以及信息安全技术方面的安全评估标准,TCSEC又被称为橘皮书。 CC:为了满足全球IT市场安全评估标准的互认化,各个安全评估组织联合行动,将各个独立准则集合成通用的IT安全准则,被称为通用准则(CC)项目。 TCSEC/TDI:可信计算机系统评估准则关于可信数据库系统的解释,将TCESC扩展到数据库管理系统中,定义了DBMS的设计与实现中需要满足的安全评估标准,又被称为紫皮书。 紫皮书安全级别划分:
D级:最低级别, 如DOS操作系统,只提供基本的服务功能但是在安全性上没有专门的保障机制。 C1级:只提供自主安全保护, 能够实现对用户和数据的分离,进行自主存取控制(DAC),保护或限制用户权限的传播 C2级:是安全产品的最低标准, 提供受控的存取保护,即将C1级的DAC细化为以个人身份负责并实施审计和资源隔离。如操作系统中的Windows 2000. B1级:对系统的数据进行标记,并对标记的主体和客体实施强制存取控制(MAC)以及审计等安全机制。真正意义上的安全产品。 B2级:建立形式化的安全策略模型,对系统内的所有主体和客体实施DAC和MAC。 B3级:该级的TCB(Trusted Computing Base)必须满足访问监视器的要求,审计跟踪能力更强,提供系统恢复过程。 A1级:提供B3级保护的同时给出系统的形式化设计说明和验证。
数据库安全性控制
安全控制模型示意图:
用户身份鉴别
定义:最外层的安全保护措施,每个用户在系统中都有唯一的用户标识。用户标识由用户名(user name)和用户标识号(UID)组成,UID在系统的整个生命周期内是唯一的。 系统鉴别:是指系统提供方式让用户标识自己的身份,由系统进行核对。 用户身份鉴别的方法:常常组合加强安全
静态口令:静态口令由用户自己设定,只要口令正确就允许访问,口令是静态不变的;容易被破解,安全性较低;在存储和传输过程中口令信息以密文方式不可见;口令可重复使用。 注:口令长度、口令符号要求、重复口令的最小时间间隔。 动态口令:口令动态变化,每次鉴别均需要用动态产生的新口令,一次一密;注:短信验证码、QQ动态安全令牌。 生物特征:指生物体唯一具有的、可测量、识别和验证的稳定生物特征; 常借助图像处理和模式识别。注:指纹、虹膜和掌纹等。 智能卡:不可复制的硬件,内置集成电路的芯片,具有硬件加密功能; 配合专用读卡器进行信息读取;但是智能卡中的数据仍是静态不变的,存在盗取风险;实际中将PIN和智能卡结合。
存取控制
存取控制子系统:定义用户权限、合法权限检查 定义用户权限:用户对某一数据对象的操作权利称为权限,用户权限的定义是管理和政策问题,不属于技术问题,用户权限定义后登记到数据字典中。 合法权限检查:当用户发出操作请求后,系统查询数据字典的安全规则。 自主存取控制DAC:C2级,用户权限可以转授给其他用户,非常灵活。 强制存取控制MAC:B1级,每个数据库对象被标以一定的密级,每个用户被授予一定级别的许可证,比较严格。
自主存取控制
SQL自主存取控制:通过GRANT和REVOKE 语句实现。 用户权限:包括数据库对象和操作类型,即用户在哪些数据库对象中可以进行哪些操作。 授权:在数据库系统中,定义存取权限称为授权。
授权:授予与收回
GRANT
一般格式:GRANT <权限> [,<权限>]...ON <对象类型> <对象名> TO <用户> [,<用户>] ... [WITH GRANT OPTION];
将对指定对象的指定操作权限赋予给指定的用户。使用WITH GRANT OPTION 可以把这种权限再授予给其他用户,但不能循环授权。否则,不能传播权限。
把对Student和Course的全部操作权限授予所有用户: 把查询Student和修改学生学号的权限授给用户U4,且可以传播权限。
GRANT ALL PRIVILEGES GRANT UPDATE ( Sno) , SELECT
ON TABLE Student, Course ON TABLE Student
TO PUBLIC ; TO U4
WITH GRANT OPTION ;
REVOKE
一般格式:REVOKE <权限> [,<权限>]... ON <对象类型> <对象名> [,<对象类型> <对象名>]... FROM <用户> [,<用户>]... [CASCADE | RESTRICT];
收回所有用户对表SC的查询权限: 把用户U5对SC表的INSERT 权限收回,同时级联删除了其向下赋予其他对象的INSERT 权限
REVOKE SELECT REVOKE INSERT
ON TABLE SC TABLE SC
FROM PUBLIC ; FROM U5 CASCADE ;
强制存取控制
引入:使用自主存取控制可以很方便的“自主”授权,在这种授权机制下,数据可能会“无意泄露”,因为仅仅是存取权限控制,而数据本身没有安全性标记。 强制存取控制:系统对全部主客体 实施强制存取控制策略,适用于那些对数据有严格而固定密级分类的部分,如:军事部分或政府部门。 主体:是系统中的活动实体,包括实际用户、应用进程 客体:是系统中的被动实体,受主体操纵的,包括文件、基本表、索引、视图等。 敏感度标记:对于主体和客体,DBMS为它们每个实例指派一个敏感度标记,分为绝密、机密、可信、公开等。TS>=S>=C>=P 存取规则:①当用户主体以标记label注册时,当主体的许可证级别大于或等于客体的密级时,主体才能读取客体。 ②当主体的许可证级别小于或等于该客体的密级时,才能写入相应的客体。
视图机制
作用:为不同的用户定义不同的视图,把数据对象限制在一定的范围内,提供一定程度的安全保护。
审计
审计功能:把用户对数据库的所有操作自动记录下来放入审计日志(auditlog)中。审计员可以利用审计日志监控数据库中的各种行为,重现数据库信息,找出非法存取数据的人、时间和内容等。 注意:审计通常是浪费时间和空间的,所以一般来说是可选择的。 审计事件:
服务器事件:服务器的启动、停止、配置文件的加载 系统权限: 审计对系统拥有的结构或模式对象进行操作的审计 语句事件:对SQL语句的审计 模式对象事件:对特定模式上进行的SELECT或DML操作的审计 AUDIT、NOAUDIT:打开审计、关闭审计
对修改SC表结构或修改SC表数据的操作进行审计 取消对SC表的一切审计
AUDIT ALTER,UPDATE NOAUDIT ALTER,UPDATE
ON SC; ON SC;
数据加密
机密基本思想:根据加密算法 将原始数据——明文(plain text) 变换为不可直接识别的格式——密文(cipher text) ,从而使得不知道解密算法 的人无法获知数据的内容。 数据加密:包括存储加密、传输加密
存储加密:提供透明和非透明两种加密方式,透明加密是内核级机密保护,非透明加密是通过加密函数实现的。 传输加密:在C/S结构中,数据在网络中传输进行加密。如:对报文、报头均加密 安全套接字协议SSL:
数据库完整性
实体完整性
定义实体完整性
定义:在关系模型中的实体完整性定义在CREATE TABLE 中用PRIMARY KEY定义。单属性码可以用列级定义、表级定义;多属性码只能表级定义。 示例:
单属性码: 多属性码:
CREATE TEABLE Student CREATE TABLE SC
( Sno CHAR ( 9 ) PRIMARY KEY , 列级定义 ( Sno CHAR ( 9 ) NOT NULL ,
Sname CHAR ( 20 ) NOT NULL ) ; Cno CHAR ( 4 ) NOT NULL ,
Grade SMALLINT
PRIMARY KEY ( Sno, Cno) ; 只能表级定义
实体完整性检查和违约处理
当更新或插入一条元组时,需要检查主码值是否唯一,如果不唯一则拒绝插入或更新。 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
参照完整性
定义参照完整性
定义:使用CREATE TABLE语句中的FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码所参照的表的主码。 示例:
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( Con) 在表级定义参照完整性
) ;
参照完整性检查和违约处理
规则 :
用户自定义完整性
属性上的约束
定义:在CRETE TABLE时,对属性值限制,包括列值非空、列值唯一、用CHECK短语指定列值应该满足的条件 属性上的约束条件的检查和违约处理:违约时,拒绝执行
元组上的约束
定义:在CRETE TABLE时,使用CHECK短语定义元组上的约束条件。 元组上的约束条件的检查和违约处理:当插入或修改时,约束条件不满足则拒绝执行。 示例:
当学生的性别是男时,其名字不能以Ms. 开头:
CREATE TABLE Student
( Sno CHAR ( 9 ) ,
Sname CHAR ( 8 ) NOT NULL ,
Ssex CHAR ( 2 ) ,
Sage SMALLINT ,
Sdept CHAR ( 2 ) ,
PRIMARY KEY ( Sno) ,
CHECK ( Ssex = '女' OR Sname NOT LIKE 'MS.%' )
) ;
性别检查:当为女性时,CHECK 为真;当为男性时,当且仅当名字不为“MS. ”开头时为真。
断言
作用:在SQL中可以使用树定义语言中的CREATE ASSERTION 语句,通过申明性断言来指定更一般性的约束。 注意:断言创建以后,任何对断言中所涉及关系的操作都会触发DBMS对断言的检查,任何使断言不为真值的操作都会被拒绝执行。 一般格式: CREATE ASSERTION <断言名> <CHECK子句>;
每个断言都被赋予一个名字。 删除断言:DROP ASSERTION <断言名>;
限制数据库课程最所60 名学生选修:
CREATE ASSERTION ASSE_SC_DB_NUM
CHECK ( 60 >= ( SELECT count ( * )
FROM Course, SC
WHERE SC. CNO = COURSE. CNO AND COURSE. CNAME= '数据库' )
) ;
每当在SC表中插入一条元组时,ASSE_SC_DB_NUM断言会被触发检查。
如果选课人数已经超过60 人,则CHECK 返回值为“假”,对SC表的操作拒绝执行。
触发器
引入:触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。 一旦定义,触发器将被保存在数据库服务器中。任何用户对表的增、删、改操作均有服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。
定义触发器
触发器:又叫事件-条件-动作规则。当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作。动作体可以很复杂,通常是一段SQL存储过程。 一般格式: 语法说明: ①只有基本表的拥有者才能在表上创建触发器,并且一张表上触发器的数量有限制。 ②同一模式下,触发器名必须是唯一的,并且触发器名和表名在同一模式下。 ③触发器只能定义在基本表上。当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器。 ④触发事件可以是INSERT、DELETE、UPDATE,也可以是几个事件的集合。AFTER/BEFORE指明了触发器的触发时间。 ⑤按照触发动作的间隔尺寸可以分为行级触发器和语句级触发器 ⑥触发器被激活时,只有当触发器条件为真时触发动作体才执行。如果省略WHEN条件,则触发动作体立即执行。 ⑦可以是一个SQL块,也可以是对已创建存储过程的调用。
激活触发器
触发器:是由触发事件激活,并由数据库服务器自动执行的,同一个表上可能会有多个触发器,它们之间遵循一定的执行顺序。 执行顺序:
执行该表上的BEFORE触发器 激活触发器的SQL语句 执行该表上的AFTER触发器 对于同一个表上的多个BEFORE(AFTER)触发器,则按照创建时间的先后顺序执行。
当对表SC的Grade属性进行修改时,若分数增加了10 % ,则将此次操作记录到另一个表SC_U( Sno, Cno, Oldgrade, Newgrade) 中:
CREATE TRIGGER SC_T
AFTER UPDATE OF Grade ON SC
REFERENCING
OLDROW AS OldTuple
NEWROW AS NewTuple
FOR EACH ROW
WHEN ( Newtuple. Grade > 1.1 * OldTuple. Grade)
INSERT INTO SC_U ( Sno, Sname, OldGrade, NewGrade)
VALUES ( OldTuple. Sno, OldTuple. Con, OldTuple. Grade, NewTuple. Grade)
删除触发器
一般格式:DROP TRIGGER <触发器> ON <表名> ;
注意:触发器必须由具有权限的用户删除