笔记目录
课程链接
哈工大 数据库系统(上):模型与语言
数据库完整性概念及分类
数据库完整性
- 数据库完整性(DB Integrity)是指DBMS应保证的DB的一种特性——在任何情况下的正确性、有效性和一致性
- 关系模型的完整性要求:实体完整性、参照完整性、用户自定义完整性
- 数据库完整性管理的作用
- 防止和避免数据库中不合理数据的出现
- DBMS应尽可能地自动防止DB中语义不合理现象
- DBMS怎样自动保证完整性
- DBMS允许用户定义一些完整性约束规则(用SQL-DDL来定义)
- 当有DB更新操作时,DBMS自动按照完整性约束条件进行检查,以确保更新操作符合语义完整性
- 完整性约束条件
- I n t e g r i t y C o n s t r a i n t : : = ( O , P , A , R ) Integrity Constraint::= ( O,P,A,R) IntegrityConstraint::=(O,P,A,R)
- O:数据集合,约束的对象,如列、元组、元组集合
- P:谓词条件,即什么样的约束
- A:触发条件,即什么时候检查
- R:响应动作,即不满足时怎么办
数据库完整性分类
- 按约束对象
- 域完整性约束条件:对列的约束
- 关系完整性约束条件:对元组的约束
- 按约束来源分类
- 结构约束(来自模型的约束)
- 函数依赖约束
- 主键约束(实体完整性)
- 外键约束(参照完整性)
- 是否允许空值
- 内容约束 (来自用户的约束)
- 用户自定义完整性约束
- 元组或属性的取值范围
- 结构约束(来自模型的约束)
- 按约束状态分类
- 静态约束:要求DB在任一时候均应满足的约束
- 动态约束:要求DB从一状态变为另一状态时应满足的约束
SQL语言实现数据库的静态完整性
Create Table
- Create Table有三种功能:定义关系模式、定义完整性约束和定义物理存储特性
- Create Table语法
CREATE TABLE tablename
( ( colname datatype [ DEFAULT { default_constant | NULL} ]
[ col_constr {col_constr. . .} ]
| , table_constr
{, { colname datatype [DEFAULT { default_constant | NULL} ]
[col_constr {col_constr. . .} ]
| , table_constr }
. . . } );
- 列约束
示例:
Create Table Student
( S# char(8) not null unique,
Sname char(10),
Ssex char(2) constraint ctssex check (Ssex=‘男’ or
Ssex=‘女’),
Sage integer check (Sage>=1 and Sage<150),
D# char(2) references Dept(D#) on delete cascade,
Sclass char(6) );
- 表约束
示例:
Create Table Course
( C# char(3) ,
Cname char(12),
Chours integer,
Credit float(1) constraint ctcredit check (Credit >=0.0 and Credit<=5.0),
T# char(3) references Teacher(T#) on delete cascade,
primary key(C#),
constraint ctcc check(Chours/Credit = 20) );
- 追加或撤销约束
断言ASSERTION
- 语法:
CREATE ASSERTION <assertion-name> CHECK <predicate>
- 当一个断言创建后,系统将检测其有效性,并在每一次更新中测试更新是否违反该断言
- 断言测试增加了数据库维护的负担,要小心使用复杂的断言
- 示例:每笔贷款,要求至少一位借款者账户中存有最低数目的余额,例如1000元
create assertion balance_constraint check
(not exists (
select * from loan
where not exists (
select * from borrower, depositor, account
where loan.loan_number = borrower.loan_number
and borrower.customer_name = depositor.customer_name
and depositor.account_number = account.account_number
and account.balance >= 1000)))
SQL语言实现数据库的动态完整性
触发器Trigger
-
Trigger是一种过程完整性约束(相比之下,Create Table中定义的都是非过程性约束),是一段程序,该程序可以在特定的时刻被自动触发执行,比如在一次更新操作之前执行,或在更新操作之后执行
- 语法
- 示例:设计一个触发器当进行Teacher表更新元组时, 使其工资只能升不能降
create trigger teacher_chgsal before update of salary on teacher
referencing new x, old y
for each row when (x.salary < y.salary)
begin
raise_application_error(-20003, 'invalid salary on update');
//此条语句为Oracle的错误处理函数
end;
数据库安全性
数据库安全性的概念
-
数据库安全性:指DBMS应该保证的数据库的一种特性(机制或手段):免受非法、非授权用户的使用、泄漏、更改或破坏
- DBMS的安全机制
- 自主安全性机制:存取控制(AccessControl):通过权限在用户之间的传递,使用户自主管理数据库安全性
- 强制安全性机制:通过对数据和用户强制分类,使得不同类别用户能够访问不同类别的数据
- 推断控制机制
- 防止通过历史信息,推断出不该被其知道的信息
- 防止通过公开信息(通常是一些聚集信息)推断出私密信息(个体信息)
- 数据加密存储机制
数据库自主安全性机制
-
自主安全性机制
- 通常情况下,自主安全性是通过授权机制来实现的
- 用户在使用数据库前必须由DBA处获得一个账户,并由DBA授予该账户定的权限,该账户的用户依据其所拥有的权限对数据库进行操作; 同时,该帐户用户也可将其所拥有的权利转授给其他的用户(账户),由此实现权限在用户之间的传播和控制
-
数据库自主安全性访问规则
- DBMS将权利和用户(账户)结合在一起,形成一个访问规则表,依据该规则表可以实现对数据库的安全性控制
- 访问规则:
A
c
c
e
s
s
R
u
l
e
:
:
=
(
S
,
O
,
t
,
P
)
AccessRule ::= ( S, O, t, P)
AccessRule::=(S,O,t,P)
- S: 请求主体(用户)
- O: 访问对象,即属性/字段、记录/元组、关系、数据库
- t: 访问权利,即创建、增、删、改、查
- P: 谓词,即拥有权利需满足的条件
-
自主安全性的实现方式
- 存储矩阵
- 视图
数据库强制安全性机制
-
强制安全性通过对数据对象进行安全性分级,同时对用户也进行上述的安全性分级,从而强制实现不同级别用户访问不同级别数据的一种机制
- 访问规则
- 用户S, 不能读取数据对象O, 除非Level(S)>=Level(O)
- 用户S, 不能写数据对象, 除非Level(S)<=Level(O)(因为高级别的用户写了之后,低级别的用户就没有了访问权限)
SQL语言实现数据库自主安全性
-
数据库安全性控制是属于DCL范畴
-
SQL语句对应权限(级别高的权利自动包含级别低的权利)
- 级别1:Select : 读
- 级别2:更新
- Insert
- Update
- Delete
- 级别3:创建
- Create
- Alter
- Drop
-
SQL-DCL的命令及其应用
- 授权命令
示例 >- 收回授权命令