2018-02-21 17:40:14
导致数据库数据被破坏的原因有如下几个方面:
- 系统崩溃;
- 并发访问的控制不当;
- 人为的破坏(有意的,或无意的);
- 输入数据本身的错误;
第一,二项可以通过数据库恢复技术进行解决,第三项需要用到数据库安全性的保障,第四项毫无疑问需要进行数据的完整性约束。
一、数据库安全性
1)保护数据库中的数据不被非法访问
- 视图和查询语言的重写:例如用户只能查看和访问计算机学院的数据,那么在用户提交一条query的时候,系统将会自动的在WHERE子句上加上AND CS,用来对数据库的数据进行筛选。
- 访问控制:对用户进行分类,分为普通用户;拥有某些资源特权的用户;DBA。
- 用户标识和认证:对数据库里的每个合法的用户都予以分配一个标识符,认证可以是一个密码或者口令;钥匙,U盾,IC卡;指纹,声纹和虹膜等。
- 授权与权限检查: 如,GRANT CONNECT TO JOHN IDENTIFIED BY xyzabc; GRANT SELECT ON TABLE S TO U1 WITH GRANT OPTION。
- Role:角色可以给多个用户授权,避免了每次对单一用户授权的效率低下的问题。
- Data encryption:文件加密,只有通过数据库才能访问文件,而不能直接使用操作系统的文件层进行访问,所以得进行加密。
- 审计追踪:万一数据库被非法访问,可以通过审计追踪文件里记录的内容查看到是什么人在什么时候对数据库做了哪些操作,相当于摄像头的作用。如,AUDIT SELECT, INSERT, DELETE, UPDATE ON emp WHENEVER SUCCESSFUL;
2)统计数据库的安全
在很多情况下,对于数据库的统计信息是公开的,但是对于单独的某一条数据是非公开的。
这时如果仅仅采用授权登录的方式来保障数据库安全的话,很有可能某个合法的用户通过合法的手段获得统计结果,之后通过数学方式得到本不该取得的数据。
统计数据库安全就是用来解决这个问题,事实上,这个问题非常麻烦,到目前也没有找到很好的解决方案。
有人提出了一种通用追踪器,只要找到一个符合条件的谓词,就可以唯一找到一个元组。
二、数据库的完整性约束
数据的完整性约束是指对于数据库中每一条合法的实例,其数值都必须满足当前的约束。
- 违反任何一条完整性约束的Inserts/deletes/updates操作都会被丢弃
- 可以用来保证所有的进入数据库的数据都是一致的
1)完整性约束可以分为两大类:静态约束;动态约束
- 静态约束:对数据库静态状态的约束
(i)数据模型固有约束:如,INF;
(ii)隐含约束:模式定义的时候的进行的约束,如INTEGER,整形数就不能给浮点数;数据值域的要求;主键不能为空,不能重复的约束;外键约束,也就是引用完整性约束;
(iii)显示约束:使用断言等语句进行的约束;
- 动态约束:数据库从一个状态转换到另一个状态的约束。一般与Trigger联系起来。
2)引用完整性约束
3)显示完整性约束的定义
(i)创建表的时候的CHECK子句
(ii)断言
和C++类似,可以使用ASSERT进行断言判断,例如:ASSERT balanceCons ON account: balance>=0;
对于左图的操作,单纯使用CHECK子句是没法达到约束效果的,应为该约束对Boats表没有效力。这时可以使用断言。
4)Triggers
触发器用于动态约束,是指DBMS遇到特定的事件的时候的自动触发的动作。
主动数据库系统是有一组ECA规则构成的系统,具体来说是指该数据库会动态检测当前数据库的状态,当遇到某个事件,并满足相应条件的时候,就开始执行相应的行为。