完整和安全性
完整性约束
实体完整性约束-主码
主码不能为空
创建主码是在创建表的时候添加,可以直接在属性后面直接加主键,也可以在创建表的最后添加主键的属性。
-- 将属性直接说明成主码
Create Table employee(
Eno char(4) Primary Key,
Name varchar(8)
);
-- 在属性列表后单独说明主码
Create Table employee(
Eno char(4),
Name varchar(8),
Primary key(Eno)
);
如果主码是一个属性组,那么只能用第二个方法:Primary Key(Ino,Eno)
除了主码,sql还提供UNIQUE关键字表示该属性不能重复出现,但是UNIQUE的属性可以定义为空,主码不能为空。一个表只能有一个码,但是能有多个UNIQUE说明。
参照完整性约束和外部码
外部码约束的说明
-- 在属性后直接加上关键字references
Create table employee(
Eno char(4) Primary key
Dno char(2) references department(Dno)
);
-- 在属性清单后加上外部码说明子句属性表中的属性可以有多个,但必须前后对应
-- foreign key (<属性表>) references <父表名>(<属性名表>)
Create table employee(
Eno char(4) Primary key
Dno char(2) ,
foreign key(Dno) references department (Dno)
);
参照完整性约束的实现策略
sql三种方案RESTRICT(限制策略),CASCADE(级联策略),SET NULL(置空策略)
-
限制策略是SQL的默认策略:任何违反参照完整性约束的更新都被系统拒绝,操作包括:
-
插入新元组,其中外部码对应的属性值非空且不是外部表对应属性的分量
-
修改表中的外部码属性,修改的属性不是外部表对应属性的分量值
-
删除外部表的元组,该元组的外部码属性已经在主表的外部码属性中存在
-
-
级联策略
但删除或修改父表中的某元组的主码值时,子表中的该有外部码元组也被删除或修改以保证参照完整性
-
置空策略
当修改或删除父表中的主码时,将删除对应的外部码元组置为空。
SQL Server仅提供CASCADE(级联策略) 和 NO ACTION (限制策略)
具体实现:直接在外键设置后面加入下列代码
- ON DELETE{CASCADE|NO ACTION}
- ON UPDATE{CASCADE|NO ACTION}
用户自定义完整性约束
基于属性的check:直接在属性后面添加CHECK(<条件>)即可
基于元组的check:在属性列表后面,添加check(<条件>)
约束更新
为了更新 需要在定义约束时对约束命名
- Eno char(4) CONSTRAINT PK_1 primary key
- Dno char(4) CONSTRAINT FK_1 foreign key references department(Dno)
- Alter Table constraint K_name 重定义
- Constraint checkName check(…)
SQL触发器
触发方式
- 对事件影响的每一行(每一元组)执行一次触发过程(for each row) 成为焊机触发器
- 对整个事件只执行一次出发过程(for each statement) 称为语句级触发器,该方法是触发器的默认方式
触发时间
- BEFORE 事件发生前
- AFTER 事件发生后
触发器可以使用两个临时视图
inserted(新增或修改后的内容),deleted(被删除或删除前的内容)
数据库安全
用户标识和鉴别
鉴别方法:口令,利用用户的个人特征,磁卡
访问控制
控制权限(创建、撤销、查询、增删改的权限)
数据库用户的种类:一般数据库用户(connect),具有创建表权力的用户(resource),具有DBA特权的用户(DBA)
DBA的注册工作
-
DBA为用户进行注册–GRANT
GRANT <特权类型> TO <用户标识符> [IDENTIFIED BY <口令>] -- 特权类型包括 CONNECT,RESOURCE,DBA GRANT RESOURCE TO WANG IDENTIFIED BY 123456
-
DBA对用户的注册–REVOKE
REVOKE <特权类型清单> FROM <用户标识符>
一般授权
授权某个用户对某数据对象进行操作的权限
GRANT <权限清单>
[on <对象类型><对象名>]
TO<用户表示清单>[with GRANT OPTION];
with grant option则获得归权限的用户不仅课以执行这些操作,还获得用grant将这个权限授权其他用户的权限
收回一般授权给出的权限–revoke
REVOKE <权限清单>
[ON <对象类型> <对象名>]
FROM <用户表示附清单>
[CASCADE]
- 只有使用GRANT授出权限的用户(及DBA)才能使用本语句收回权限
- 若有些用户把该权限授权给别人(with grant option)CASCADE 可以将间接受到此权限的用户也自动收回权限
- 本语句只收回执行此语句用户的权限,其他用户也给他了这个权限,则他们还具有该权限,但是本语句的发布者发布的权限确实收回了
角色
角色:具有相同/相似权限的一组用户
角色成员:某些用户设置成一个角色,该用户就是角色成员。
对该角色进行权限设置,该角色的小组成员,自动继承角色的权限。
角色的种类:
- 系统提供的角色
- 固定的服务器角色
- 固定的数据库角色
- 用户自定义角色
某个用户的所有权限集合包含其直接授予获得的权限,加上其所属角色所继承下来的权限,再去掉被拒绝的权限。
对用户的授权,也可以先对角色授权,再把用户加入到角色中
视图和查询修改
为不同的用户定义不同的视图,可以达到访问控制的目的。在试图中,可以之定义该用户能访问的数据,使用户无法访问他无权访问的数据,从而达到对数据的安全保护的作用。
查询修改:用户访问时,能自动生成查询条件使其只能在规定的范围内查询。