数据库安全性与完整性 - 软考备战(三十三)

数据库系统(五)

参考资料:

数据库安全性与完整性

数据库完整性.pdf

数据库安全性与完整性核心考点纵向拆解:知识体系与实战应用梳理-51CTO软考-软考在线教育培训

5.5 数据库安全性与完整性

1. 完整性

核心目标:防止不合语义的"脏数据"进入数据库.

完整性是 DBMS 主动把关,保证数据对现实世界的语义是正确的。

实体完整性(针对主码 Primary Key)

规则:主码不能取空值(NULL),且不能有重复值。

违约处理:如果插入或修改导致主码为空或重复,DBMS 直接拒绝执行。

参照完整性(针对外码 Foreign Key)

规则:

外码的值要么全是空值(表示尚未分配或无关联),要么必须是另一个关系主码的有效值。

违约场景与处理策略:

当对被引用表(父表)进行操作,可能破坏参照完整性时,DBMS 提供了以下处理方式供设计者选择:

拒绝执行(NO ACTION / RESTRICT)

最严格,直接报错,不许删/改。

级联操作(CASCADE)

父表删了/改了,子表里对应的外码行自动跟着删/改。(如:删除部门,该部门所有员工自动删除)。

设为空值(SET NULL)

父表删了/改了,子表里对应的外码值自动变成 NULL。(前提:该外码列允许为空)。

注意:

如果是子表(引用表)自己乱插入一个不存在的外码值,DBMS 没二话,直接拒绝执行,没有级联一说。

用户定义完整性(针对普通列 Check / Not Null / Unique)

规则:如 CHECK (年龄 BETWEEN 15 AND 30),NOT NULL。

违约处理:不符合条件,拒绝执行。

触发器
本质

一种特殊的存储过程,不能被手动调用,只能由事件自动触发。

触发事件与时机

事件:INSERT、UPDATE、DELETE。

时机:BEFORE(在操作执行前触发,常用于数据预处理或复杂校验)、AFTER(在操作执行后触发,常用于级联修改或记录日志)。

为什么需要触发器?

前面的 Check 约束只能限制"本行、当前列"的静态数据。

如果要实现"修改员工工资时,不能超过其历史最高工资"(需要查历史表),CHECK 做不到,必须用触发器。

2. 安全性

核心目标

防止非法用户访问或越权操作数据库。

安全性是层层设防的体系,从外到内越来越底层。

第一层:用户标识与鉴别(进门查验身份)

最外层防线。

通过用户名/密码、指纹、动态口令卡确认"你是谁"。

第二层:存取控制(进门后看菜单,决定你能干啥)
自主存取控制(DAC)

最常用。

用户对 自己创建的表/对象 拥有"全权",可以自己决定把权限发给谁。

(这就是关系数据库标准语言(SQL)- 软考备战(三十一)-CSDN博客GRANT 和 REVOKE)。

强制存取控制(MAC)

用于极高安全级别的系统(如军方、银行核心库)。

机制:

给每个用户发一个"许可证级别"(如绝密、机密、秘密),给每个数据标一个"密级"。

规则只有两条:

用户只能"读"密级 小于等于 自己许可证的数据。(不能看高于自己级别的)

用户只能"写"密级 大于等于 自己许可证的数据。(防止高密级用户把高密数据写到低密级文档里泄密)

第三层:视图机制(物理隔离,防偷窥)

通过建立视图,把底层的基表隐藏起来。

应用:

把没有权限的列屏蔽掉(如给财务看不含基本工资的视图),或者把跨部门的数据过滤掉。

视图让用户"看不到"他不该看的东西。

第四层:审计------ 专抓内鬼

当前面三道防线被突破(比如合法用户恶意删库),审计是最后的追责手段。

机制:

DBMS 专门开一个"审计日志表",记录谁、在什么时间、在哪个终端、对什么对象、执行了什么SQL、成功还是失败。

代价:

极其耗费磁盘空间和时间,通常只对敏感操作(如修改金额、删除数据)开启审计。

第五层:数据加密(物理层兜底)

即使黑客直接把硬盘偷走,或者绕过了 DBMS 直接读取物理文件,看到的也是乱码。

分为:

存储加密(磁盘上的文件加密)、传输加密(网线里跑的数据加密,如 SSL/TLS)。

相关推荐
2401_883600252 小时前
SQL处理分组聚合中的数据一致性_使用事务保证
jvm·数据库·python
weixin_408717772 小时前
为什么宝塔面板定时访问URL任务总是报502_检查目标接口响应时间与延长任务执行超时设置
jvm·数据库·python
m0_746752302 小时前
如何在导航栏中实现左右分列的菜单项布局
jvm·数据库·python
21439652 小时前
怎么为MongoDB事务调优:将读操作尽量移到事务外面执行
jvm·数据库·python
baidu_340998822 小时前
JavaScript中函数式编程中不可变性与闭包的关联
jvm·数据库·python
djjdjdjdjjdj2 小时前
c++如何利用std--tie实现多个文件属性字段的快速比较排序【详解】
jvm·数据库·python
m0_678485452 小时前
CSS如何使用Less的Merge功能合并多个属性值_通过逗号或空格组织css参数
jvm·数据库·python
2401_897190552 小时前
团队版Navicat专属功能:如何共享数据库架构ER模型_核心机制解析
jvm·数据库·python
m0_640309302 小时前
如何利用 Block Tree 避免不必要的子组件重渲染?Vue3 编译黑科技
jvm·数据库·python