SQL 语言高级应用 : 完整性和安全性
SonderLau ... 2020-06-22 大约 3 分钟
# SQL 语言高级应用 : 完整性和安全性
# 完整性约束的 SQL 定义
数据库系统必须保证数据库中的数据是完整的
在更新数据库系统时 关系中不能出现不满足约束的方法
但是这种检查往往低效 复杂 重复的 而且不可靠
# 完整性约束和主码
在 SQL 中 实体完整性通过主码Primary Key
的定义来实现
一旦某个属性是主码 该属性就不能为空值 且不能出现两个相同的值
在 SQL 中可以使用以下两种定义的方法
- 是在属性后增加关键字
- 属性表中加入额外的定义主码的子句
如果有多个主码 使用 Primary KEY (Ino,Eno)
# 参照完整性约束和外部码
利用外部码的说明实现参照完整性约束
# 外部码的约束的说明
- 在该属性的说明后加上关键字
References <父表名>(<属性名>)
- 在创建表语句的后面添加语句
Foreign Key(<属性表名>) references <父表名>(<属性名表>)
# 参照完整性约束的实现策略
规定外部码的取值只有两种情况
- 取空值
- 取被参照关系中的主码值
SQL 中提供了三种可选方案
RESTRICT
限制策略- 是 SQL 默认
CASCADE
级联策略- 当删除或修改父表中某元组的主码值时
- 子表中具有该外部码值的元组也将被删除或修改以保证参照完整性
SET NULL
置空策略- 针对父表的删除或修改操作的
# 用户自定义完整性约束
# 基于属性的CHECK
约束
使用check
子句的一般格式为
CHECK (<condition>)
Age int CHECK (Age >= 18 and Age <= 65);
1
# 基于元组的CHECK
约束
对表内属性的约束进行说明
Create table Salary
(
Insure decimal(7,2),
Fund decimal(7,2),
Basepay decimal(7,2),
CHECK (Insure + Fund < Basepay);
)
1
2
3
4
5
6
7
2
3
4
5
6
7
# 约束的更新
为了便于修改和删除约束 需要再定义约束的时候为约束进行命名
在约束前加上关键字 CONSTRAINT
和该约束的名称
CONSTRAINT RightSalary CHECK (Insure + Fund < Basepay);
1
这样 可以使用 alter table
语句来更新与属性或表有关的约束
alter table Employee DROP constraint FK_employee
1
由于 SQL 不能直接修改约束 可通过以下两步完成对约束的修改
删除原约束
alter table Salary drop constraint RightSalary;
1
2
增加同名约束 即起到覆盖的效果
alter table Salary add constraint RightSalary check(insure + fund < rest);
1
2
# SQL 中的触发器
一旦被定义 任何用户触发该触发器之后 系统都会自动激活相应激发动作
# 触发器的组成和类型
触发器定义包括两个方面
- 指明触发器的出发事件
- 指明触发器执行的动作
触发事件包括 插入 删除 修改
事件的触发还包括两个相关时间 BEFORE 和 AFTER
触发动作实际上是一系列 SQL 语句 可以有两种方式
- 对被事件影响的每一行 执行一次触发过程
For each row
- 称为 行级触发器
- 对整个事件只执行一次触发过程
For each statement
- 称为 语句级触发器
# 创建触发器
语句基本格式
create trigger <trigger_name> [{ before | after }] {[delete | insert | update of [column_list] ] } on table_name [referencin <临时视图名>] [when <触发条件>] <触发动作> [for each { row | statement }]
1
2
3
4
5
6
7说明
TBD