4.7.5 数据库系统安全设计
近年来跨网络的分布系统急速发展,在数据库系统中,数据的集中管理产生了多用户存取特性,数据库的安全问题可以说已经成为信息系统最为关键的问题。尤其是,电子政务中所涉及的数据库密级更高、实时性要求更强,因此,有必要根据其特殊性完善安全策略,这些安全策略应该能保证数据库中的数据不会被有意地攻击或无意地破坏,不会发生数据的外泄、丢失和毁损,保证数据库系统安全的完整性、机密性和可用性。从数据库管理系统的角度而言,要解决数据库系统的运行安全和信息安全,采取的安全策略一般为用户管理、存取控制、数据加密、审计跟踪和攻击检测等。 针对数据库系统安全,我们需重点关注完整性设计。数据库完整性是指数据库中数据的正确性和相容性。数据库完整性由各种各样的完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。数据库完整性约束可以通过数据库管理系统(Database Management System,DBMS)或应用程序来实现,基于DBMS的完整性约束作为模式的一部分存入数据库中。
1.数据库完整性设计原则
在实施数据库完整性设计时,需要把握以下7个基本原则。
- (1)根据数据库完整性约束的类型确定其实现的系统层次和方式,并提前考虑对系统性能的影响。一般情况下,静态约束应尽量包含在数据库模式中,而动态约束由应用程序实现。
- (2)实体完整性约束和引用完整性约束是关系数据库最重要的完整性约束,在不影响系统关键性能的前提下需尽量应用。用一定时间和空间来换取系统的易用性是值得的。
- (3)要慎用目前主流DBMS都支持的触发器功能,一方面由于触发器的性能开销较大;另一方面,触发器的多级触发难以控制,容易产生错误,非用不可时,最好使用Before型语句级触发器。
- (4)在需求分析阶段就必须制定完整性约束的命名规范,尽量使用有意义的英文单词、缩写词、表名、列名及下画线等组合,使其易于识别和记忆。如果使用CASE工具,一般有默认的规则,可在此基础上修改使用。
- (5)要根据业务规则对数据库完整性进行细致的测试,以尽早排除隐含的完整性约束间的冲突和对性能的影响。
- (6)要有专职的数据库设计小组,自始至终负责数据库的分析、设计、测试、实施及早期维护。数据库设计人员不仅负责基于DBMS的数据库完整性约束的设计实现,还要负责对应用软件实现的数据库完整性约束进行审核。
- (7)应采用合适的CASE工具来降低数据库设计各阶段的工作量。好的CASE工具能够支持整个数据库的生命周期,这将使数据库设计人员的工作效率得到很大提高,同时也容易与用户沟通。
2.数据库完整性的作用
数据库完整性对于数据库应用系统非常关键,其作用主要体现在以下5个方面。 - (1)数据库完整性约束能够防止合法用户使用数据库时,向数据库中添加不合语义的数据内容。
- (2)利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率。同时,由于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。
- (3)合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能。例如装载大量数据时,只要在装载之前临时使基于DBMS的数据库完整性约束失效,此后再使其生效,就能保证既不影响数据装载的效率又能保证数据库的完整性。
- (4)在应用软件的功能测试中,完善数据库完整性有助于尽早发现应用软件的错误。
- (5)数据库完整性约束可分为6类:列级静态约束、元组级静态约束、关系级静态约束、列级动态约束、元组级动态约束和关系级动态约束。动态约束通常由应用软件来实现。不同DBMS支持的数据库完整性基本相同,某常用关系型数据库系统支持的基于DBMS的完整性约束,如表4-3所示。
表4-3 某数据库系统支持的基于DBMS的完整性约束
+--------------------+---------------+--------------------------------+
| 支持的完整性约束 | 对应的完 | 备注 |
| | 整性约束类型 | |
+====================+===============+================================+
| 非空约束(Not | 列级静态约束 | |
| Null) | | |
+--------------------+---------------+--------------------------------+
| 唯一码约束(Unique | 列级静态约束 | 通过唯一性索引来实现 |
| Key) | | |
| | 元 | |
| | 组级静态约束 | |
+--------------------+---------------+--------------------------------+
| 主键约束(Primary | 关系静态约束 | |
| Key) | | |
+--------------------+---------------+--------------------------------+
| 引用完整性约 | 关系静态约束 | 可定 |
| 束(Referential) | | 义5种不同的动作,Restrict、Set |
| | | to Null、Set to |
| | | Default、Cascade、No Action |
+--------------------+---------------+--------------------------------+
| 检查约束(Check) | 列级静态约束 | 可定义在列表或表上 |
| | | |
| | 元 | |
| | 组级静态约束 | |
+--------------------+---------------+--------------------------------+
| 通过 | 全部6类 | 关 |
| 触发器来实现的约束 | 完整性的要求 | 系级动态约束可以通过调用包含事 |
| | | 务的存储过程来实现,如果出现性 |
| | | 能问题,需要改由应用软件业实现 |
+--------------------+---------------+--------------------------------+
3.数据库完整性设计示例
一个好的数据库完整性设计,首先需要在需求分析阶段确定要通过数据库完整性约束实现的业务规则。然后在充分了解特定DBMS提供的完整性控制机制的基础上,依据整个系统的体系结构和性能要求,遵照数据库设计方法和应用软件设计方法,合理选择每个业务规则的实现方式。最后,认真测试,排除隐含的约束冲突和性能问题。基于DBMS的数据库完整性设计大体分为需求分析阶段、概念结构设计阶段和逻辑结构设计阶段。 1)需求分析阶段 经过系统分析员、数据库分析员和用户的共同努力,确定系统模型中应该包含的对象,如人事及工资管理系统中的部门、员工和经理等,以及各种业务规则。 在完成寻找业务规则的工作之后,确定要作为数据库完整性的业务规则,并对业务规则进行分类。其中作为数据库模式一部分的完整性设计按概念结构设计阶段和逻辑结构设计阶段的过程进行,而由应用软件来实现的数据库完整性设计将按照软件工程的方法进行。 2)概念结构设计阶段 概念结构设计阶段是将依据需求分析的结果转换成一个独立于具体DBMS的概念模型,即实体关系图(Entity-Relationship Diagram,ERD)。在概念结构设计阶段就要开始数据库完整性设计的实质阶段,因为此阶段的实体关系将在逻辑结构设计阶段转化为实体完整性约束和引用完整性约束,到逻辑结构设计阶段将完成设计的主要工作。3)逻辑结构设计阶段 此阶段就是将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化,包括对关系模型的规范化等。此时,依据DBMS提供的完整性约束机制,对尚未加入逻辑结构中的完整性约束列表,逐条选择合适的方式加以实现。 在逻辑结构设计阶段结束时,作为数据库模式一部分的完整性设计也就基本完成了。每种业务规则都可能有好几种实现方式,应该选择对数据库性能影响最小的一种,有时需通过实际测试来决定。