admin 管理员组

文章数量: 1087135


2024年5月18日发(作者:reactnative环境搭建)

4 数据库的安全性与完整性

数据库在各种信息系统中得到广泛的应用,数据在信息系统中的价值越来越

重要,数据库系统的安全与保护成为一个越来越值得重要关注的方面。

数据库系统中的数据由DBMS统一管理与控制,为了保证数据库中数据的安

全、完整和正确有效,要求对数据库实施保护,使其免受某些因素对其中数据造

成的破坏。

一般说来,对数据库的破坏来自以下4个方面:

(1)非法用户

非法用户是指那些未经授权而恶意访问、修改甚至破坏数据库的用户,包括

那些超越权限来访问数据库的用户。一般说来,非法用户对数据库的危害是相当

严重的。

(2)非法数据

非法数据是指那些不符合规定或语义要求的数据,一般由用户的误操作引

起。

(3)各种故障

各种故障指的是各种硬件故障(如磁盘介质)、系统软件与应用软件的错误、

用户的失误等。

(4)多用户的并发访问

数据库是共享资源,允许多个用户并发访问(Concurrent Access),由此会出

现多个用户同时存取同一个数据的情况。如果对这种并发访问不加控制,各个用

户就可能存取到不正确的数据,从而破坏数据库的一致性。

针对以上4种对数据库破坏的可能情况,数据库管理系统(DBMS)核心已

采取相应措施对数据库实施保护,具体如下:

(1)利用权限机制,只允许有合法权限的用户存取所允许的数据,这就是

本章4.1节“数据库安全性”应解决的问题。

(2)利用完整性约束,防止非法数据进入数据库,这是本章4.2节“数据

库完整性”应解决的问题。

(3)提供故障恢复(Recovery)能力,以保证各种故障发生后,能将数据

库中的数据从错误状态恢复到一致状态,此即本章4.3节“故障恢复技术”的

内容。

(4)提供并发控制(Concurrent Control)机制,控制多个用户对同一数据

的并发操作,以保证多个用户并发访问的顺利进行,此即本章4.4节“并发控

制”的内容。

4.1 数据库安全性

4.1.1 数据库安全性问题的概述

1.数据库安全问题的产生

数据库的安全性是指在信息系统的不同层次保护数据库,防止未授权的数据

访问,避免数据的泄漏、不合法的修改或对数据的破坏。安全性问题不是数据库

系统所独有的,它来自各个方面,其中既有数据库本身的安全机制如用户认证、

存取权限、视图隔离、跟踪与审查、数据加密、数据完整性控制、数据访问的并

发控制、数据库的备份和恢复等方面,也涉及到计算机硬件系统、计算机网络系

统、操作系统、组件、Web服务、客户端应用程序、网络浏览器等。只是在数据

库系统中大量数据集中存放,而且为许多最终用户直接共享,从而使安全性问题

更为突出,每一个方面产生的安全问题都可能导致数据库数据的泄露、意外修改、

丢失等后果。

例如,操作系统漏洞导致数据库数据泄漏。微软公司发布的安全公告声明了

一个缓冲区溢出漏洞(/china/security/),Windows NT、

Windows 2000、Windows 2003等操作系统都受到影响。有人针对该漏洞开发出了

溢出程序,通过计算机网络可以对存在该漏洞的计算机进行攻击,并得到操作系

统管理员权限。如果该计算机运行了数据库系统,则可轻易获取数据库系统数据。

特别是Microsoft SQL Server的用户认证是和Windows集成的,更容易导致数据

泄漏或更严重的问题。

又如,没有进行有效的用户权限控制引起的数据泄露。Browser/Server结构

的网络环境下数据库或其他的两层或三层结构的数据库应用系统中,一些客户端

应用程序总是使用数据库管理员权限与数据库服务器进行连接(如Microsoft SQL

Server的管理员SA),在客户端功能控制不合理的情况下,可能使操作人员访问

到超出其访问权限的数据。

在安全问题上,DBMS应与操作系统达到某种意向,理清关系,分工协作,

以加强DBMS的安全性。数据库系统安全保护措施是否有效是数据库系统的主要

指标之一。

为了保护数据库,防止恶意的滥用,可以从低到高的五个级别上设置各种安

全措施。

(1)环境级:计算机系统的机房和设备应加以保护,防止有人进行物理破

坏。

(2)职员级:工作人员应清正廉洁,正确授予用户访问数据库的权限。

(3)OS级:应防止未经授权的用户从OS处着手访问数据库。

(4)网络级:由于大多数DBS都允许用户通过网络进行远程访问,因此网

络软件内部的安全性至关重要。

(5)DBS级:DBS的职责是检查用户的身份是否合法及使用数据库的权限

是否正确。

本章只讨论与数据库系统中的数据保护密切相关的内容。

2.数据库的安全标准

目前,国际上及我国均颁布有关数据库安全的等级标准。最早的标准是美国

国防部(DOD)1985年颁布的《可信计算机系统评估标准》(Computer System

Evaluation Criteria,TCSEC)。1991年美国国家计算机安全中心(NCSC)颁布了

《可信计算机系统评估标准关于可信数据库系统的解释》(Trusted Datebase

Interpreation,TDI),将TCSEC扩展到数据库管理系统。1996年国际标准化组织

ISO又颁布了《信息技术安全技术——信息技术安全性评估准则》(Information

Technology Security Techniques——Evaluation Criteria For It Secruity)。我国政府于

1999年颁布了《计算机信息系统评估准则》。目前国际上广泛采用的是美国标准

TCSEC(TDI),在此标准中将数据库安全划分为4大类,由低到高依次为D、C、

B、A。其中C级由低到高分为C1和C2,B级由低到高分为B1、B2和B3。每

级都包括其下级的所有特性,各级指标如下:

(1)D级标准:为无安全保护的系统

(2)C1级标准:只提供非常初级的自主安全保护。能实现对用户和数据的

分离,进行自主存取控制(DAC),保护或限制用户权限的传播。

(3)C2级标准:提供受控的存取保护,即将C1级的DAC进一步细化,以

个人身份注册负责,并实施审计和资源隔离。很多商业产品已得到该级别的认

证。

(4)B1级标准:标记安全保护。对系统的数据加以标记,并对标记的主体

和客体实施强制存取控制(MAC)以及审计等安全机制。

一个数据库系统凡符合B1级标准者称之为安全数据库系统或可信数据库系

统。

(5)B2级标准:结构化保护。建立形式化的安全策略模型并对系统内的所

有主体和客体实施DAC和MAC。

(6)B3级标准:安全域。满足访问监控器的要求,审计跟踪能力更强,并

提供系统恢复过程。

(7)A级标准:验证设计,即提供B3级保护的同时给出系统的形式化设计

说明和验证,以确信各安全保护真正实现。

我国的国家标准的基本结构与TCSEC相似。我国标准分为5级,从第1级

到第5级依次与TCSEC标准的C级(C1、C2)及B级(B1B2B3)一致。

4.1.2 数据库的安全性机制

在一般计算机系统中,安全措施是一级一级层层设置的,如图6-1所示。

用户 DBMS OS DB

用户标识和鉴别 存取控制 操作系统安全保护 数据密码存储

在图6.1的安全模型中,用户要进入计算机系统,系统首先根据输入的用户

标识进行用户身份鉴定,只有合法的用户才准许进入计算机系统。对已经进入系

统的用户,DBMS要进行存取控制,只允许用户执行合法操作。操作系统一级也

会有自己的保护措施。数据最后还可以以密码形式存储在数据库中。在本节中对

数据库的一些逻辑安全机制进行介绍,包括用户认证、存取权限,视图隔离、数

据加密、跟踪与审查等内容作介绍。

1.用户认证

数据库系统不允许一个未经授权的用户对数据库进行操作。用户标识与鉴

别,即用户认证,是系统提供的最外层安全保护措施。其方法是由系统提供一定

的方式让用户标识自己的名字或身份,每次用户要求进入系统时,由系统进行核

对,通过鉴定后才提供机器使用权。对于获得上机权的用户若要使用数据库时,

数据库管理系统还要进行用户标识和鉴定。

用户标识和鉴定的方法有很多种,而且在一个系统中往往多种方法并用,以

得到更强的安全性。常用的方法是用户名和口令。

通过用户名和口令来鉴定用户的方法简单易行,但其可靠程度极差,容易被

他人猜出或测得。因此,设置口令法对安全强度要求比较高的系统不适用。近年

来,一些更加有效的身份认证技术迅速发展起来。例如使用某种计算机过程和函

数、智能卡技术,物理特征(指纹、声音、手图等)认证技术等具有高强度的身

份认证技术日益成熟,并取得了不少应用成果,为将来达到更高的安全强度要求

打下了坚实的理论基础。

2.存取控制

数据库安全性所关心的主要是DBMS的存取控制机制。数据库安全最重要的

一点就是确保只授权给有资格的用户访问数据库的权限,同时令所有未被授权的

人员无法接近数据,这主要通过数据库系统的存取控制机制实现。存取控制是数

据库系统内部对已经进入系统的用户的访问控制,是安全数据保护的前沿屏障,

是数据库安全系统中的核心技术,也是最有效的安全手段。

在存取控制技术中,DBMS所管理的全体实体分为主体和客体两类。主体

(Subject)是系统中的活动实体,包括DBMS所管理的实际用户,也包括代表用

户的各种进程。客体(Object)是存储信息的被动实体,是受主体操作的,包括文件、

基本表、索引和视图等。

数据库存取控制机制包括两个部分:

一是定义用户权限,并将用户权限登记到数据字典中。用户权限是指不同的

用户对不同的数据对象允许执行的操作权限。系统必须提供适当的语言定义用户

权限,这些定义经过编译后存放在数据字典中,被称作系统的安全规则或授权规

则。

二是合法性权限检查。当用户发出存取数据库的操作请求后(请求一般应包

括操作类型、操作对象、操作用户等信息),数据库管理系统查找数据字典,根

据安全规则进行合法权限检查,若用户的操作请求超出了定义权限,系统将拒绝

执行此操作。

存取控制包括自主型存取控制(DAC)和强制型存取控制(MAC)两种类

型。

(1)自主存取控制(Discretionary Access Control,DAC)

自主型存取控制是用户访问数据库的一种常用安全控制方法,较为适合于单

机方式下的安全控制,大型数据库管理系统几乎都支持自主存取控制。在自主型

存取控制中,用户对于不同的数据对象有不同的存取权限,不同的用户对同一对

象也有不同的权限,而且用户还可将其拥有的存取权限转授给其他用户。用户权

限由数据对象和操作类型这两个因素决定。定义一个用户的存取权限就是要定义

这个用户在哪些数据对象上进行哪些类型的操作。在数据库系统中,定义存取权

限称为授权。

主体

客体

客体1

客体2

……

客体m

write

delete

……

update

delete

read

……

read

……

……

……

……

update

Write/read

……

update

主体1 主体2 …… 主体n

自主型存取控制的安全控制机制是一种存取矩阵的模型,此模型由主体、客

体与存/取操作构成,矩阵的列表示主体,矩阵的行表示客体,而矩阵中的元素表

示存/取操作(如读、写、修改和删除等),如图6-2所示。

图6-2 授权存/取矩阵模型

在这种存取控制模型中,系统根据对用户的授权构成授权存取矩阵,每个用

户对每个信息资源对象都要给定某个级别的存取权限,例如读、写等。当用户申

请以某种方式存取某个资源时,系统就根据用户的请求与系统授权存取矩阵进行

匹配比较,通过则允许满足该用户的请求,提供可靠的数据存取方式,否则,拒

绝该用户的访问请求。

目前的SQL标准也对自主存取控制提供支持,主要是通过SQL的GRANT

语句和REVOKE语句来是实现权限的授予和收回,这部分内容将在下节中作祥

细介绍。

自主存取控制能够通过授权机制有效地控制其他用户对敏感数据的存取,但

是由于用户对数据的存取权限是“自主”的,用户可以自由地决定将数据的存取

权限授予别的用户,而无需系统的确认。这样,系统的授权存取矩阵就可以被直

接或间接地进行修改,可能导致数据的“无意泄漏”,给数据库系统造成不安全

因素。要解决这一问题,就需要对系统控制下的所有主体、客体实施强制型存取

控制策略。

(2)强制存取控制(Mandatory Access Control,MAC)

所谓MAC是指系统为保证更高程度的安全性,按照TCSEC(TDI)标准中安

全策略的要求,所采取的强制存取检查手段,较为适用于网络环境,对网络中的

数据库安全实体作统一的、强制性的访问管理。

强制型存取控制系统主要通过对主体和客体的已分配的安全属性进行匹配

判断,决定主体是否有权对客体进行进一步的访问操作。对于主体和客体,DBMS

为它们的每个实例指派一个敏感度标记(Label)。敏感度标记被分成若干级别,

例如绝密、机密、可信、公开等。主体的敏感度标记称为许可证级别,客体的敏

感度标记称为密级。在强制存取控制下,每一个数据对象被标以一定的密级,每

一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可

证的用户才可以存取。而且,该授权状态一般情况下不能被改变,这是强制型存

取控制模型与自主型存取控制模型实质性的区别。一般用户或程序不能修改系统

安全授权状态,只有特定的系统权限管理员才能要根据系统实际的需要来有效地

修改系统的授权状态,以保证数据库系统的安全性能。

强制存取控制策略是基于以下两个规则:

 仅当主体的许可证级别大于或等于客体的密级时,主体对客体具有读权限。

 仅当客体的密级大于或等于主体的许可证级别时,主体对客体具有写权限。

这两种规则的共同点在于它们均禁止了拥有高许可证级别的主体更新低密

级的数据对象,从而防止了敏感数据的泄漏。

强制安全存取控制模型的不足之处是可能给用户使用自己的数据时带来诸

多的不便,其原因是这些限制过于严格,但是对于任何一个严肃的安全系统而言,

强制安全存取控制是必要的,可以避免和防止大多数有意无意对数据库的侵害。

较高安全性级别提供的安全保护要包含较低级别的所有保护,因此在实现强

制存取控制时要首先实现自主存取控制,即自主存取控制与强制存取控制共同构

成DBMS的安全机制。系统首先进行自主存取控制检查,对通过检查的允许存取

的主体与客体再由系统进行强制存取控制的检查,只有通过检查的数据对象方可

存取。

3.视图隔离

视图是数据库系统提供给用户以多种角度观察数据库中数据的重要机制,是

从一个或几个基表(或视图)导出的表,它与基表不同,是一个虚表。数据库中

只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表

中。

从某种意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣

的数据及其变化。进行存取权限控制时,可以为不同的用户定义不同的视图,把

访问数据的对象限制在一定的范围内,也就是说,通过视图机制要把保密的数据

对无权存取的用户隐藏起来,从而对数据提供一定程度的安全保护。

需要指出的是,视图机制最主要的功能在于提供数据独立性,在实际应用中,

常常将视图机制与存取控制机制结合起来使用,首先用视图机制屏蔽一部分保密

数据,再在视图上进一步定义存取权限。通过定义不同的视图及有选择地授予视

图上的权限,可以将用户、组或角色限制在不同的数据子集内。

4.数据加密

前面介绍的几种数据库安全措施,都是防止从数据库系统中窃取保密数据。

但数据存储在存盘、磁带等介质上,还常常通过通信线路进行传输,为了防止数

据在这些过程中被窃取,较好的方法是对数据进行加密。对于高度敏感性数据,

例如财务数据、军事数据、国家机密,除了上述安全措施外,还可以采用数据加

密技术。

加密的基本思想是根据一定的算法将原始数据(术语为明文)变换为不可直

接识别的格式(术语为密文),从而使得不知道解密算法的人无法获知数据的内

容。数据解密是加密的逆过程,即将密文数据转变成可见的明文数据。

一个密码系统包含明文集合、密文集合、密钥集合和算法,其中密钥和算法

构成了密码系统的基本单元。算法是一些公式、法则或程序,它规定明文与密文

之间的变换方法,密钥可以看作算法中的参数。如图6-3所示。

加密方法可分为对称加密与非对称加密两种。

所谓对称加密,其加密所用的密钥与解密所用的密钥相同。典型的代表是

DES(Data Encryption Standard,数据加密标准)。所谓非对称加密,其加密所用的

密钥与解密所用的密钥不相同,其中加密的密钥可以公开,而解密的密钥不可以

公开。

明文m

加密器

E

k

密文c

解密器

D

k

明文m

加密密钥K

1

密钥源

K1

密钥信道

解密密钥K

2

密钥源

K2

数据加密和解密是相当费时的操作,其运行程序会占有大量系统资源,因此

数据加密功能通常是可选特征,允许用户自由选择,一般只对机密数据加密。

5.审计

审计功能是DBMS达到C2级以上安全级别必不可少的指标。这是数据库系

统的最后一道安全防线。

审计功能把用户对数据库的所有操作自动记录下来,存放在日志文件中。

DBA可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出

非法访问数据库的人、时间、地点以及所有访问数据库的对象和所执行的动作。

有两种审计方式,即用户审计和系统审计。

(1)用户审计:DBMS的审计系统记下所有对表或视图进行访问的企图(包

括成功的和不成功的)及每次操作的用户名、时间、操作代码等信息。这些信

息一般都被记录在数据字典(系统表)之中,利用这些信息用户可以进行审计

分析。

(2)系统审计:由系统管理员进行,其审计内容主要是系统一级命令以及

数据库客体的使用情况。

审计通常是很费时间和空间的,所以DBMS往往将其作为可选特征,一般主

要用于安全性要求较高的部门。

4.1.3 SQL Server的安全性策略

如果一个用户要访问SQL Server 数据库中的数据,必须经过三个认证过程。

第一个认证过程是身份验证,需通过登录帐户来标识用户。身份验证只验证用户

是否具有连接到SQL Server数据库服务器的资格。第二个认证过程是当用户访问

数据库时,必须具有对具体数据库的访问权,即验证用户是否是数据库的合法用

户。第三个认证过程是当用户操作数据库中的数据对象时,必须具有相应的操作

权,即验证用户是否具有操作权限。

SQL Server的安全性管理包括了用户身份认证、存取控制、视图隔离、数据

加密、跟踪与审计等几个方面,下面分别作简要介绍。

1.用户身份认证

SQL Server 的用户有两种类型:

(1)Windows 授权用户:来自于Windows的用户或组。

(2)SQL授权用户:来自于非Windows的用户,称其为SQL用户。

Microsoft SQL Server 为不同的用户类型提供了不同的安全认证模式。

(1)Windows身份验证模式

Windows身份验证模式使用户得以通过Microsoft Windows NT 4.0 或

Windows 2000用户帐户进行连接SQL Server。用户必须首先登录到Windows中,

然后再登录到SQL Server。用户登录到SQL Server时,只需选择Windows身份

验证模式,无需再提供登录帐户和密码,系统会从用户登录到Windows时提供的

用户名和密码中查找用户的登录信息,以判断其是否为SQL Server的合法用户。

对于SQL Server来说,一般推荐使用Windows身份验证模式。因为这种安

全模式能够与Windows操作系统的安全系统集成在一起,用户的网络安全特性在

网络登录时建立,并通过Windows域控制器进行验证,从而提供更多的安全功能。

但Windows验证模式只能用在Windows NT 4.0 或Windows 2000服务器版操作

系统的服务器上,在Windows 98等个人操作系统上,不能使用Windows身份验

证模式,只能使用混合验证模式。

(2)混合验证模式

混合验证模式表示SQL Server接受Windows授权用户和SQL授权用户。如

果不是Windows操作系统的用户或者是Windows 98操作系统的用户使用SQL

Server,则应该选择混合验证模式。

如果在混合模式下选择使用SQL授权用户登录SQL Server,则用户必须提

供登录名和密码,SQL Server使用这两部分内容来验证用户,SQL Server通过检

查是否已设置SQL Server登录帐户,以及指定的密码是否与记录的密码匹配,进

行身份验证。另外,因为在Windows98上不支持Windows身份验证模式,因此,

SQL Server在Windows98上运行时应使用混合模式,且只支持SQL Server身份

验证。

SQL Server在安装时,会自动创建一个DB服务器的登录用户sa,即系统管

理员,用以创建其他登录用户和授权。

数据库服务器登录用户的创建,可利用存储过程来进行,命令如下:

sp_addlogin[@loginame=] '登录名'

[,[@passwd=] '口令']

[,[@defdb=] '默认数据库名']

2.SQL Server数据库用户

SQL Server在安装时,自动创建了一个默认数据库用户,即guest。一个登录

用户在被设定为某个数据库用户之前,可用guest用户身份访问数据库,只不过

其权限非常有限。

SQL Server可用以下命令授权登录用户成为数据库用户,该命令必须在所要

访问的数据库下执行:

sp_adduser [@loginame=] '登录名'

[,[@name_in_db=] '访问数据库时用的名字']

3.存取控制

当用户成为数据库中的合法用户后,他除了可以查询系统表之外,并不具有

操作数据库中对象的任何权限,因此,需给数据库中的用户授予操作数据库对象

的权限。

SQL Server对权限的管理包含如下三个内容:

 授予权限:允许用户或角色具有某种操作权。

 收回权限:删除以前在当前数据库内的用户上授予或拒绝的权限。

 拒绝权限:拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或

角色成员继承权限。

在SQL Server2000中,权限分为对象权限、语句权限和隐含权限三种。

(1)对象权限

对象权限是指用户对数据库中的表、视图等对象的操作权,相当于数据操作

语言的语句权限,例如是否运行查询、增加和修改数据等。

表、视图的权限包括SELECT、INSERT、DELETE、UPDATE。列的权限包

括SELECT和UPDATE。存储过程的权限包括EXECUTE。

 授权语句:

GRANT 对象权限名[,…] ON {表名 | 视图名 | 存储过程名} TO {数据库用户

名 | 用户角色名}[,…] [WITH GRANT OPTION]

可选项[WITH GRANT OPTION]表示获得权限的用户还能获得传递权限,把获得的

权限传授给其他用户。

例如:

GRANT SELECT,INSERT ON Student TO user1 WITH GRANT

OPTION

该语句把对Student表的查询权和插入权授予给用户user1,user1同时获得

将这些权限转授给别的用户的权限。

GRANT UPDATE(Name) ON Student TO user1

该语句把对Student表的姓名属性的修改权授予给用户user1。

 收回权限语句:

REVOKE 对象权限名[,…] ON {表名 | 视图名 | 存储过程名}

FROM {数据库用户名|用户角色名}[,…] [RESTRICT | CASCADE]

可选项[RESTRICT | CASCADE]中,CASCADE表示回收权限时要引起连锁

回收。即从用户Ui回收权限时,要把用户Ui转授出去的同样的权限同时回收。

RESTRICT表示,当不存在连锁回收时,才能回收权限,否则系统拒绝回收。

例如:REVOKE INSERT ON Student FROM user1 CASCADE

该语句表示从用户user1处收回对Student表的插入权,若user1已把获得的

对Student表的插入权转授给其他用户,则连锁收回。

REVOKE INSERT ON Student FROM user1 RESTRICT

该语句表示若user1已把获得的对Student表的插入权转授给其他用户,则上

述收回语句执行失败,否则收回成功。

 拒绝权限语句:

DENY 对象权限名[,…] ON {表名 | 视图名 | 存储过程名} TO {数据

库用户名|用户角色名}[,…]

例如:DENY UPDATE ON Student TO user1

该语句表示拒绝用户user1对Student表进行修改

(2)语句权限

语句权限是指创建数据库或数据库中的项目的权限,相当于数据定义语言的

语句权限。

语句权限包括CREATE DATABASE、CREATE TABLE、CREATE VIEW、

CREATE DEFAULT、CREATE RULE、CREATE FUNCTION、CREATE

PROCEDURE、BACKUP DATABASE、BACKUP LOG。

 授予权限语句:

GRANT 语句权限名[,…] TO {数据库用户名|用户角色名}[,…]

例如,授予用户user1创建数据库表的权限

GRANT CREATE TABLE TO user1

 收回权限语句:

REVOKE 语句权限名[,…] FROM {数据库用户名|用户角色名}[,…]

例如,收回用户user1创建数据库表的权限

REVOKE CREATE TABLE FROM user1

 拒绝权限语句:

DENY 语句权限名[,…] TO {数据库用户名|用户角色名}[,…]

例如,拒绝用户user1创建视图的权限

DENY CREATE VIEW TO user1

(3)隐含权限

隐含权限是指由SQL Server预定义的服务器角色、数据库角色、数据库拥有

者和数据库对象拥有者所具有的权限。隐含权限是由系统预先定义好的,相当于

内置权限,不需要再明确地授予这些权限。例如,数据库拥有者自动地拥有对数

据库进行一切操作的权限。

在数据库中,为了便于管理用户及权限,可以将一组具有相同权限的用户组

织在一起,这一组具有相同权限的用户称为角色(Role)。在SQL Server 2000中,

角色分为系统角色和用户自定义的角色,系统角色又分为服务器级系统角色和数

据库级系统角色。服务器级系统角色是为整个服务器设置的,数据库级系统角色

是为具体的数据库设置的。服务器级系统角色包括sysadmin(系统管理)、

securityadmin(安全管理)、serveradmin(服务器管理)、setupadmin(启动管理)、

processadmin(进程管理)、diskadmin(磁盘管理)、dbcreator(数据库创建)、

bulkadmin(备份管理)。数据库级系统角色包括public和dbo。public角色只具备

最基本的访问数据库的权限。dbo为数据库拥有者,即创建该数据库的用户,拥

有对该数据库或对象的所有操作权限。

用户自定义的角色也属于数据库一级的角色。用户可以根据实际情况定义自

己的一系列角色,并给每个角色授予合适的权限,对角色的权限的管理同数据库

用户相同。有了角色,就不用直接管理每个具体的数据库用户的权限,而只需将

数据库用户放置到合适的角色中即可。当工作职能发生变化时,只要更改角色的

权限即可,而无需更改角色中的成员的权限。只要权限没有被拒绝过,角色中的

成员的权限是角色的权限加上它们自己所具有的权限。如果某个权限在角色中是

拒绝的,则角色中的成员就不能再拥有此权限,即使为此成员授予了此权限。

用户角色的创建,可利用存储过程来进行:

sp_addrole[@rolename=] '新角色名'

[,[@ownername=] '该角色所有者']

4.视图

SQL Server广泛使用视图机制进行安全性控制,限制用户的访问范围与访问

权限。通过定义不同的视图及有选择地授予视图上的权限,可以将用户、组或角

色限制在不同的数据子集内。无论在基础表(一个或多个)上的权限集合有多大,

都必须授予、拒绝或收回访问视图中数据子集的权限。

例如,用户user1只能检索Student表中计算机系的学生的信息,可以先建立

视图CS_Student,再给user1授予对CS_Student的查询权。

CREATE VIEW CS_Student

AS

SELECT * FROM Student WHERE 系='计算机系';

GRANT SELECT ON CS_Student TO user1;

5.数据加密

Microsoft SQL Server的加密机制可以对SQL Sercer中存储的登录和应用程

序角色密码、作为网络数据包而在客户端和服务器端之间发送的数据、存储过程

定义、函数定义、视图定义、触发器定义、默认值定义、规则定义等数据库对象

进行加密。

SQL Server系统表中存储的登录和应用程序角色密码总是被加密。这可防止

用户(包括系统管理员)查看任何密码,包括自己的密码。此外,在网络上发送

应用程序角色密码之前,当应用程序角色激活时,就可以对其进行加密。

SQL Server允许对客户端和服务器端之间发送的数据进行加密,这样可确保

任何在网络上截取数据包的应用程序或用户无法查看保密或敏感数据。SQL

Server 可以使用安全套接字层(SSL)加密在应用程序计算机与SQL Server 实例

之间传输的所有数据。SSL加密在超级套接字Net-Library(和

)内执行并应用于SQL Server 2000所支持的所有计算机间协议。启用加

密会降低Net-Library的性能。

6.审计

Microsoft SQL Server 2000提供审核功能,用以跟踪和记录每个SQL Server

实例上已发生的活动(如成功和失败的记录)。SQLServer2000还提供管理审核记

录的接口,即SQL事件探查器。只有sysadmin固定安全角色的成员才能启用或

修改审核,而且审核的每次修改都是可审核的事件。

可以通过SQL事件探查器审核导致事件发生的用户、发出请求的计算机名、

事件的时间、类型、所访问的数据库对象、SQL语句的文本、事件的成功与否等

信息。

4.2 数据库完整性

在第三章中,读者已对关系模型上的完整性约束有了一个全面、完整的了解。本节将

从较高层次来对数据库完整性的分类、定义和验证,作一般性的讲解,这对进一步掌握关系

模型的完整性约束,具有指导性作用。

4.2.1 数据库完整性的概述

数据库的安全性和完整性是数据库安全保护的两个不同的方面。数据库的安

全性保护数据库以防止不合法用户故意造成的破坏,数据库的完整性保护数据库

以防止合法用户无意中造成的破坏。从数据库的安全保护角度来讲,完整性和安

全性是密切相关的。

数据库的完整性的基本含义是指数据库中数据的正确性、有效性和相容性,

其主要目的是防止错误的数据进入数据库。正确性是指数据的合法性,例如数值

型数据只能含有数字而不能含有字母。有效性是指数据是否属于所定义域的有效

范围。相容性是指表示同一事实的两个数据应当一致,不一致即是不相容。

数据库系统是对现实系统的模拟,现实系统中存在各种各样的规章制度,以

保证系统正常、有序地运行。许多规章制度可转化为对数据的约束,例如,单位

人事制度中对职工的退休年龄会有规定,也可能一个部门的主管不能在其他部门

任职、职工工资只能涨不能降等。对数据库中的数据设置某些约束机制,这些添

加在数据上的语义约束条件称为数据库完整性约束条件,简称“数据库的完整

性”,系统将其作为模式的一部分“定义”于DBMS中。DBMS必须提供一种机

制来检查数据库中数据的完整性,看其是否满足语义规定的条件,这种机制称为

“完整性检查”。为此,数据库管理系统的完整性控制机制应具有三个方面的功

能,来防止合法用户在使用数据库时,向数据库注入不合法或不合语义的数据:

 定义功能,提供定义完整性约束条件的机制。

 验证功能,检查用户发出的操作请求是否违背了完整性约束条件。

 处理功能,如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定

的动作来保证数据的完整性。

本节将讨论数据库完整性约束的分类、完整性约束的定义、完整性约束的验

证以及SQL Server中的完整性约束机制。

4.2.2 数据库完整性的分类

数据完整性检查是围绕完整性约束条件进行的,因此完整性约束条件是完整

性控制机制的核心。

数据库完整性约束分为两种:静态完整性约束和动态完整性约束。完整性约

束条件涉及到三类作用对象,即属性级、元组级和关系级。这三类对象的状态可

以是静态的,也可以是动态的。结合这两种状态,一般将这些约束条件分为静态

属性级约束、静态元组级约束、静态关系级约束、动态属性级约束、动态元组级

约束、动态关系级约束等6种约束。

1.静态完整性约束(状态约束)

静态完整性约束(Static Integrity Constraints),简称静态约束,是指数据库每

一确定状态时的数据对象所应满足的约束条件,它是反映数据库状态合理性的约

束,是最重要的一类完整性约束,也称“状态约束”。

在某一时刻,数据库中的所有数据实例构成了数据库的一个状态,数据库的

任何一个状态都必须满足静态约束。每当数据库被修改时,DBMS都要进行静态

约束的检查,以保证静态约束始终被满足。

静态约束又分为3种类型:隐式约束、固有约束和显式约束。

(1)隐式约束

隐式约束(Implicit Constraints)是指隐含于数据模型中的完整性约束,由数

据模型上的完整性约束完成约束的定义和验证。隐式约束一般由数据库的数据定

义语言(DDL)语句说明,并存于数据目录中,例如实体完整性约束、参照完整

性约束和用户自定义完整性约束,其具体内容已在3.6节作了详细介绍。

(2)固有约束

固有约束(Inherent Constraints)是指数据模型固有的约束。例如,关系的属

性是原子的,满足第一范式的约束。固有约束在DBMS实现时已经考虑,不必特

别说明。

(3)显示约束

隐式约束和固有约束是最基本的约束,但概括不了所有的约束。数据完整性

约束是多种多样的,且依赖于数据的语义和应用,需要根据应用需求显式地定义

或说明,这种约束称为数据库完整性的“显示约束”(Explicit Constraints)。

隐式约束、固有约束和显示约束这三种静态约束作用于关系数据模型中的属

性、元组、关系,相应有静态属性级约束、静态元组级约束和静态关系级约束。

(1)静态属性级约束

静态属性级约束是对属性值域的说明,是最常用也是最容易实现的一类完整

性约束,包括以下几个方面:

 对数据类型的约束(包括数据的类型、长度、单位、精度等)。例如,学号必须为

字符型,长度为8。

 对数据格式的约束。例如,规定学号的前两位表示入学年份,中间两位表示系的

编号,后四位表示顺序编号。出生日期的格式为。

 对取值范围或取值集合的约束。例如,规定学生的成绩取值范围为0~100,性别

的取值集合为[男,女],大学本科学生年龄的取值范围为14~29。

 对空值的约束。空值表示未定义或未知的值,它与零值和空格不同。有的属性允

许空值,有的不允许取空值。例如学生学号不能取空值,成绩可以为空值。

 其他约束。例如关于列的排序说明,组合列等。

(2)静态元组级约束

一个元组是由若干个列值组成的,静态元组级约束是对元组中各个属性值之

间关系的约束。如订货关系中包含订货数量与发货数量这两个属性,其中发货量

不得超出订货量;又如教师关系中包含职称、工资等属性,规定教授的工资不低

于1000元。

(3)静态关系级约束

静态关系级约束是一个关系中各个元组之间或者若干个关系之间常常存在

的各种联系的约束。常见的静态关系级约束有:

 实体完整性约束。

 参照完整性约束。

实体完整性约束和参照完整性约束是关系模型的两个极其重要的约束,称为关系的两个

不变性。

 函数依赖约束。大部分函数依赖约束都在关系模式中定义。

 统计依赖约束。统计依赖约束指的是字段值与关系中多个元组的统计值之间的约

束关系,如规定总经理的工资不得高于职工的平均工资的4倍,不得低于本部门职工平均工

资的3倍,其中,本部门职工的平均工资是一个统计值。

2.动态完整性约束(变迁约束)

动态完整性约束(Dynamic Integrity Constraints),简称动态约束,不是对数

据库状态的约束,而是指数据库从一个正确状态向另一个正确状态的转化过程中

新、旧值之间所应满足的约束条件,反映数据库状态变迁的约束,故也称“变迁

约束”。例如在更新职工表时,工资、工龄这些属性值一般只会增加,不会减少,

该约束表示任何修改工资、工龄的操作只有新值大于旧值时才被接受,该约束既

不作用于修改前的状态,也不作用于修改后的状态,而是规定了状态变迁时必须

遵循的约束。动态约束一般也是显式说明的。

动态约束作用于关系数据模型的属性、元组、关系,相应有动态属性级约束、

动态元组级约束和动态关系级约束。

(1)动态属性级约束

动态属性级约束是修改定义或属性值时应该满足的约束条件。其中包括:

 修改定义时的约束。例如,将原来允许空值的属性修改为不允许空值时,如果该

属性当前已经存在空值,则规定拒绝修改。

 修改属性值时的约束。修改属性值有时需要参考该属性的原有值,并且新值和原

有值之间需要满足某种约束条件。例如,职工工资调整不得低于其原有工资,学生年龄只能

增长等。

(2)动态元组级约束

动态元组约束是指修改某个元组的值时要参照该元组的原有值,并且新值和

原有值间应当满足某种约束条件。例如,职工工资调整不得低于其原有工资+工

龄×1.5等。

(3)动态关系级约束

动态关系级约束就是加在关系变化前后状态上的限制条件。例如,事务的一

致性,原子性等约束。动态关系级约束实现起来开销较大。

4.2.3 数据库完整性的定义与验证

如前所述,要实现由现实系统转换而来的数据库的完整性约束,需先定义约

束,并存储于DBMS的约束库中,一旦数据库中的数据要发生变化,则DBMS

将根据约束库中的约束,对数据库的完整性进行“验证”。

1.固有约束与隐式约束

固有约束是数据模型所固有的,在DBMS实现时已经考虑,不必额外作说明

和定义,只需在数据库设计时遵从这一约束即可。固有约束的验证由DBMS自动

完成。例如,对关系模型来说,数据库设计时要使关系的属性不可再分,满足原

子性。

隐式约束需利用数据库的数据定义语言(DDL)显式定义说明,将约束存储

在约束库中,当数据库被更新时,由数据库管理系统进行完整性约束验证。。例

如,对关系模型来说,利用SQL定义语言,定义相应的实体完整性约束、参照

完整性约束、CHECK约束、唯一约束等。

2.显式约束

显式约束的定义方法有过程化定义、断言定义方法、触发器定义方法等,过

程与触发器的定义已在第三章中作介绍,下面作一简单小结。

过程化定义方法利用过程(或函数)来定义和验证约束。由程序员将约束编

写成过程,加入到每个更新数据库的事务中,用以检验数据库更新有否违反规定

的约束,如果违反约束条件,则相应的数据更新事务将被异常中止。例如,要定

义和验证完整性约束“雇员的工资不能高于其部门经理的工资”,可以在每个有

关的数据库更新事务(如修改雇员工资、任命部门经理、修改部门经理的工资)

中,增加验证“雇员工资不能高于其部门经理工资”的过程,用该过程判断数据

库的更新有否违反该约束条件,如果违反约束条件,则相应的数据库更新事务将

被退回。

过程化定义的约束,DBMS只提供定义途径,不负责约束的验证,过程的定

义和验证由程序员在一个过程中由通用程序设计语言编制。这种方法既为程序员

编制高效率的完整性验证程序提供了有利的条件,同时也给程序员带来了很大的

负担。

断言定义方法使用一种约束定义语言来定义显式约束,是一种形式化方法。

一个断言就是一个谓词,表达了数据库在任何时候都应该满足的一个条件。约束

递归语言通常是关系演算语言的变种。显式约束的断言定义方法把约束集合和完

整性验证子系统严格分开。约束集合存储在约束库中,完整性验证子系统存取约

束库中的约束,将其应用到相应的数据库更新事务中,验证该事务是否违背完整

性约束。如发现更新事务违反约束,即退回该事务,否则,允许更新事务的进行。

创建断言的语句格式为:

CREAT ASSERTION <约束名> CHECK (<条件表达式>)

要删除断言,用DROP ASSERTION语句来实现,语法如下:

DROP ASSERTION <约束名>

触发器是当特定的事件(如对一个表的插入、删除、修改)发生时,对规则

的条件进行检查,如果条件成立,执行规则中的动作,否则不执行该动作。其验

证由数据库管理系统负责。

3.动态约束的定义

动态约束的定义,可以利用DBMS为显式约束定义提供的过程化定义方法和

触发器定义方法,开发人员通过比较变化前后的数据,决定是否允许数据状态的

改变。动态约束的验证过程遵循显式约束的验证过程。

例如,对于“员工的工资只能增加”这类约束,开发人员通过比较变化前后

的工资额,来验证是否违反了该动态约束。

4.2.4 SQL Server的完整性策略

上面介绍了完整性控制的一般方法,不同的数据库产品对完整性的支持策略

和支持程度不同,在实际的数据库应用开发时,一定要查阅所用的数据库管理系

统在关于数据库完整性方面的支持情况。本节主要介绍SQL Server的完整性控制

策略,如表6-1所示。

表4-1 SQL Server对数据库完整性的支持情况

完整性约束

固有约束

定义方式

数据模型固有

SQL Server支持情况

属性原子性

隐式约束

静态约束

数据库定义语表本身的完整实体完整性约束、唯一约束、

言(DDL) 性约束 CHECK约束、非空约束、默

认约束

表间的约束

过程化定义

参照完整性约束、触发器

存储过程、函数

不支持

支持

存储过程、函数

支持

显式约束

动态约束

断言

触发器

过程化定义

触发器


本文标签: 用户 数据库 约束 数据 权限