数据库安全和完整性约束
数据库安全
引言:数据库可能会被以下类型的因素破坏
- 操作系统层面上的错误
- 并发控制导致的数据非一致性
- 人为因素,删库跑路啦
- 输入的数据是不干净的,也会导致数据库被破坏,比如年龄数据输入总不能为负值吧
保护数据库安全的方法
- 数据库不应该被非法访问,我们可以通过view和查询重写,比如只给相关的view,当检查到查询语句不对时,报错
- 访问控制:对数据库的用户可以分为普通用户,拥有某些资源特权的用户,DBA。比如借书的人的账号和图书管理员账号的访问权限是不一样的
- 通过用户身份识别验证,避免人为破坏数据库,就是加了个门槛,通过密码,指纹,钥匙的信息进行识别
- 授权,部分权限授权给某些用户,如创建另一个账户并授权这个账号可以进行的操作
- 数据加密,Data encryption,在底层上,如磁盘上对数据进行加密,别人即使访问到了也不知道数据是啥,但是这样的应用小,访问到底层加密的数据时,要进行解密加密操作,加密代价也要衡量,对敏感重要信息可以这么做。
- 审计追踪,对数据对象进行监控,xx在xx时候对数据对象做了xx操作都被记录下来
统计数据库的安全问题
数据库系统提供了对数据库的统计查询,即COUNT,但是对部分数据,我们希望它不被别人知道,如学生成绩,员工薪水等,这时候有合法用户通过合法手段查询到特定某个人的薪水信息,我们这里讨论的就是对该部分数据安全进行讨论
个人追踪器和通用追踪器,这里可以百度下,我也没咋做笔记
完整性约束
约束,说白了就是一组规则,数据库中的每个实例都必须遵循这个约束,保证数据的完整性和一致性
约束类型
静态约束
- 数据模型自带的约束,如关系数据库中的一范式,不允许表中表等
- 隐式约束,隐含在数据模式中,通过DDL表现,比如域约束,主键约束,外键约束
- 显式约束
动态约束
当一个数据库从一个状态转换到另一个状态的过程中,必须遵循大的约束规则,比如有两张表,主键表和外键表,对主键表删除时,要检查外键表中是否有依赖删除的元组的元组对象,如果有就进行报错或者联级删除,插入和更新同理
对完整性约束的定义
- 在编程时进行设置
- 通过断言进行约束设置
- 在创建表的时候进行设置
通用约束,在某张表中进行constraint约束设置,当涉及多张表的时候,不适应,可以通过断言设置
触发器Triggers
触发器是用来解决动态约束的,是一种自动化的程序当特别的操作发生在DBMS中的时候
触发器有三个部分
- Event,触发事件
- Condition 决定触发器是否允许
- Action 触发器运行时发生什么,可以是事件等
一个触发器应该满足ECA规则
例子:对一张表进行插入时,我们想把插入的数据中满足条件的一部分也插入到另一张表中,E触发事件就是对该表插入,C当插入的数据满足一定条件时可以决定运行该触发器,对另一张表也插入相应的数据就是A
ECA执行规则
- ECA立即执行,这个常用
- ECA延迟执行
- 分离操作,比如可以把A当成事物,单独操作
连锁触发:当设置了过多的触发器,可能导致连锁触发的发生,所以触发器的使用要慎重
ECA实现方法
- 松耦合,打补丁
- 紧耦合,改内核
- 嵌套,介于两者之间