完整性和安全性
- 数据库完整性是指数据库的正确性、有效性和相容性,防止错误数据进入数据库。
- 数据库安全性是指保护数据库,防止不合法的引用,以免数据的泄密、更改或破坏。
安全性和完整性常常混淆。安全性是指保护数据以防止非法用户故意造成破坏;完整性是保护数据以防止合法用户无意中造成破坏。
完整性约束
SQL中把完整性约束分为三大类:域约束、基本表约束和断言。
域约束
可以用“CREATE DOMAIN” 语句定义新的域,并且还可以出现CHECK子句。
定义一个新的域COLOR,可以用下列语句实现:
CREATE DOMAIN COLOR CHAR(6) DEFAULT '???'
CONSTRAINT VALID_COLORS
CHECK( VALUE IN
( 'Red','Yellow','Blue','Green','???'));
此处第二行表示为这个域约束起一个名字VALID_COLORS。假定有一张表:
CREATE TABLE PART
( ...,
COLOR COLOR,
...);
如果用户插入一个元组时未提交颜色的值,默认为‘???’。如果用户输入了非法值,则操作失败,系统将产生一个约束名为VALID_COLORS的诊断信息。
基本表约束
SQL的基本表约束主要有三种形式:候选键定义、外键定义和“检查约束”定义。这些定义都可以在前面加“CONSTRAINT<约束名>“,由此为新约束起一个名字。为简化下面都省略这一选项。
1、候选键定义
候选键的定义形式为:
UNIQUE (<列名序列>)
或
PRIMARY (<列名序列>)
- UNIQUE定义表的候选键,但只表示值是唯一的,值非空还需要在列定义时带有选项NOT NULL。
- PRIMARY 方式定义表的主键,一个基本表只能指定一个主键。当是主键时会被自动认为是非空的。
2、外键定义
外键的定义形式为:
FOREIGN KEY (<列名序列>)
REFERENCES <参照表> [(<列名序列>)]
[ON DELETE<参照动作>]
[ON UPDATE<参照动作>]
第一行的列名序列是外键,第二行的列名序列是参照表中的主键或候选键。参照动作有五种方式:
- NO ACTION方式:对依赖表没有影响。
- CASCADE方式:参照表中要删除/修改主键值,将依赖表中对应的外键值也删除/修改。
- RESTRICT方式:依赖表没有一个外键值和参照表主键值对应,系统才能执行删除/修改操作。
- SET NULL方式:删除/修改参照表中元组时,将依赖表中相关外键值设为空值。
- SET DEFAULT方式:与上述方法类似,设置为预先设置好的默认值。
3、”检查约束“定义
这种约束是对单个关系的元组值加以约束。方法是在关系定义中任何需要的地方加上关键字CHECK和约束的条件:
CHECK (<条件表达式>)
比如在教学数据库中,要求学生关系中存储的学生信息满足:男同学年龄在15~35之间,女同学年龄在15~30之间:
CHECK (AGE >= 15 AND ((SEX = 'M' AND AGE <= 35)
OR (SEX = 'F' AND AGE <= '30')));
断言
断言的定义如下:
CREATE ASSERTION <断言名> CHECK (<条件>)
撤销断言的方法如下:
DROP ASSERTION <断言名>
例如:每门课最多50名学生选修:
CREATE ASSERTION ASSE3 CHECK
( 50>= (SELLECT COUNT (SC.S#)
FROM S,SC
WHERE S.S#=SC.S# AND SEX='M'
GROUP BY C#));