数据库的安全性是尽可能保证非法用户不破坏数据的正确性。
数据库的完整性是尽可能保证合法用户不破坏数据的正确性。
问题:你还记得实体完整性约束和参照完整性约束是怎么回事吗?
数据库的完整性是为了防止数据库中存在不符合语义的数据。
为此,DBMS需要完成:
- 提供定义完整性约束条件的机制
- 提供完整性检查的方法
- 违约处理
完整性分类:实体完整性、参照完整性和用户定义完整性。
约束
约束:就是一种强制性的规定。
SQL Server的六种约束:
- not null 非空约束
- check 检查约束
- unique 唯一约束
- primary key 主码约束
- foreign key 外码约束
- default 默认约束
1、建立非空约束。
alter table course
alter column credit smallint not null
其中,必须给出列的类型。
2、建立唯一约束。
alter table course
add constraint UQ_cname unique(cname)
其中:constraint关键词即对该约束进行命名,即UQ_cname是约束名。
注意:对每个约束都进行命名是个好习惯。
约束的建立:
- 在创建表的同时建立
- 在已有表上建立
注意:若表中已有数据,则建立约束时可能会失败。
check约束
default约束、删除约束
default约束:可以对列设置默认值。如对性别列默认取值为男。
1、创建表时建立default约束。
create table student
( sno char(9) primary key,
ssex char(2) constraint c_ssex_def default '男' )
2、在表中增加default约束。
alter table student add constraint c_ssex_def default '男' for ssex
问题:下列命名的执行结果是什么?
insert into student(sno,sname,ssex,sage,sdept) values('5','张飞',null,29,'cs')
insert into student(sno,sname) values('6’,'张小飞')
删除约束:alter table 表名 drop constraint 约束名
如:
alter table student drop constraint c_ssex_def
注意:表中的约束不能修改,只能删除后重建。
规则
1、规则的创建
create rule range_rule
as
@range > 0 and @range < 100
create rule list_rule
as
@list in ('男', '女', null)
create rule pattern_rule
as
@value like '_ _-%[0-9]'
2、将规则绑定到表的列
exec sp_bindrule 'range_rule', 'student.sage'
该列即受绑定规则的约束
exec sp_bindrule 'range_rule', 'sc.grade'
3、取消表列的规则绑定
exec sp_unbindrule 'student.sage'
该列解除规则约束
4、删除规则
drop rule range_rule
若该规则已被绑定,则拒绝删除。
默认值
完整性的违约处理
1、实体完整性违约处理:实体完整性是通过在表中定义主码来实现。当更新操作违反了实体完整性,则该更新操作被拒绝执行。
2、用户定义完整性违约处理:DBMS默认采用拒绝执行。
3、参照完整性违约处理
问题:
- ① 在SC表插入违反了参照完整性的数据时,你认为怎么处理合理?
- ② 将1号学生从Student表删除,若他已选课,你认为对SC表怎么处理合理?
- ③ 将1号学生的学号改为10号,你认为对SC表怎么处理合理?
- ④ 将1号课从Course表删除,若2号课的先行课为1号,则怎么做合理?
- ⑤ 将1号课编号改为10号,若2号课的先行课为1号,则怎么做合理?
参照完整性的违约处理
触发器
触发器执行顺序
触发器的递归触发
这个功能怎么实现?
deleted表和inserted表
- 在触发器执行过程中,SQL Server自动建立和管理这两个临时的虚拟表
- 这两个表的结构与激发触发器的更新操作的对象表结构一致
- 这两个表的值包含了在激发触发器的更新操作中插入和删除的所有记录
- 这两个表可供用户查询
- 可用这两个表在SQL命令与触发器之间传递数据
T-SQL语句 | deleted表 | inserted表 |
insert | 空 | 新的行 |
update | 旧的行 | 新的行 |
delete | 删除的行 | 空 |
问题:你理解该表的含义吗?
deleted表和inserted表示例
转系历史数据的跟踪存储
问题的解决办法
实现CS_S视图的数据插入
实现Course表的违约处理
触发器小结
- 强化约束,实现比check更复杂的约束
- 跟踪变化,也可拒绝数据库中不经许可的更新
- 级联运行,即可触发其它表的触发器
- 触发器内可调用存储过程
- 一个表上最好不要定义大量的触发器
- 触发器程序一般不要太复杂
- 一定要注意触发器的直接或间接递归触发问题
- 一般能用其它约束来实现的功能,就不用触发器
- 触发器的大多数功能也可以用存储过程来实现
- 数据库中触发器数量多对系统效率影响较大