数据库保护技术(第8章)
安全管理
一、两种身份验证模式
- 仅windows模式:用户只能使用windows登录名登录SQL Server。
- 混合模式:用户可以使用windows登录名或SQL Server登录名登录 SQL Server
二、两种身份验证
用户登录到SQL Server时,必须使用特定的登录名和密码标识自己。
Windows身份验证:用户登录到SQL Server时,使用操作系统当前的登录名和密码。
SQL Server身份验证:用户登录到SQL Server时,必须显式提供登录名和密码。
常用安全性控制方法:用户标识和控制、存取控制、视图、审计、数据加密。
数据库完整性
一、在创建时指定约束
- 主键约束
[constraint 约束名]
Primary key [Clustered/Nonclustered][(属性名,·…,属性名)】
说明:
① 每个约束都有一个约束名,约束名通常由系统自动给出。
② 列级约束:只牵涉到一个属性的约束,它放在相关属性的后面,且省略属性名表。表级约束:牵涉到多个属性的约束。
③ 创建主键约束、唯一性约束时可以指定聚集(clustered)或非聚集(nonclustered)。
④ 主键约束默认为聚集的,唯一性约束默认为非聚集的。
⑤一个表最多只能创建一个约束是聚集的,聚集约束会影响数据表的记录号顺序。
2.外键约束
[constraint约束名]
Foreign key[(属性名,···,属性名)]
References 主键表名(属性名,···,属性名)
注意:两表关联的方式:
① 临时关联:where 表名1.属性名=表名2.属性名
② 永久关联:创建外键约束
3.唯一性约束
[constraint 约束名]
Unique [Clustered Nonclustered][(属性名,··,属性名)]
主键约束与唯一约束的区别:
① 在一个表中只能定义一个主键约束,但可定义多个唯一性约束:
② 指定为主键约束的字段不能取null值,但指定为唯一性约束的字段允许取null值。
4.检查约束
[constraint 约束名]
Check (条件表达式)
5.缺省约束
[constraint约束名]
Default 常量
二、删除表中的约束
alter table 表名
drop constraint 约束名…约束名
注意:alter语句后面只能跟着一个子句。
三、添加约束
alter table 表名
add constraint 约束名 约束定义…
constraint 约束名 约束定义
约束定义指:
Primary key Clustered/Nonclustered
Foreign key(属性组) references 主键表名(属性组)
Unique [Clustered/Nonclustered] (属性组)
Check(条件表达式)
Default 常量 for 属性名
默认对象
① 默认对象与默认约束的功能类似。
② 默认对象以单独的对象创建,可以绑定到数据库的所有表中。
③ 默认约束只能绑定到一个表中。
规则
规则与check约束的功能类似。
① 则以单独的对象创建,可以绑定到数据库的所有表中。
② check 约束只能绑定到一个表中。
索引
一、索引的概念:
①索引使用户能快速访问数据表的特定信息。
②索引必须依附于某个基本表,不能单独存在。
二、索引的类型
聚集索引:影响数据表的记录顺序
非聚集索引:不会影响数据表的记录顺序
注:一个表只能建立一个聚集索引,但可以建立若干个非聚集索引。
三、创建索引
1.自动创建索引:
如果在数据表的某个属性设置主键约束或唯一约束,则系统将在这些属性上自动创建唯一索引。
自动创建的索引随约束的存在而存在,随约束的消失而消失。
- 使用SQL语句创建索引
Create [unique] [clustered/nonclustered] index 索引名
On 表名(属性名[asc/desc],属性名[asc/desc])
注:① m若未指定clustered,则创建非聚集索引:
② 若未指定排序方式,则为ASC:
③ text,ntext类型的字段不能指定为索引字段。
四、删除索引
Drop index 索引名,···,索引名
思考题:创建主键时,如果使主键字段值不影响数据表的记录顺序?
视图
一、视图的特点
① 视图只有结构,没有记录,是虚表;
② 一个视图总对应着一个 select语句:
③ 对视图的查询、更新,实际上是对基本表的查询、更新。
二、定义视图
1.创建视图:
Create view视图名[(属性名,···,属性名)]
As 子查询
[with check option]
说明:视图的属性个数必须与子查询中 select子句的表达式个数相同。
2.删除视图: Drop view 视图名,···,视图名.
三、查询视图
select */表达式表
from 视图名…视图名
[where 条件]
[group by属性名]
[order by属性名][Asc/Desc]
四、操纵视图
1.向视图插入一条记录 insert into 视图名[(属性名表)] values(表达式表)
2.修改视图中的数据 update 视图名set 属性名=值,…,属性名=值[where 条件]
3.删除视图中的记录 delete from 视图名[where 条件]
存储过程
1.什么叫存储过程?
将一组SQL语句,以一个名称存储在数据库中,就形成存储过程。
- 创建存储过程
Create proc存储过程名[@形参名 类型][=常量][output]
As SQL 语句序列
说明:
① [=常量]:用于指定形参的默认值;[output]用来指定该形参值是可以返回的。
触发器
一、维护数据完整性的措施:
创建约束
创建触发器
创建规则:以单独的对象创建,可以绑定到数据库的所有表中。
事务处理与并发控制
1.什么叫事务?
① 事务是用户定义的一组操作序列。
② 事务是并发控制的基本单位。
③ 一个事务包含的诸操作要么都执行,要么都不执行。
2.事务的属性
原子性:指事务中包含的诸操作要么都执行,要么都不执行。
一致性:事务必须使数据库从一个一致性状态变到另一个一致性状态。
隔离性:一个事务的执行不能被其他事务干扰。
持久性
数据的锁定
一、并发操作与数据不一致性
1.数据不一致性包括三类
丢失修改 :指事务1与事务2从数据库中读入同一数据并修改,事务2的提交结果破坏事务1提交的结果,导致事务1的修改被丢失。
不可重复读: 指事务1读取数据后,事务2执行更新操作,使事务1无法再现前一次读取结果。
读脏数据 :指事务1修改某一数据后,事务2读取该数据,事务1由于某种原因被撤销,这时数据又恢复到原值,事务2读到的数据与数据库中的数据不一致,称为“脏”数据。
2.产生数据不一致性的原因
并发操作破坏了事务的隔离性。
二、并发控制的目标、方法
1.目标:确保DB中的数据一致性。
2.并发事务正确性的原则
几个事务的并发执行是正确的
,当且仅当其结果与任何一个串行执行的结果相同。
3.并发控制的方法
DBMS一般采用“封锁”技术,保证并发操作的可串行化。
三、封锁(Locking)
1.什么叫封锁?
SQL Server自动强制封锁,并且会将封锁粒度控制在合适的级别,用户不必考虑封锁问题。
2.封锁类型
- 排它锁(X锁) 事务T对数据A加X锁,其它事务不能再对A加锁,即其它事务不能读取和修改A。
- 共享锁(S锁):事务T对数据A加S锁,其它事务只能再对A加S锁,即其它事务只能读A,不能修改A。
3.封锁粒度
封锁对象可以是属性列、元组、关系、整个数据库。封锁对象的大小称为封锁粒度。封锁粒度越小,并发度越高,但并发控制的开销越大。
4.封锁协议
① 事务T在修改数据A之前,必须对其加X锁,直到事务结束才释放。
② 事务T在读取数据A之前,必须对其加S锁,直到事务结束才释放。
遵循封锁协议,可以解决三种数据不一致性问题: - 丢失修改
- 不可重复读
- 读“脏”数据
四、死锁和活锁
封锁技术可以解决并发操作的不一致性问题,但也带来新的问题,即死锁和活锁。
1.死锁:
① 定义:两个事务已经各自锁定一个数据,但是又要访问被对方锁定的数据,造成了循环等待,称为死锁。
② 避免死锁的方法:
顺序封锁法:若规定封锁顺序为A,B,则T1,T2只能先封锁A,再封锁B。
2.活锁:
① 定义:若多个事务请求封锁同一个数据时,其中的某个事务总处于等待状态,则称为活锁。
② 避免活锁的方法:先来先服务
事务可串行化调度:两段锁协议