4.9 数据控制语言(DCL)
SQL语言除了包含数据定义、数据查询和数据更新的语言外,还提供了保证数据库安全的数据控制语言。由于数据库管理系统是一个多用户系统,为了控制用户对数据的存取权利、保持数据的共享及完全性,SQL语言提供了一系列的数据控制功能。其中,主要包括安全性控制、完整性控制、事务控制和并发控制。
本节首先简单介绍数据库的安全问题,然后讨论如何利用DCL提供的语句进行数据库的安全访问控制。完整性控制主要是由数据定义语言完成的,本节不再重复,此外本节会简单介绍事务控制和并发控制,如果读者想对这方面进行深入了解,可参考其他数据库理论的专著。
4.9.1 数据库安全
数据库安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。在DBMS中一般都会提供一些保证数据安全的手段,供DBA选用。常用的手段如下。
● 视图定义:为不同的用户定义不同的视图,可以限制各个用户的访问范围,这在介绍视图的特点时讲解过。
● 访问控制:控制各个用户对数据库资源的控制权利。
● 数据加密:以上两种方法都是防止从数据库系统中窃取数据,而对数据进行加密,则可以防止数据被窃取后数据的保密性。
● 跟踪审查:该手段是一种监视措施,它对保密数据进行跟踪并记录所有的访问活动。
在SQL语言的数据控制语言中提供了访问控制的语句,下面会具体讨论。关于数据加密和跟踪审查,读者可以参考其他书籍。
4.9.2 访问控制
访问控制(Access Control)是对用户访问数据库各种资源(包括基表、视图、各种目录以及实用程序等)的权利(包括创建、撤销、查询、增、删、改、执行等)的控制。这是数据库安全的基本手段。几乎每种DBMS都提供这方面的功能。在同一个DBMS下可能建立多个数据库,访问控制在这些数据库之间是互相独立的,一个用户在一个数据库所获得的访问权不能用于其他数据库。数据库的用户按其访问权利的大小,一般可以分为以下3类。
1.一般数据库用户
在SQL中,一般数据库用户称为“具有CONNECT特权的用户”。这类用户可以与数据库连接,并具有如下权限:
● 按照授权可以查询或更新数据库中的数据;
● 可以创建视图或定义数据的别名。
2.具有部分数据库特权的数据库用户
这类用户称为“具有RESOURCE特权的用户”,除了具有一般用户所有的权限外,还有下列权限:
● 可以创建表、索引;
● 可以授予或收回其他数据库用户对其所创建的数据对象所拥有的访问权;
● 有权对其所创建的数据对象跟踪审查。
3.具有DBA特权的数据库用户
DBA拥有支配整个数据库资料的特权。这种用户除了具有上面两种用户的权限外,还有如下权限:
● 有权访问数据库中的任何数据;
● 不但可以授予和收回数据库用户对数据对象的访问权,还可以批准或收回数据库用户;
● 有权对数据库进行调整、重组和重构;
● 有权对整个数据库进行跟踪审查。
具有DBA特权的用户对数据库拥有最大的特权,因此也对数据库负有特别的责任。DBA权限不得任意扩散。
不同的用户对数据库有不同的访问权,DBMS从下列两个方面来控制用户的访问:
● 用户的标识和鉴别:标识用户使用唯一的标识符;鉴别用户的真伪使用密码或只有用户具有的物品(例如IC卡)或者利用用户的个人特征鉴别(例如签名、指纹等)。
● 授权:授权就是规定和限制用户的权限。
SQL的数据控制语言提供了访问控制的功能。SQL利用GRANT和REVOKE语句完成对用户权限的设定。下面一节将详细介绍这两种语句。
4.9.3 授权操作和收回权限操作
1.授权
授权就是给予用户一定的特权,这是对用户访问权限的规定和限制。SQL语言使用GRANT语句为用户授予系统权限,其语法格式为:
GRANT <权限>[,<权限>…] [ON <对象类型><对象名>] TO <用户名>|PUBLIC[,<用户名>…] [WITH GRANT OPTION];
其中<权限>可以是SELECT、INSERT、DELETE、UPDATE这些操作权限,或者可以用ALL PRIVILEGES表示以上所有操作权限。
<对象类型>一般是TABLE,表示表或视图。<对象类型>还可以是数据库,用DATABASE表示,对数据库可以有建立表(CREATETAB)的权限,该权限属于DBA,可由DBA授予普通用户,普通用户被授予此权限后,可以创建基本表。
<用户名>用来指定被授予权限的个人,可以把权限同时授予多个用户。如果<用户名>是PUBLIC表示则该权限授予所有用户。
如果使用了WITH GRANT OPTION选项,则获得该权限的用户还可以把这种权限再授予其他用户。如果没有指定WITH GRANT OPTION选项,则被授予该权限的用户只能使用该权限,而不能授予其他人。
例如,把修改STUDENTS表的权限授予用户USER1,但他不能授予该权限给他人。SQL语句表示如下:
GRANT UPDATE ON TABLE STUDENT TO USER1;
再例如,把对COURSE和SC表的所有权限都授予用户USER2,SQL语句表示如下:
GRANT ALL PRIVILEGES ON TABLE COURSE,SC TO USER2 WITH GRANT OPTION;
2.收回权限
数据库管理员(DBA)或其他授权者可以使用REVOKE语句收回权限,其语法格式为:
REVOKE <权限>|<角色> [,<权限>…] ON <对象类型><对象名>] FROM <用户名>|PUBLIC[,<用户名>…];
在授权操作中,利用WITH GRANT OPTION可以传递权限。在收回特权时,不但从语句中指明的用户收回了权限,而且还要收回由这个用户转授出去的权限。
例如,收回用户USER2对SC表的所有权限,用SQL语句表示如下:
REVOKE ALL PRIVILEGES ON TABLE SC FROM USER2;
此语句的作用不仅收回了USER2的权限,而且如果USER2曾经把权限授予给其他用户,那么该语句也会收回该权限。
DBMS为每个数据库在其数据目录中设一张授权表。此表的主要内容有用户标识、数据对象和访问特权。这里的用户不一定是用户个人,也可以是团体、程序或终端。
用户对自己建立的基表和视图拥有完全的操作权限,可以用GRANT语句授予某些权限给其他用户,并且权限可以传播。所有授予出去的权限在必要时又都可以用REVOKE语句收回,可见SQL的数据控制语言对权限的管理提供了灵活的操作。
4.9.4 事务控制和并发控制简介
事务是并发控制的基本单位,也是恢复的基本单位。在SQL中支持事务的概念,所谓事务,是用户定义的一个操作序列(集合)。这些操作要么都做,要么一个都不做,是一个不可分割的整体。SQL提供了事务提交和事务撤销两种命令。
1.事务提交
事务提交的命令为:COMMIT[WORK]。
事务提交标志着对数据库的某种应用操作成功地完成,所有对数据库的操作都必须作为事务提交给系统时才有效。事务一经提交就不能撤销。
2.事务撤销
事务撤销的命令是:ROLLBACK[WORK]。
事务撤销标志着相应事务对数据库操作失败,因而要撤销对数据库的改变,即要“回滚”到相应事务开始时的状态。当系统非正常结束时(如掉电、系统死机),将自动执行ROLLBACK命令。
数据库作为共享的资源,允许多个用户程序并行地存取数据。当多个用户并行地操作数据库时,需要通过并发控制对它们加以协调、控制,以保证并发操作的正确执行,并保证数据库的一致性。
在SQL中,并发控制采用封锁技术实现。当一个事务欲对某个数据对象操作时,可申请对该对象加锁,取得对数据对象的一定控制,以限制其他事务对该对象的操作。