[本文正在参与炫“库”行动-人大金仓有奖征文]
活动地址:https://marketing.youkuaiyun.com/p/98bd30353e7cb998b6070a89e8b91edb
文章目录
一、数据库完整性的概念及分类
1.1. 为什么会要引发数据库完整性的问题
数据库完整性主要是预防不正当的数据库操作,如输入错误、操作错误、程序处理失误等造成数据上的一些丢失、错乱等问题,甚至是一些不可逆的问题。
1.2. 数据库完整性管理的作用
数据库完整性管理的作用主要有两点:
- 防止和避免数据库中不合理数据的出现。
- DBMS应尽可能地自动防止DB中语义不合理现象。
1.3. DBMS怎样自动保证完整性
DBMS主要通过两个方面来保证完整性:
- DMBS允许用户自定义一些完整性约束规则(用SQL-DDL来定义)。
- 当用户有对DB更新操作时,DBMS自动按照参照完整性约束条件进行检查,以确保更新操作符合语义完整性。这样的一套程序称为:完整性控制程序。
1.4. 完整性约束条件(完整性约束规则)的一般形式
完整性约束条件可以用个公式表示:(O, P, A, R)
- O:数据集合:约束的对象是什么?可以是列、多列或多元组、元组集合。
- P:谓词条件:什么样的约束?
- A:触发条件:什么时候检查?默认更新时检查
- R:响应动作:不满足时怎么办?默认拒绝
整合来说就是:约束对象(O)在什么时候检查(A)什么样的约束(P),当不满足时怎么处理(R)?
1.5. 数据库的完整性定义是什么
数据库的完整性是指DBMS应保证的DB的一种特性,即在任何情况下的正确性、有效性和一致性。
- 广义完整性:主要是语义完整性、并发控制、安全控制、DB故障恢复等。
- 狭义完整性,专指语义完整性,DBMS通常有专门的完整性管理机制与程序来处理语义完整性问题
- 按约束对象分类
- 域完整性约束条件,该完整性的体现是施加于某一列上,对给定列上所要更新的某一候选值是否可以接受进行约束条件判断,这是孤立进行的
- 关系/表完整性约束条件,该完整性的体现是施加于关系/table上,对给定的table上所要更新的某一候选元组是否可以接受进行约束条件判断,或是对一个关系中若干元组和另一个关系中的若干元组的联系是否可以接受进行约束条件判断
- 按约束来源分类
- 结构约束(来自于模型的约束),例如函数依赖约束、主键约束(实体完整性约束)、外键约束(参照完整性约束),只关心数值是否相等、是否允许为空值等
- 内容约束(来自于用户的约束),如用户自定义完整性约束,关心元组或属性的取值范围
- 按约束状态分类
- 静态约束(域完整性约束和关系完整性约束都属于静态约束),要求DB在任一时候均应满足的约束条件
例如:年龄在任何时候都应满足大于0且小于150 - 动态约束(触发器约束),要求DB从一状态改变为另一状态时应满足的约束
例如:工资只能升不能降
- 静态约束(域完整性约束和关系完整性约束都属于静态约束),要求DB在任一时候均应满足的约束条件
- 按约束对象分类
二、SQL语言之列约束与表约束-静态约束
2.1. 静态约束的定义
与完整性约束条件一样,同样满足(O, P, A, R)规则,只是在作为静态约束时,A和R可以不用定义。即触发条件A为默认在更新时检查,响应动作R默认为拒绝。
2.2. 静态约束的实现
实现方法有两种形式:
- 使用Create table语句完成静态约束创建。
- 使用断言create assertion实现静态约束创建。
一个断言就是一个谓词表达式,它表达了希望数据库总能满足的条件。当一个断言创建后,系统将检测其有效性,并在每一次更新中测试更新是否违反该断言。
语法:
create assertion <assertion-name> check <predicate>
三、SQL语言之触发器(Trigger)-动态约束
3.1. 动态约束的定义和实现
Trigger是一种过程完整性约束(相比之下,create table中定义的都是非过程性约束),是一段程序,该程序可以在特定的时刻被自动触发执行,比如在一次更新操作之前执行,或在更新操作之后执行。在创建动态约束时,基于(O, P, A, R)规则的每一个元素都需要定义。
语法:
create trigger trigger_name BEFORE|AFTER
{insert | delete | update [of colname {, colname ...}]} //触发事件,before insert 或者是after insert等组合
on tablename [referencing corr_name_def {, coor_name_def}] //触发器使用到的变量
[for each row | for each statement] //对更新操作的每一条结果(前者),或整个更新操作完成(后者)
[when (search_condition)] //检查条件,如满足执行下述程序
{statement //单行程序直接书写,多行程序要用下行方式(即用begin atomic ... end做界定)
| begin atomic statement;{statement;...} end}
语法的意义可以这样理解:当某一事件发生时(before insert或after insert),对该事件产生的结果(可能是每一元祖,可能是整个操作的所有元组),检查条件search_condition,如果满足条件,则执行后面的程序段
详细解释:
- 事件:before|after { insert | delete | update…}
- 当一个事件(insert、delete、update)发生之前(before)或发生之后(after)触发。
- 发生之前(before时刻):将写未写的时候,即写入数据之前
- 发生之后(after时刻):即写入数据之后
- 更新操作:执行触发器操作需要处理两组值,分别是更新前的值和更新后的值,这两个值由corr_name_def区分。
corr_name_def的定义:- {OLD [ROW] [AS] old_row_corr_name //更新前的旧元组命别名为old_row_corr_name
- | NEW [ROW] [AS] new_row_corr_name //更新后的新元组命别名为new_row_corr_name
- | OLD TABLE [AS] old_table_corr_name //更新前的旧table命别名为old_table_corr_name
- | NEW TABLE [AS] old_table_corr_name //更新后的旧table命别名为new_table_corr_name
}
四、数据库安全性的概念及分类
4.1. 数据库安全性的概念
数据库安全性:指DBMS应该保证数据库的一种特征(机制或手段):免受非法、非授权用户的使用、泄露、更改或破坏。
4.2. 数据库安全性的分类
DBMS的安全机制主要有如下几种:
- 自主安全性机制:存取控制(Access Control),即通过权限在用户之间的传递,使用户自主管理数据库安全性
- 强制安全机制:通过对数据和用户强制分类,使得不同类别用户能够访问不同类别的数据
- 推断控制机制
- 数据加密存储机制
五、SQL语言之安全性实现
SQL语言的安全性实现也可以用一个公式说明:
AccessFull::=(S, O, t,P)
- S:请求主体(用户)
- O:访问对象,访问对象可大可小:属性/字段、记录/元组、关系、数据库
- t:访问权利,创建、增、删、改、查等
- P:谓词,拥有权利需要满足的条件
安全性的实现可以有两个方面实现:
- 安全性控制程序。DBMS将权利和用户(账户)结合在一起,形成一个访问规则表,当用户访问数据库时依据该规则表可以实现对数据库的安全性控制,最终生成安全性控制程序
- 视图
[本文正在参与炫“库”行动-人大金仓有奖征文]
活动地址:https://marketing.youkuaiyun.com/p/98bd30353e7cb998b6070a89e8b91edb