【数据库系统概论】-数据库完整性

来源:互联网 发布:jsp 引入java类 编辑:程序博客网 时间:2024/06/02 18:50

数据库的完整性是指数据的正确性和相容性。

数据库的完整性和安全性是两个不同的概念:数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。数据的安全性是保护数据库防止恶意的破坏和非法的存取。因此,完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库。安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取。


1、提供定义完整性约束条件的机制

实体完整性、参照完整性和用户定义完整性。一般由SQL的DDL语句来实现。

2、提供完整性检查的方法

一般在更新语句执行后开始检查,也可以在事物提交时检查。检查这些操作执行后数据库中的数据是否违背了完整性约束条件。

3、违约处理

DBMS若发现用户的操作违背了完整性约束条件,就采取一定的动作,如拒绝执行、或级联执行等操作,进行违约处理以保证数据库的完整性。

实体完整性

实体完整性定义

关系模型的实体完整性是在CREATE TABLE中用PRIMARY KEY 定义。一种是定义为列级约束条件,另一种是定义为表级约束条件。

列级约束条件: <属性列名> <数据类型> PRIMARY KEY

表级约束条件: PRIMARY KEY (<属性列名>)

实体完整性检查和违约处理

1、检查主码值是否唯一,如果不唯一则拒绝插入或修改;

2、检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

RDBMS核心一般都在主码上自动建立一个索引,这样将大大提高效率。

参照完整性

参照完整性定义

参照完整性在CREATE TABLE中用FOREIGN KEY 短语定义哪些列为外码,用REFERENCES短语指明这些外码参照那些表的主码

参照完整性违约处理

一个参照完整性将两个表中的相应元组联系起来了。因此,对被参照表和参照表进行增删改操作时有可能破坏参照完整性,因此需要检查

1、拒绝执行

不允许该操作的执行。

2、级联操作

当删除或修改被参照表的一个元组造成了与参照表的不一致,则删除或修改参照表中的所有造成不一致的元组

3、设置为空

用户定义完整性

1、列值非空(NOT NULL)

2、列值唯一(UNIQUE)

3、检查列值是否满足一个布尔表达式(CHECK)

完整性约束命名子句

SQL在CREATE TABLE中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件的命名。而可以灵活地增加、删除一个完整性约束条件。

1、完整性约束命名子句

CONSTRAINT <完整性约束命名子句> [PRIMARY KEY 短语 | FOREIGN KEY 短语 | CHECK 短语]

2、修改表中的完整性限制

可以使用ALTER TABLE语句修改表中的完整性限制。

触发器

触发器是用户定义在关系表上的一类由事件驱动的特殊过程。触发器类似于完整性约束,但是比约束更加灵活,可实施比FOREGIN KEY、CHECK约束更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

定义触发器

SQL中使用CREATE TRIGGER命令建立触发器

CREATE TRIGGER <触发器名>{BEFORE | AFTER} <触发事件> ON <表名>FOR EACH {ROW | STATEMENT}[WHEN <触发条件>]<触发动作体>/* AS BEGIN code END*/

1、表的拥有者才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。

2、触发器名

触发器名可以包含模式名,也可以不包含模式名、同一模式下,触发器名必须是唯一的;并且触发器名和<表名>必须在同一模式下。

3、表名

当这个表的数据发生变化时,将激活定义在该表上的<触发事件>的触发器,因此,该表也成为触发器的目标表。

4、触发事件

触发时间可以是INSERT、DELETE或UPDATE,也可以是这几个的组合。UPDATE后面还可以有OF <触发列>...,即进一步指明修改那些列时触发器激活。

5、触发器类型

触发器按照所触发动作的间隔尺寸可以分为行级触发器语句级触发器

如果触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次。如果是行级触发器,触发器将执行所影响行数次。

6、触发条件

只有当触发条件为真时触发动作体才执行;否则触发动作体不执行

7、触发动作体

触发动作体既可以是一个匿名PL/SQL过程块,也可以是对已经创建存储过程的调用。如果是行级触发器,在两种情况下用户都可以在过程体中使用NEW或OLD引用UPDATE/INSERT事件之后的新值和UPDATE/DELET事件之前的旧值。如果是语句级触发器,则不能再触发动作体中使用NEW或OLD进行引用。

激活触发器

触发器的执行,是由触发事件激活的,并由数据库服务器自动执行的。一个数据表上可以定义多个触发器,同一个表上的触发器激活时遵循如下执行顺序:

(1)激活该表上的BEFORE触发器

(2)激活触发器的SQL语句

(3)激活该表上的AFTER触发器

对于同一个表上的多个BEFORE(AFTER)触发器,遵循”谁先创建谁先执行“的原则。有些RDBMS是按照触发器的名称字幕排序顺序执行触发器。

删除触发器

DROP TRIGGER <触发器名> ON <表名>


0 0