SQL 语言高级应用 : 完整性和安全性

SonderLau ... 2020-06-22 Notes
  • 数据库
大约 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

# 约束的更新

为了便于修改和删除约束 需要再定义约束的时候为约束进行命名

在约束前加上关键字 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
    • 称为 语句级触发器

# 创建触发器

  1. 语句基本格式

    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
  2. 说明

    TBD

上次编辑于: 2021年11月15日 17:39
贡献者: SonderLau