第11章 数据库的安全管理

第11章 数据库的安全管理

随着社会的进步和发展,数据安全越来越被人们所重视。在数据库管理中,保证数据库中的数据不被其他用户非法访问已经成为一个非常重要的课题,SQL中提供了对数据库安全性的支持。本章讲解的内容主要包括用户管理、权限管理和角色管理等内容。

11.1 SQL安全概述
SQL提供了数据控制语言DCL对数据库进行统一的管理。伴随着数据库在Web开发中的应用,SQL安全的问题受到人们广泛的关注,各大数据库开发商都在努力提高自身产品的安全性,以保护自身用户的安全。

11.1.1 SQL安全的重要意义
数据库数据的丢失以及数据库被非法用户的侵入是破坏数据安全的两个重要因素。数据库数据的安全应能确保当数据库数据存储媒体被破坏时以及当数据库用户误操作时,数据库数据信息不至于丢失。另外,数据库系统应尽可能地堵住潜在的各种漏洞,防止非法用户利用它们侵入数据库系统。对于数据库数据的安全问题,数据库管理员可以参考有关系统双机热备份功能以及数据库的备份和恢复的相关知识。

11.1.2 SQL安全的对象
SQL数据库中的每种类型的对象,都可以分配特定类型的权限,这些权限因对象类型的不同而有所变化。这些对象包括表、视图、存储过程、默认值、索引、约束以及用户定义的数据类型等。
每种DBMS产品都扩展了标准的安全性对象,在通常情况下,大多数DBMS产品都支持以下几种安全性权限:

  • SELECT:允许用户ID使用SELECT查询数据。如用户U1在student表中被授与SELECT权限,则U1就可以查询student表中的数据。SQL允许对整个表授予取消SELECT权限,在SQL
    Server、SYBASE等数据库管理系统当中,同时也允许对表中的特定列授予SELECT权限。
  • INSERT:允许用户利用INSERT语句向表中插入数据。如用户U1在student表中被授予INSERT权限,则用户U1就可以向student表中插入数据。SQL中允许DBMS对数据表中某些特定的列限制此权限。因此,用户在向表中插入数据时,没有被授权的列就被插入NULL。
  • UPDATE:允许用户使用UPDATE语句更新表中的数据。如用户U1在student表中被授予UPDATE权限,则用户U1就可以更新student表中的数据。
  • DELETE:允许用户使用DELETE语句删除表中的数据。
  • USAGE:允许用户使用列定义的域、用户定义的数据类型、字符集、顺序序列和转译等对象。
  • REFERENCES:允许用户在外键或检查约束中引用表或视图中的列。
  • TRIGGER:允许用户在表上创建触发器。

11.2 用户管理
数据库系统的用户是数据库系统的使用者。在数据库管理中,用户包括数据库管理员(DBA)和普通的数据库系统用户两类。数据库管理员是一种拥有特权的用户,数据库管理员有权在其所管理的数据库系统中执行包括具有最高权限的数据库操作,包括创新建数据库和用户、授予不同的用户权限和指定数据库系统等操作;普通数据库用户只具有检索、插入、删除或更新等数据操作的权限。
11.1.1 创建用户–CREATE USER
在数据库管理中,可以新创建一个用户实现对数据库管理系统的管理和操作。
【语法说明】
在SQL中创建用户的语句如下所示。

CREATE USER user_name

代码中的user_name表示创建用户的名称。
在不同的数据库管理系统当中,创建用户的语法有所不同。下面再介绍一下在SQL Server数据库中创建用户的语法结构。
在SQL Server数据库中创建用户的语法结构如下所示。

CREATE USER user_name [{FOR |FROM}
{
 LOGIN login_name
 | CERTIFICATE cert_name
 | ASYMMETRIC KEY asy_name
}
| WITHOUT LOGIN
]
[WITH DEFAULT_SCHEMA=schema_name]

代码中的各项参数说明如下所示。

  • user_name:表示指定在数据库中创建用户的名称。该名称的长度最多可以是128个字符。
  • login_name:表示要创建数据库用户的登录名,在SQL Server中,login_name必须是有效的登录名。
  • cert_name:表示指定要创建数据库用户的证书。
  • asy_name:指定要创建数据库用户的非对称密钥。
  • schema_name:表示指定服务器为数据库用户解析对象名时将搜索的第一个架构。

不能使用CREATE USER语句创建guest用户,因为每个数据库中都已经存在guest用户。但是,可以通过使用GRANT CONNECT权限来启用guest用户,其实现的语句结构如下所示。

GRANT CONNECT TO guest;

【上机实战】
在Oracle数据库“DB_TEXT”中创建一个用户“USER1”,密码为“123456”,其实现的代码如下所示。

CREATE USER USER1 
IDENTIFIED BY 123456;

代码执行以后,用户被创建。在SQL Developer中可以查看所创建的用户,如图11.1所示。
在这里插入图片描述
图11.1 查看在ORACLE数据库中创建的用户
下面再通过一个示例来说明如何在SQL Server数据库中创建用户。
在SQL Server数据库中创建用户User1,密码为123456。

CREATE LOGIN User1
WITH PASSWORD='123456';
USE MyDatas;
CREATE USER User1
FOR LOGIN User1;

代码执行以后,用户User1创建完成。在SQL Server2005中可以查看所创建的用户,如图11.2所示。
在这里插入图片描述
图11.2 在SQL Server2005中创建的用户
11.1.2 修改用户–ALTER USER
数据库用户创建以后,还可以对其进行修改。修改数据库用户通过ALTER USER语句来实现。
【语法说明】
在SQL SERVER数据库中,ALTER USER语句的语法结构如下所示。

ALTER USER userName  
     WITH <set_item> [ ,...n ]
<set_item> ::= 
     NAME = newUserName 
     | DEFAULT_SCHEMA = schemaName
     | LOGIN = loginName

代码中的各项参数说明如下所示:

  • userName:指定在此数据库中用于识别该用户的名称。
  • LOGIN = loginName:通过将用户的安全标识符 (SID) 更改为另一个登录名的 SID,使用户重新映射到该登录名。
  • NAME = newUserName:指定此用户的新名称。newUserName 不能已存在于当前数据库中。
  • DEFAULT_SCHEMA = schemaName:指定服务器在解析此用户的对象名时将搜索的第一个架构。

注意:拥有 ALTER ANY USER 权限的用户可以更改任何用户的默认架构。更改了架构的用户可能会在不知情的情况下从错误表中选择数据,或者从错误架构中执行代码。

【上机实战】
将在SQL SERVER数据库中创建的用户名称User1修改为User2。

ALTER USER User1 WITH NAME = User2;

代码执行以后,数据库用户User1的名称被修改为User2,如图11.3所示。
在这里插入图片描述
图11.3 修改数据库用户的名称
在Oracle数据库中,可以通过ALTER USER语句修改数据库用户的密码,如下面的代码所示。

ALTER USER USER1 identified by 78910

代码执行以后,数据库用户USER1的密码被修改为“78910”
11.1.3 删除用户–DROP USER
如果数据库用户不再需要,可以将其删除。SQL中提供了DROP USER语句删除已经创建的用户。
【语法说明】
DROP USER语句的语法结构如下所示。

DROP USER user_name

代码中user_name表示要删除用户的名称。
【上机实战】
删除在Oracle数据库中创建的用户User1,其实现的代码如下所示。

DROP USER user1

代码执行以后,数据库用户user1被删除。

11.1.4 创建架构–CREATE SCHEAM
架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。虽然 SQL Server 2000 包含 CREATE SCHEMA 语句,但实际上并不会像上面所定义的那样创建架构。在 SQL Server 2000 中,数据库用户和架构是隐式连接在一起的。每个数据库用户都是与该用户同名的架构的所有者。对象的所有者在功能上与包含它的架构所有者相同。因而,SQL Server 2000 中的完全限定名称的“架构”也是数据库中的用户。因此,从 SQL Server 2000 数据库中删除用户之前,管理员需要删除该用户所拥有的所有对象或更改这些对象的所有者。
在 SQL Server 2005 中,架构独立于创建它们的数据库用户而存在。可以在不更改架构名称的情况下转让架构的所有权。并且可以在架构中创建具有用户友好名称的对象,明确指示对象的功能。例如,除了 accounting.ap.sandra.reconciliation 外,您还可以创建名为 accounting.ap.invoice.reconciliation 的架构。因为“invoice”不是用户,所以从数据库中删除用户后,无需更改此名称。这就简化了数据库管理员和开发人员的工作。
【语法说明】
CREATE SCHEMA语句的语法结构如下所示。

CREATE SCHEMA schema_name_clause [ <schema_element> [ ...n ] ]
<schema_name_clause> ::=
    {
    schema_name
    | AUTHORIZATION owner_name
    | schema_name AUTHORIZATION owner_name
    }
<schema_element> ::= 
    { 
        table_definition | view_definition | grant_statement | 
        revoke_statement | deny_statement 
    }

语句中的各项参数说明如下所示。

  • schema_name:在数据库内标识架构的名称。
  • AUTHORIZATION
    owner_name:指定将拥有架构的数据库级主体的名称。此主体还可以拥有其他架构,并且可以不使用当前架构作为其默认架构。
  • table_definition:指定在架构内创建表的 CREATE TABLE 语句。执行此语句的主体必须对当前数据库具有 CREATE TABLE 权限。
  • view_definition:指定在架构内创建视图的 CREATE VIEW 语句。执行此语句的主体必须对当前数据库具有 CREATE VIEW 权限。
  • grant_statement:指定可对除新架构外的任何安全对象授予权限的 GRANT 语句。
  • revoke_statement:指定可对除新架构外的任何安全对象撤消权限的 REVOKE 语句。
  • deny_statement:指定可对除新架构外的任何安全对象拒绝授予权限的 DENY 语句。

【上机实战】
将名称为 Marjorie 的 SQL Server 登录名和用户及名称为 Auditing 的新架构添加到 AdventureWorks 数据库中,并指定 Marjorie 为 Auditing 架构的所有者,其实现的代码如下所示。

CREATE LOGIN Marjorie
    WITH PASSWORD = '8fdKJl3$nlNv3049jsKK';
USE AdventureWorks;
CREATE USER Marjorie FOR LOGIN Marjorie
GO
CREATE SCHEMA Auditing AUTHORIZATION Marjorie;
GO

11.1.5 删除架构–DROP SCHEAM
删除架构使用DROP SCHEAM语句来实现。
【语法说明】
DROP SCHEAM语句的语法结构如下所示。

DROP SCHEMA schema_name

语句中的schema_name参数表示架构在数据库中所使用的名称。

注意:要删除的架构不能包含任何对象。如果架构包含对象,则 DROP 语句将失败。从SQL Server 2005
开始,架构的行为发生了更改。因此,假设架构与数据库用户等价的代码不再返回正确的结果。旧目录视图(包括
sysobjects)不应该用在曾使用过下列任何 DDL 语句的数据库中:CREATE SCHEMA、ALTER SCHEMA、DROP SCHEMA、CREATE USER、ALTER USER、DROP USER、CREATE ROLE、ALTER ROLE、DROP ROLE、CREATE APPROLE、ALTER APPROLE、DROP APPROLE 或 ALTER
AUTHORIZATION。在这类数据库中,必须改用新目录视图。新的目录视图将采用在 SQL Server 2005中引入的使主体和架构分离的方法。有关目录视图的详细信息,请参阅目录视图 (Transact-SQL)。

【上机实战】
删除前面创建的架构Auditing。

DROP SCHEMA Auditing

11.3 角色管理
角色是一个工具,权限能够被授予给一个角色,角色也能被授予给另一个角色或用户,用来简化权限的管理。简单地说,角色存在的目的就是为了使权限的管理变得轻松。角色在刚刚创建时没有任何权限,需要使用权限授予的语句为新创建的角色分配权限。当把某个角色授予用户或从用户处收回时,就同时授予或收回了该角色代表的所有权限。

11.3.1 创建角色–CREATE ROLE
角色是数据库级别的安全对象,是多种权限的集合,在应用角色之前首先需要创建角色。
【语法说明】
在SQL中创建角色的语法结构如下所示。

CREATE ROLE role_name[WITH ADMIN]
{CURRENT_USER | CURRENT_ROLE}

代码中的role_name表示创建角色的名称。语句中通过WITH ADMIN语句会立刻分配一个角色给当前有效的角色或当前有效的用户。该语句的默认值是WITH ADMIN CURRENT_USER。
并不是所有的DBMS系统都支持CREATE ROLE语句创建角色。在SQL Server2000中不支持该语句。然而,在SQL Server2005和Orache数据库当中支持CREATE ROLE语句。下面就分别介绍一下SQL Server2005和Orache数据库中如何创建角色。

1.在SQL Server2005数据库中创建角色
在SQL Server2005中,创建角色的语法格式如下所示。
CREATE ROLE role_name [AUTHORIZATION owner_name]
代码中的role_name表示创建角色的名称,owner_name表示将要拥有新角色的数据库用户或角色。
如果在创建角色时使用AUTHORIZATION选项,则需要具有以下几个权限:

  • 如果要将角色的所有权限分配给另一个用户,则需要该用户具有IMPERSONATE权限。
  • 如果要将角色的所有权限分配给另一个角色,则需要具有对该角色具有ALTER权限或被分配角色的成员身份。
  • 如果要将角色的所有权分配给应用程序角色,则需要对应用程序角色具有ALTER权限。

注意:若要在数据库中创建角色,需要对数据库具有CREATE ROLE权限。

下面通过一个示例来说明如何在SQL Server2005中创建角色。
【上机实战】
在SQL Server2005数据库中创建角色T_Role,其实现的代码如下所示。

CREATE ROLE T_Role

代码执行以后,角色创建成功,如图11.4所示。
在这里插入图片描述
图11.4 在SQL Server2005数据库中创建的角色

2.在Oracle数据库中创建角色
在Oracle数据库中,首先创建一个角色,然后再将其作为一个用户,通过GRANT命令来分配权限。当用户需要访问有密码保护的角色权限时,可以使用SET ROLE命令在该角色上设置密码。
在Oracle数据库中,创建角色的语法格式如下所示。

CREATE ROLE role_name
[NOT INDENTIFIED | 
[INDENTIFIED [BY password | EXTERNALLY | GLOABALLY]]
];

代码中的role_name表示创建的角色名,NOT INDENTIFIED选项表示不需要口令验证,而INDENTIFIED选项则表示需要验证口令,BY password表示指定本地用户口令,如果在建立角色时使用口令,则用户在使用时也要给出相应的口令。EXTERNALLY表示指定为外部用户,该用户用外部服务进行验证。
【上机实战】
在Oracle数据库中创建角色T_Role。

CREATE ROLE T_Role
IDENTIFIED BY 123456

代码执行以后,角色创建成功,在SQL Developer中可以查看所创建的角色“T_Role”,如图11.5所示。
在这里插入图片描述
图11.5 在Oracle数据库中创建的角色

说明:创建角色之后,就可以把角色授予用户ID或其他用户角色。

11.3.2 设置角色-- SET ROLE
在SQL中,使用GRANT语句实现把一个或者多个角色分配给一个或多个授权ID。
【语法说明】
使用GRANT语句实现授予角色的语法结构如下所示。

GRANT role_name1,role_name2,…,role_nameN
TO user | Role | PUBLIC
[WITH ADMIN OPTION]

代码中的各项参数说明如下所示。

  • GRANT:表示用于指定一个或多个角色的名称。
  • TO:表示用于指定一个或者多个授权ID,如果指定的授权ID多于一个,则使用逗号隔开。
  • PUBLIC:表示指定的授权符,是指把角色授予所有的数据库用户。
  • WITH ADMIN OPTION:是可选择的项,选择该选项之后,则表示允许被授权的用户将指定的系统特权或角色授予其他用户或角色。

【上机实战】
在Oracle数据库中,将角色T_Role分配给用户User1,并且使用户User1具有将角色T_Role授予其他用户的权限,其实现的代码如下所示。

GRANT T_Role
TO User1
WITH ADMIN OPTION

代码执行以后,角色T_Role被分配给了用户User1。
可以把多个角色同时授予多个授权ID或者用户ID,请看下面的示例。
将角色T_Role和角色T_Role1授予用户User1和用户User2,并使用户User1和用户User2同时具有将角色T_Role和角色T_Role1授予其他用户的权限,其实现的代码如下所示。

GRANT T_Role,T_Role1
TO User1,User2
WITH ADMIN OPTION

代码执行以后,角色T_Role和角色T_Role1被授予用户User1和用户User2。

11.3.3 删除角色–DROP ROLE
如果想删除已经创建的角色,可以通过DROP语句实现。
【语法说明】
在SQL中,删除角色的语法结构如下所示。

DROP ROLE role_name

代码中的role_name表示删除角色的名称。
【上机实战】
在SQL Server2005数据库中,使用DROP ROLE语句删除角色T_Role,其实现的代码如下所示。

DROP ROLE T_Role

代码执行以后,角色T_Role被删除。
下面再通过一个示例来讲解一下,在在Oracle数据库中删除角色的实现方法。
在Oracle数据库中,使用DROP ROLE语句删除角色T_Role,其实现的代码如下所示。

DROP ROLE T_Role

代码执行以后,角色T_Role被删除。
从上面的两个示例可以看出,在SQL Server2005数据库中删除角色的实现方法与在Oracle数据库中删除角色的实现方法相同。

11.4 权限管理
在SQL中,可以给用户授予不同类型的权限,如果需要,还可以将权限收回。本节中将讲解一下有关权限管理方面的相关知识。

11.4.1 授予权限—GRANT
授予权限使用GRANT语句来实现。使用GRANT语句授权用户和角色可以访问和使用数据库对象。在创建了表和视图等数据库对象之后,只有在使用GRANT语句向其他用户授予访问权限之后,该用户才可以对此对象执行SQL语句。
【语法说明】
在SQL中,使用GRANT语句实现对用户授予权限的语法格式如下所示。

GRANT Object_privilege | ALL
ON schema.object
TO User | Role | PUBLIC
[WITH GRANT OPTION]

代码中的各项参数说明如下所示:

  • Object_privilege:表示对象的权限,这些权限包括ALTER、DELETE、EXECUTE、INDEX、INSERT、SELECT、UPDATE和TRIGGER等,如果需要列出多种权限,则需要通过逗号将这些权限的名称隔开。
  • ALL:如果使用ALL关键字,则表示系统将把所有的权限都授予该对象。
  • ON:表示要授予权限的数据库对象名称,如表名、视图名等。
  • TO:表示指明要授予权限的用户或角色。
  • PUBLIC:如果使用PUBLIC关键字,则表示将授权给数据库中所有的用户。
  • WITH GRANT OPTION:该语句为可选项,如果选择该选项,则表示允许被授权的用户将权限再授予其他用户或角色。

【上机实战】
在Oracle数据库中,创建数据库用户USERS,并且将员工信息表(T_EMPLOY)的创建者所拥有的SELECT、INSERT,UPDATE权限授予用户USERS,其实现的代码如下所示。

CREATE USER USERS IDENTIFIED BY 123456;
GRANT SELECT,INSERT,UPDATE
ON T_EMPLOY
TO USERS
WITH GRANT OPTION

代码执行以后,用户USERS具有了对员工信息表(T_EMPLOY)进行SELECT、INSERT和UPDATE的操作权限。
下面再看一下在SQL Server数据库中授予权限的实现方法。
在SQL Server数据库中,创建数据库用户USERS,并且将员工信息表(tb_ygxx)的创建者所拥有的SELECT、INSERT,UPDATE权限授予用户USERS,其实现的代码如下所示。

CREATE LOGIN USERS
WITH PASSWORD='123456';
USE MyDatas;
CREATE USER USERS
FOR LOGIN USERS;
GRANT SELECT,INSERT,UPDATE
ON tb_ygxx
TO USERS
WITH GRANT OPTION

代码执行以后,用户USERS具有了对员工信息表(tb_ygxx)进行SELECT、INSERT和UPDATE的操作权限。

11.4.2 收回权限—REVOKE
收回权限是指将所有授予的权限在必要时由数据库管理员或授权者收回。可以撤消指定的一个或多个用户上的角色或者是用户和角色标识上的一个或一组指定的权限。与取消角色相类似,撤消权限也是使用REVOKE语句来实现的。
【语法说明】
在SQL中,使用REVOKE语句实现对用户收回权限的语法格式如下所示。

REVOKE [GRANT OPTION FOR] Object_privilege | ALL
ON schema.object
FROM User | Role | PUBLIC
RESTUICT | CASCADE

代码中的各项参数说明如下所示:

  • GRANT OPTION FOR:只有在GRANT语句中使用了WITH GRANT
    OPTION语句时,在REVOKE语句中使用的GRANT OPTION FOR语句才能够起作用。在使用了GRANT OPTION
    FOR语句之后,相当于取消了用户将权限再授予其他用户的权限。
  • ALL:如果使用ALL关键字,则表示系统将撤消对象上所有的设置权限。
  • ON:表示要撤消权限的数据库对象的名称,如表名、视图名等。
  • FROM:表示指明要撤消权限的用户或角色。如果有多个用户或角色,则用户名称或角色名称之间用逗号隔开。
  • PUBLIC:如果使用PUBLIC关键字,则表示对数据库中的所有用户撤消该权限。
  • RESTUICT:如果指定该关键字,如果该权限已经被用户又传递给了其他的用户,则这个权限不会被取消。
  • CASCADE:如果指定该关键字,如果该权限已经被用户又传递给了其他的用户,则这个权限被取消,同时由该用户传递给其他用户的该权限也同时被取消。

【上机实战】
在Oracle数据库中,收回数据库用户USERS对员工信息表(T_EMPLOY)的创建者所拥有的UPDATE权限,其实现的代码如下所示。

REVOKE UPDATE
ON T_EMPLOY
FROM USERS

代码执行以后,用户USERS对员工信息表(T_EMPLOY)的UPDATE权限被取消,用户此时只具有对该表的SELECT和INSERT两个权限。
使用REVOKE语句还可以同时撤销数据库用户所拥有的多个权限,我们再看下面的示例。
在Oracle数据库中,收回数据库用户USERS对员工信息表(T_EMPLOY)的创建者所拥有的UPDATE、INSERT和DELETE权限,其实现的代码如下所示。

REVOKE UPDATE
ON T_EMPLOY
FROM USERS

代码执行以后,用户USERS对员工信息表(T_EMPLOY)的UPDATE、INSERT和DELETE权限都被取消,用户此时只具有对该表的只具有查询的权限。
下面再讲解一下在SQL Server数据库中收回数据库用户权限的实现方法。
使用REVOKE语句取消11.2.1节中授予用户USERS的UPDATE权限,其实现的代码如下所示。

REVOKE UPDATE
ON tb_ygxx
FROM USERS
CASCADE

代码执行以后,用户USERS对员工信息表(tb_ygxx)的UPDATE权限被取消,用户此时只具有对该表的SELECT和INSERT两个权限。
通过下面的代码修改员工信息表(tb_ygxx)中的数据信息。

UPDATE tb_ygxx
SET 姓名='王刚'
WHERE 编号='1005'

代码执行以后,数据库系统提示“USERS”用户没有对员工信息表(tb_ygxx)的修改权限,如图11.6所示。
在这里插入图片描述
图11.6 撤销UPDATE权限之后无法修改数据表中的数据信息
从图中可以看出,以“USERS”用户身份登录数据库系统之后,由于数据库系统撤销了“USERS”用户对员工信息表(tb_ygxx)的修改权限,因此数据库系统决绝了对员工信息表(tb_ygxx)执行修改数据修改的操作。

11.4.3 查询权限控制
查询权限控制指的是SELECT权限控制,是指允许用户使用表或视图查询数据信息。当数据库对象被创建以后,只有该对象的创建者拥有所有权限,而其他数据库用户则不具有任何的权限。因此,如果要使某一用户具有查询被创建的数据库对象的权限,就必须通过GRANT语句将创建的对象(如表或视图)的SELECT权限授予该用户。
【语法说明】
实现查询权限控制的语句结构如下所示。

GRANT SELECT [(column1,column2,…,column)]
ON Table_name | View_name
TO User | Role | PUBLIC
[WITH GRANT OPTION]

代码中的column1,column2,…,column表示用于指定要授权数据库中的表或视图中的一列或者多列,如果不指明列名,则表示将对数据表或视图中的整个列都授予SELECT权限。Table_name表示授予权限的数据库表名称,而View_name则表示授予权限视图的名称。
【上机实战】
在SQL SERVER数据库中,将员工信息表(tb_ygxx)的创建者所拥有的SELECT权限授予用户USERS,并且使用户USERS具有将该权限授予其他用户的权限。

GRANT SELECT 
ON tb_ygxx
TO User1
WITH GRANT OPTION

代码执行以后,用户USERS将对员工信息表(tb_ygxx)具有查询的权限。同时也可以将其获得的查询权限授予其他用户。
通过下面的代码可以查询员工信息表(tb_ygxx)中的数据信息。

SELECT * FROM tb_ygxx

代码执行以后,其执行结果如图11.7所示。
在这里插入图片描述
图11.7 员工信息表(tb_ygxx)中的数据信息
由于用户USERS只具有对员工信息表(tb_ygxx)的查询权限,因此无法对员工信息表(tb_ygxx)执行插入、更新和删除等操作。如通过下面的语句向员工信息表(tb_ygxx)中插入数据。

INSERT INTO TB_YGXX(编号,姓名,性别,年龄) 
VALUES('1010','张力','女',35)

代码执行以后,数据库系统提示“USERS”用户没有对员工信息表(tb_ygxx)的插入数据权限,如图11.8所示。
在这里插入图片描述
图11.8 无法向数据库中插入数据的提示信息
从图中可以看出,以“USERS”用户身份登录数据库系统之后,由于数据库系统只具有对员工信息表(tb_ygxx)的查询权限,并没有向数据表中插入数据的权限。因此数据库系统决绝了对员工信息表(tb_ygxx)执行插入数据的操作。
也可以对数据表的一列或几列授予SELECT的权限。
在SQL SERVER数据库中,将员工信息表(tb_ygxx)的创建者所拥有的SELECT权限授予用户USERS,并且只具有查询数据表中的“编号”、“姓名”、“性别”和“年龄”字段的权限,其实现的代码如下所示。

GRANT SELECT(编号,姓名,性别,年龄) 
ON tb_ygxx
TO USERS

代码执行以后,用户USERS将对员工信息表(tb_ygxx)中的“编号”、“姓名”、“性别”和“年龄”字段具有查询的权限。
此时如果通过下面的代码查询员工信息表(tb_ygxx)中所有字段的数据信息,则会弹出如图11.9所示的错误提示信息,提示用户“USERS”不具有查询“出生日期”、“籍贯”和“联系电话”等字段的权限。

SELECT * FROM TB_YGXX

在这里插入图片描述
图11.9 对数据表的一列或几列授予SELECT权限
从上图可以看出,用户“USERS”不具有查询“出生日期”、“籍贯”、“联系电话”和“联系地址”字段的权限。如果只查询用户“USERS”对员工信息表(tb_ygxx)有查询权限的字段,如下面的代码所示。
SELECT 编号,姓名,性别,年龄 FROM TB_YGXX
代码执行以后,将会查询出员工信息表(tb_ygxx)中“编号”、“姓名”、“性别”和“年龄”字段中的数据信息,如图11.10所示。
在这里插入图片描述
图11.10 查询数据表中具有权限字段中的数据信息

11.4.4 插入权限控制
插入权限控制即INSERT权限控制,是指只允许用户向表中添加数据而不能查询、修改以及删除数据。
【语法说明】
实现插入权限控制的语句结构如下所示。

GRANT INSERT
ON Table_name | View_name
TO User | Role | PUBLIC
[WITH GRANT OPTION]

代码中的Table_name表示授予权限的数据库表名称,而View_name则表示授予权限的视图名称。
【上机实战】
在SQL SERVER数据库中,将员工信息表(tb_ygxx)的创建者所拥有的INSERT权限授予用户USERS,并且使用户USERS具有将该权限授予其他用户的权限。

GRANT INSERT 
ON tb_ygxx
TO USERS
WITH GRANT OPTION

代码执行以后,用户USERS将对员工信息表(tb_ygxx)具有INSERT的权限。同时也可以将其获得的INSERT权限授予其他用户。
通过下面的代码可以查询员工信息表(tb_ygxx)中的数据信息。

SELECT * FROM tb_ygxx

代码执行以后,其执行结果如图11.11所示。
在这里插入图片描述
图11.11 查询数据时系统弹出的错误提示信息
从上图中可以看出,由于用户USERS只具有对员工信息表(tb_ygxx)的INSERT权限,因此无法查询员工信息表(tb_ygxx)中的数据信息。如通过下面的语句向员工信息表(tb_ygxx)中插入数据。

INSERT INTO TB_YGXX(编号,姓名,性别,年龄) 
VALUES('1011','张力','女',35)

代码执行以后,数据信息被插入到员工信息表(tb_ygxx)表当中,此时通过具有查询权限的用户可以查询到员工信息表(tb_ygxx)表中的数据信息,如图11.12所示。
在这里插入图片描述
图11.12 插入数据后tb_ygxx数据表中的数据信息
从图中可以看出,员工信息表(tb_ygxx)中包含编号是“1011”的数据记录,说明USERS用户具有对员工信息表(tb_ygxx)的INSERT权限。

11.4.5 修改权限控制
更新权限控制指的是UPDATE权限控制,是指允许用户或应用程序执行UPDATE语句更新表中的数据信息。如果用户除了拥有UPDATE权限之外而没有其他任何的权限,则用户只能够更新数据表中的数据信息,而不能够查询、添加或删除数据表中的数据信息。
【语法说明】
实现更新权限控制的语句结构如下所示:

GRANT UPDATE [(column1,column2,…,column)]
ON Table_name | View_name
TO User | Role | PUBLIC
[WITH GRANT OPTION]

代码中的column1,column2,…,column表示用于指定要授权数据库中的表或视图中的一列或者多列,如果不指明列名,则表示将对数据表或视图中的整个列都授予UPDATE权限。Table_name表示授予权限的数据库表名称,而View_name则表示授予权限视图的名称。

注意:在DBMS中,用户必须对表或视图同时具有UPDATE权限和SELECT权限才能够实现对表或视图进行更新数据的操作。

【上机实战】
在SQL SERVER数据库中,将员工信息表(tb_ygxx)的创建者所拥有的UPDATE权限授予用户USERS,并且使用户USERS具有将该权限授予其他用户的权限。

GRANT UPDATE 
ON tb_ygxx
TO USERS
WITH GRANT OPTION

代码执行以后,用户USERS将对员工信息表(tb_ygxx)具有UPDATE的权限。同时也可以将其获得的INSERT权限授予其他用户。
通过下面的代码向员工信息表(tb_ygxx)中插入数据信息。

INSERT INTO TB_YGXX(编号,姓名,性别,年龄) 
VALUES('1012','张也','女',35)

代码执行以后,其执行结果如图11.13所示。
在这里插入图片描述
图11.13 插入数据时系统弹出的错误提示信息
从上图中可以看出,由于用户USERS只具有对员工信息表(tb_ygxx)的UPDATE权限,因此无法向员工信息表(tb_ygxx)中插入数据信息。如通过下面的语句更新员工信息表(tb_ygxx)中
UPDATE TB_YGXX SET 籍贯=‘吉林省长春市’
代码执行以后,数据表中的数据信息被修改,此时通过具有查询权限的用户可以查询到员工信息表(tb_ygxx)表中的数据信息,如图11.14所示。
在这里插入图片描述
图11.14 修改数据后tb_ygxx数据表中的数据信息
从图中可以看出,员工信息表(tb_ygxx)中的“籍贯”字段信息都被修改为“吉林省长春市”,说明USERS用户具有对员工信息表(tb_ygxx)的UPDATE权限。

11.4.6 删除权限控制
删除权限控制指的是DELETE权限控制,是指允许用户或应用程序从表中删除一行或多行数据信息。
【语法说明】
实现删除权限控制的语句结构如下所示。

GRANT DELETE
ON Table_name | View_name
TO User | Role | PUBLIC
[WITH GRANT OPTION]

代码中的Table_name表示授予权限的数据库表名称,而View_name则表示授予权限视图的名称。
【上机实战】
在SQL SERVER数据库中,将员工信息表(tb_ygxx)的创建者所拥有的DELETE权限授予用户USERS,并且使用户USERS具有将该权限授予其他用户的权限。

GRANT DELETE 
ON tb_ygxx
TO USERS
WITH GRANT OPTION

代码执行以后,用户USERS将对员工信息表(tb_ygxx)具有DELETE的权限。同时也可以将其获得的DELETE权限授予其他用户。
通过下面的代码向员工信息表(tb_ygxx)中插入数据信息。

INSERT INTO TB_YGXX(编号,姓名,性别,年龄) 
VALUES('1013','张也','女',35)

代码执行以后,其执行结果如图11.15所示。
在这里插入图片描述
图11.15 插入数据时系统弹出的错误提示信息
从上图中可以看出,由于用户USERS只具有对员工信息表(tb_ygxx)的DELETE权限,因此无法向员工信息表(tb_ygxx)中插入数据信息。如通过下面的语句删除员工信息表(tb_ygxx)中
DELETE FROM TB_YGXX
代码执行以后,数据表中的数据信息被删除,说明用户USERS只对员工信息表(tb_ygxx)的具有DELETE权限。

11.5 安全管理
数据库安全管理非常的重要,前面讲解了SQL中的用户管理、角色管理和权限管理方面的相关知识。本节中主要讲解数据库安全管理方面的相关知识。

11.5.1 SQL Server数据库的安全管理
SQL Server数据库的安全管理包括用户管理、角色管理和权限管理方面的相关知识,下面就分别讲解一下这几个方面的内容。

1.用户管理
在SQL Server中,用户由登录账号和用户账号组成。登录账号只表明该账号通过了SQL Server认证或NT认证,登录账号允许用户与SQL Server连接;用户账号是基于数据库的,在SQL Server中通过用户账号来控制用户在数据库上的权限。
在T-SQL中,通过系统过程来管理SQL Server用户的主要功能。其中管理系统登录账号的系统过程有以下几种。

  • Sp_addlogin:用于创建新的使用SQL Server认证模式的登录账号。
  • Sp_granlogin:用于设定一个用户或用户组为SQL Server登录者。
  • Sp_denylogin:用于某一用户或用户组连接到SQL Server。
  • Sp_droplogin:用于从SQL Server中删除登录账号。
  • Sp_helplogins:用于显示SQL Server所有登录者的信息。

管理用户账户的系统过程有以下几种:

  • Sp_granddbaccess:为用户或SQL Server登录者建立一个相匹配的用户账号。
  • Sp_revokedbaccess:用于删除当前数据库中的用户。
  • Sp_helpuser:用于显示当前数据库的指定用户信息。

下面通过具体的示例来说明如何使用系统存储过程来管理SQL Server中的用户。
【上机实战】
使用系统存储过程创建一个使用SQL Server认证模式的登录账号T_Login,其实现的代码如下所示。

EXEC sp_addlogin 'T_Login','123456','MyDatas','us_english'

代码执行以后,登录账号T_Login被创建。

说明:示例代码中的T_Login表示登录账号的名称,123456表示登录密码,MyDatas表示默认登录时的数据库,us_english表示登录时默认的语言。

在创建登录账号之后,可以通过系统过程sp_helplogins来查看创建的系统账号信息,如下面的代码所示。

sp_helplogins 
@LoginNamePattern='T_Login'

代码执行以后,运行结果如图11.16所示。
在这里插入图片描述
图11.16 登录账户T_Login的查询信息
可以通过系统存储过程sp_grantdbaccess为创建的登录账号添加数据库用户账号,如下面的代码演示的是为登录账号T_Login添加数据库用户账号T_User。

sp_grantdbaccess 'T_Login','T_User'

代码执行以后,系统提示数据库用户账号T_User被创建。
可以使用系统存储过程sp_helpuser创建数据库用户账号,其实现的代码如下所示。

sp_helpuser 'T_User'

代码执行以后,运行结果如图11.17所示。
在这里插入图片描述
图11.17 查看的数据库用户账号T_User
如果系统存储过程sp_helpuser后面不加数据库用户账号的名称,即sp_helpuser不带任何的参数,将默认查看的是当前数据库中所有用户账号的信息,如下面的代码所示。

sp_helpuser

代码执行以后,运行结果如图11.18所示。
在这里插入图片描述
图11.18 查看当前数据库中所有用户账号的信息

2.角色管理
在SQL Server中,服务器角色是根据SQL Server中的管理任务和这些任务相对的重要性等级,并且把具有SQL Server管理职能的用户划分为不同的用户组,并且预定义每一组用户所具有的权限。服务器角色适用在服务器范围内,并且其权限不能被修改。数据库角色是数据库专用的角色,是指能为某一用户授予不同级别的管理或访问数据库的权限。
在T-SQL中,通过系统存储过程来管理数据库角色。其主要包括以下几种:

  • Sp_addrole:用于创建数据库角色。
  • Sp_droprole:用于删除数据库中某一自定义的数据库角色。
  • Sp_helprole:用于显示当前数据库中所有数据库角色的信息。
  • Sp_addrolemember:用于向数据库的某一用户中添加数据库用户。
  • Sp_droprolemember:用于删除某一角色的成员。

【上机实战】
使用系统存储过程sp_addrole创建数据库角色D_Role。

sp_addrole 'D_Role'

代码执行以后,数据库角色D_Role创建成功。
数据库角色在创建之后,可以通过系统存储过程sp_helprole进行查看,其实现的代码如下所示。

sp_helprole 'D_Role'

代码执行以后,运行结果如图11.19所示。
在这里插入图片描述
图11.19 查看新创建的数据库角色D_Role的信息
如果系统存储过程sp_helprole后面没有数据库角色的名称,即sp_helprole不带任何的参数,将默认查看的是当前数据库中所有数据库角色的信息,如下面的代码所示。

sp_helprole

代码执行以后,其执行结果如图11.20所示。

图11.20 查看当前数据库中所有数据库角色的信息
使用系统存储过程sp_addrolemember可以实现将用户加入到数据库角色当中。下面的代码演示的是,使用系统存储过程sp_addrolemember将用户T_User加入到新创建的数据库角色D_Role当中。
sp_addrolemember ‘D_Role’,‘T_User’
代码执行以后,用户T_User被加入到新创建的数据库角色D_Role当中。
使用系统存储过程sp_helprolemember可以查看当前数据库中所有的数据库角色信息,其具体实现如下面的代码所示。
sp_helprolemember
代码执行以后,其执行结果如图11.21所示。
在这里插入图片描述
图11.21 查看的当前数据库中所有数据库的成员信息

3.权限管理
在SQL Server中数据库系统当中,权限分为系统权限和对象权限两种类型。系统权限是指具有对数据库系统进行某种特定操作的权限,系统权限由数据库管理员授予其他用户。对象权限是指在指定的数据库对象上进行某种操作的权限,对象权限由创建基本表和视图的用户授予其他用户权限。
在SQL Server中主要的系统权限如下所示。

  • CREATE DATABASE:表示具有创建数据库的权限。
  • CREATE TABLE:表示具有创建数据表的权限。
  • CREATE VIEW:表示具有创建视图的权限。
  • CREATE RULE:表示具有创建规则的权限。
  • CREATE DEFAULT:表示具有创建默认值的权限。
  • CREATE PROCEDURE:表示具有创建存储过程的权限。

在SQL Server中主要的对象权限如下所示。

  • 数据表:具有SELECT、INSERT、UPDATE、DELETE和REFERENCE权限。
  • 视图:具有SELECT、INSERT、UPDATE和DELETE权限。
  • 列:具有SELECT和UPDATE权限。
  • 存储过程:具有EXECUTE权限。

11.5.2 Oracle数据库的安全管理
与SQL Server一样,在Oracle中,用户权限分为系统权限和对象权限两种类型。系统权限是指允许用户执行某种特定的操作。Oracle中还支持ANY类型的权限,ANY类型的权限是指包含ANY关键字的系统权限。其允许用户访问任何模式下的对象。在Oracle中,同样也支持GRANT语句授予权限,同时也支持PEVOKE语句取消权限。
在Oracle中提供了一些与权限有关的数据字典视图,其具体内容如下所示:

  • DBA_COL_PRIVS:其作用是描述数据库中所有列对象的授权。
  • ALL_COL_PRIVS:其作用是描述当前用户与PUBLIC有关的所有列对象的授权。
  • ROLE_SYS_PRIVS:其作用是描述当前用户可以访问授予角色的系统权限。
  • ROLE_TAB_PRIVS:其作用是描述当前用户可以访问授予角色的对象权限。
  • USER_SYS_PRIVS:其作用是授予当前用户的系统权限。
  • SESSION_PRIVS:其作用是描述当前用户正在启用的权限。
  • DBA_TAB_PRIVS:其作用是描述数据库中所有对象的授权。
  • DBA_SYS_PRIVS:其作用是描述授予用户和角色的系统权限。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HeartBest丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值