数据库系统原理——第六章 数据库的安全与保护1知识点总结(自考本)

数据库完整性

  • 数据库完整性是指数据库中数据的正确性相容性。
  • 数据完整性约束是为了防止数据库中存在不符合语义的数据,为了维护数据的完整性, DBMS 必须提供一种机制来检查数据库中的数据,以判断其是否满足语义规定的条件。这些加在数据库之上的语义约束条件就是数据完整性约束,而 DBMS 检查数据是否满足完整性约束条件的机制就称为完整性检查

完整性约束条件的作用对象

完整性检查是围绕完整性约束条件进行的,因而完整性约束条件是完整性控制机制的核心。 完整性约束条件的作用对象可以是**列、元组和表。

  1. 列级约束
    列级约束主要指对列的类型、取值范围、精度等的约束,具体包括如下内容。
    (1) 对数据类型的约束,其包括数据类型、长度、精度等。
    (2) 对数据格式的约束。
    (3) 对取值范围或取值集合的约束。
    (4) 对空值的约束。
  2. 元组约束
    元组约束指元组中各个字段之间的相互约束, 例如某个活动的开始日期小于结束日期。
  3. 表级约束
    表级约束指若干元组之间、 关系之间的联系的约束。

定义与实现完整性约束

关系模型的完整性规则是对关系的某种约束条件,关系模型中可以有三类完整性约束,分别是实体完整性参照完整性用户定义的完整性

  1. 实体完整性
    (1)主键约束
    主键可以是表中的某一列,也可以是表中多个列所构成的一个组合。其中, 由多个列组合而成的主键也称为复合主键。 在 MySQL 中,主键列必须遵守如下一些规则。
    i 每一个表只能定义一个主键
    ii 主键的值,也称为键值,必须能够唯一标志表中的每一行记录,且不能为NULL
    iii 复合主键不能包含不必要的多余列。
    iv 一个列名在复合主键的列表中只能出现一次
    主键约束可以在 CREATE TABLEALTER TABLE 语句中使用关键字**“PRIMARY KEY”来实现,其方式有两种。
    i 一种是作为列的完整性约束,此时只需在表中某个列的属性定义后加上关键字“PRIMARY KEY”即可
    ii 一种是作为表的完整性约束,需要在表中所有列的属性定义后添加一条*PRIMARY KEY(index_col_name, …)*格式的句子。
    (2) 候选键约束
    候选键可以是表中的
    某一列**,也可以是表中多个列所构成的一个组合。任何时候,候选键的值必须是唯一的, 且不能为 NULL。 候选键可以在 CREATE TABLEALTER TABLE 语句中使用关键“UNIQUE”来定义,其实现方法与主键约束相似,同样可作为列或表(关系) 的完整性约束两种方式。
    MySQL 中候选键与主键之间存在以下几点区别
    i 一个表中只能创建一个主键,但可以定义若干个候选键
    ii 定义主键约束时,系统会自动产生 PRIMARY KEY 索引,而定义候选键约束时,系统自动产生 UNIQUE 索引。
  2. 参照完整性
    在 MySQL 中,参照完整性是通过在创建表(CREATE TABLE)更新表(ALTER TABLE) 的同时定义一个外键声明来实现的。 其中, 外键声明有下列两种方式
    (1) 在表中某个列的属性定义后直接加上**“reference_definition”语法项。
    (2) 在表中所有列的属性
    定义后添加“FOREIGN KEY( index_col_name, …)**
    reference_definition”子句的语法项。
    “reference_definition”语法项的定义是:
REFERENCES tbl_name(index_col_name, …)
[ON DELETE reference_option]
[ON UPDATE reference_option]

index_col_name 的语法格式是:

RESTRICT|CASCADE|SET NULL|NO ACTION

相关语法说明如下:
(1)语法项**“tbl_name”指定外键所参照的表名。这个表称为被参照表(或父表) , 而外键所在的表称作参照表(或子表) 。
(2)语法项“col_name”指定被参照表的列名
(3)关键字
“ON DELETE”或“ON UPDATE”指定参照动作相关的 SQL 语句。**
(4)语法项“reference_option”指定参照完整性约束的实现策略。
指定外键时,需要遵守下列规则
(1) 被参照表必须已经用一条 CREATE TABLE 语句创建了,或者必须是当前正在创建的表。如若是后一种情形,则被参照表与参照表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
(2) 必须为被参照表定义主键。
(3) 必须在被参照表的表名后面指定列名或列名的组合。这个列或列组合必须是这个被参照表的主键或候选键。
(4) 尽管主键是不能够包含空值的,但允许在外键出现一个空值。 这意味着,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
(5) 外键中的列的数目必须和被参照表的主键中的列的数目相同。
(6) 外键中的列的数据类型必须和被参照表的主键中的对应列的数据类型相同。
3. 用户定义的完整性
MySQL 支持几种用户自定义完整性约束,分别是非空约束CHECK 约束触发器

  • 非空约束
    在 MySQL 中,非空约束可以通过在 CRETE TABLEALTER TABLE 语句中的某个列定义后面,加上**关键字“NOT NULL”**作为限定词,来约束该列的取值不能为空。
  • CHECK 约束
    与非空约束一样CHECK 约束也是在创建表或更新表的同时,根据用户的实际完整性要求来定义的。语法格式是:
CHECK(expr)。

其中,语法项**“expr”是一个 SQL 表达式**,用于指定需要检查的限定条件。

命名完整性约束

命名完整性约束使用的语法格式是:

CONSTRAINT[symbol]

其中,语法项**“symbol”是指定的约束名字**,这个名字是在完整性约束前面被定义,其在数据库里必须是唯一的。 倘若没有明确给出约束的名字,则 MySQL自动创建一个约束名字

更新完整性约束

当对各种约束进行命名后,就可以使用 ALTER TABLE 语句来更新与列或表有关的各种约束。需要注意以下两点:

  1. 完整性约束不能直接被修改。 若要修改某个约束,实际上是用 ALTER TABLE 语句先删除该约束,然后再增加一个与该约束同名的新约束。
  2. 使用 ALTER TABLE 语句,可以独立地删除完整性约束, 而不会删除表本身。若使用 DROP TABLE 语句删除一个表,则表中所有的完整性约束都会自动被删除。

触发器

  • 触发器是用户定义在关系表上的一类由事件驱动的数据库对象,也是一种保证数据完整性的方法。触发器一旦定义无须用户调用,任何对表的修改操作数据库服务器自动激活相应的触发器。
  • 触发器与表的关系十分密切,其主要作用是实现主键和外键不能保证的复杂的参照完整性和数据的一致性,从而有效地保护表中的数据。

创建触发器

常用的语法格式是:

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
  • 语法项**“trigger_time”用于指定触发器的名称**,触发器在当前数据库中必须具有唯一的名称。 如果要在某个特定数据库中创建,名称前面应该加上数据库的名称。
  • 语法项**“trigger_time**”用于指定触发器被触发的时刻,它有两个选项,即关键字“BEFORE”和关键字“AFTER”, 用于表示触发器是在激活它的语句之前或之后触发。如果希望验证新数据是否满足使用的限制,则使用 BEFORE选项;如果希望在激活触发器的语句执行之后完成几个或更多的改变,通常使用 AFTER 选项
    (3) 语法项**“trigger_event”用于指定触发事件**,即指定激活触发器的语句的种类,其可以是下述值之一:关键字“INSERT”, 表示将新的数据行插入到表时激活触发器关键字“UPDATE”, 表示更改表中某一行数据时激活触发器;
    关键字**“DELETE”, 表示从表中删除某一行数据时激活触发器。**
    (4) 语法项**“tbl_name”用于指定与触发器相关联的表名**,必须引用永久性表,不能将触发器与临时表或视图关联起来,且同一个表不能拥有两个具有相同触发时刻和事件的触发器。
    (5) 关键字**“FOR EACH ROW**”用于指定对于受触发事件影响的每一行都要激活触发器的动作。
    (6) 语法项**“trigger_body”用于指定触发器动作主体**,即包含触发器激活时将要执行的 MySQL 语句。如果要执行多个语句,可使用 BEGIN…END 复合语句结构。

删除触发器

使用的语法格式是:

DROP TRIGGER[IF EXISTS][schema_name.]trigger_name
  • 关键字**“IF EXISTS”用于避免在没有触发器的情况下删除触发器**;
  • 语法项**“schema_name”用于指定触发器所在的数据库的名称,**若没有指定,则为当前默认数据库;
  • 语法项**“trigger_name”指定要删除的触发器名称。**

使用触发器

1、 INSERT 触发器
INSERT 触发器可在 INSERT 语句执行之前或之后执行。使用该触发器时,需要注意以下几点:
(1) 在 INSERT 触发器代码内,可引用一个名为 NEW(不区分大小写)的虚拟表,来访问被插入的行。
(2) 在 BEFORE INSERT 触发器中, NEW 中的值也可以被更新,即允许更改被插入的值
(3) 对于 AUTO_INCREMENT 列, NEW 在 INSERT 执行之前包含的是 0 值,在INSERT 执行之后将包含新的自动生成值
2、 DELETE 触发器
DELETE 触发器可在 DELETE 语句执行之前或之后执行。使用该触发器时,需要注意以下几点:
(1) 在 DELETE 触发器代码内,可以引用一个名为 OLD(不区分大小写)的虚拟表,来访问被删除的行。
(2) OLD 中的值全部都是只读的,不能被更新。
3、 UPDATE 触发器
UPDATE 触发器可在 UPDATE 语句执行之前或之后执行。使用该触发器时,需要注意以下几点:
(1) 在 UPDATE 触发器代码内,可以
引用一个名为 OLD(不区分大小写)的虚拟表
访问以前(UPDATE 语句执行前) 的值,也可以引用一个名为 NEW(不区分大小写)的虚拟表访问新更新的值。
(2) 在 BEFORE UPDATE 触发器中, NEW 中的值可能也被更新,即允许更改将要用于 UPDATE 语句中的值(只要具有对应的操作权限) 。
(3) OLD 中的值全部是只读的,不能被更新。
(4) 当触发器涉及对触发表自身的更新操作时,只能使用 BEFORE UPDATE 触发器,而 AFTER UPDATE 触发器将不被允许。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋禊

兴趣才是前进路上最亮的灯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值