第9章 安全管理

9.1安全控制概述 
安全性是指保护数据以防止不合法的使用而造成数据被泄露、更改和破坏;完整性是指数据的准确性和有效性。通俗地讲: 
⚫  安全性(Security):保护数据以防止不合法用户故意造成的破坏。 
⚫  完整性(Integnty):保护数据以防止合法用户无意中造成的破坏。 
简单地说,安全性确保用户被允许做其想做的事情;完整性确保用户所做的事情是正确的。 
数据库中的安全控制是指:在数据库系统的不同层次提供对有意和无意损害行为的安全防范。 
在数据库中,对有意的非法活动可采用加密存、取数据的方法控制;对有意的非法操作可使用用户身份验证、限制操作权限来控制;对无意的损坏可采用提高系统的可靠性和数据备份等方法来控制。 
1.数据库安全控制的目标 
数据库安全控制的目标是保护数据免受意外或故意的丢失、破坏或滥用。数据库管理员(DBA)负责数据库系统的全部安全。因此,数据库系统的 DBA 必须能够识别最严重的威胁,并实施安全措施,采取合适的控制策略以最小化这些威胁。                                  
 
当创建新账户时,DBMS 向该表中插入一条新记录来保存新账户信息。当删除账户时,DBMS 从该表中删除账户的记录。 
2.数据库安全的威胁 
数据库安全的威胁可以是直接的,为了保证数据库安全,系统的所有部分都必须是安全的,包括数据库、操作系统、网络、用户,甚至计算机系统所在的建筑和房屋。全面的数据库安全计划必须考虑下列情况: 
⚫  可用性的损失。 
⚫  机密性数据的损失。 
⚫  私密性数据的损失。 
⚫  偷窃和欺诈。 
⚫  意外的损害。 
3.安全控制模型 
在一般的计算机系统中,安全措施是一级一级层层设置的。下图显示了计算机系统中从用户使用数据库应用程序开始一直到访问后台数据库数据,需要经过的安全认证过程。 
 
4.授权和认证 
 
现在的 DBMS 通常采用自主存取控制和强制存取控制两种方法来解决数据库安全系统的访问控制问题,有的 DBMS 只提供一种方法,有的两种都提供。无论采用哪种存取控制方法,需要保护的数据单元或数据对象包括从整个数据库到某个元组的某个部分。 
●自主存取控制:用户对不同的数据对象具有不同的存取权限,而且没有固定的关于哪些用户对哪些对象具有哪些存取权限的限制。例如,用户 U1 能看到数据 A 但看不到数据 B,而 U2 能看到数据 B 但看不到数据因此,自主存取控制非常灵活。 
●强制存取控制:每一个数据对象被标以一定的密级,每一个用户也被授予一个许可证级别。对于任意一个对象,只有具有合法许可证的用户才可以存取。因此,强制存取控制本质上具有分层的特点,且相对比较严格。例如,如果用户 U1 能看到数据 A 但看不到数据 B,则说明 B 的密级高于 A,因此不存在用户U2 能看到 B 但看不到 A 的情况。 
                                       
9.2存取控制 
9.2.1自主存取控制 
大型数据库管理系统几乎都支持自主存取控制(又称为自主安全模式),目前的 SQL 标准也对自主存取控制提供支持,这主要是通过 SQL 的 GRANT(授予)、REVOKE(收回)和 DENY(拒绝)语句来实现的。 
授予和收回权限是数据库管理员(DBA)的职责。DBA 依照数据的实际应用情况将合适的权限授给相应的用户。 
1.权限种类 
在自主存取控制中,通常将数据库中的权限划分为两类。 
(1)对数据库管理系统进行维护的权限, 
(2)对数据库中的对象和数据进行操作的权限,这类权限又可以分为两类: 
①语句权限:对数据库对象的操作权限,包括创建、删除和修改数据库对象; 
②对象权限:对数据库数据的操作权限,包括对表、视图数据的增、删、改、查权限,存储过程的执行权等; 
(3)隐含的权限:隐含权限是用户自动具有的权限,比如系统管理员自动具有全部的操作权限,数据库对象拥有者自动具有所拥有对象的全部权限。隐含权限不能被更改。 
2.用户分类 
在自主存取控制中,一般将数据库中的用户按其操作权限的不同划分为以下 3 类: 
(1)系统管理员:系统管理员在数据库服务器上具有全部的权限,SQL Server2008 的默认系统管理员是“sa”。在安装好之后也可以授予其他用户具有系统管理员的权限。 
(2)数据库对象拥有者:创建数据库对象的用户即为数据库对象有者。数据库对象拥有者对其所拥有的对象具有全部权限。 
(3)普通用户:普通用座只具有对数据摩数锯的操作权限。 
9.2.2强制存取控制 
在强制存取控制中,DBMS 将全部实体划分为主体和客体两大类。 
主体是系统中的活动实体,既包括 DBMS 所管理的实际用户,也包括代表用户的各个进程。 
客体是系统中的被动实体,是受主体操纵的,包括文件、基本表、索引、视图等。 
对于主体和客体,DBMS 为它们的每个实例指派一个敏感度标记(Label)。敏感度标记被分为若干级别,例如绝密(TopSecret)、秘密(Secret)、可信(Confidentml)和公开(Public)等。 
主体的敏感度标记被称为许可证级别(ClearanceLevel),客体的敏感度标记被称为密级
(ClassificationLevel)。强制存取控制机制就是对比主体的 Label 和客体的 Label,最终确定主体是否能够存取客体。 
当某一用户(或某一主体)以标记 Label 注册到系统时,系统要求他对任何客体的存取必须遵循如下规则: 
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体。 
(2)仅当主体的许可证级别等于客体的密级时,该主体才能写相应的客体。 
在某些系统中,第二条规则与这里的规则(2)有些差别。这些系统规定:仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体,即用户可以为写入的数据对象赋予高于自己的许可证级别的密级。这样数据一旦被写入,该用户自己也不能再读取该数据对象了。这两种规则的共同点是它们均禁止了拥有高许可证级别的主体更新低密级的数据对象,从而防止了敏感数据的泄露。 
美国国防部颁布了“橘皮书”和“紫皮书”对强制存取控制作了全面的描述和定义,“橘皮书”定义
了任意“可信橘色基”(TCB)应当遵从一系列安全性要求;而“紫皮书”则定义了这些要求在数据库系统中的相应解释。 
上述两份文献给出了通用安全性分级模式,共定义了 D、C、B 和 A 四类安全级别,从 D 类到 A 类级别依次增高。D 类提供最小保护,C 类提供自主保护,B 类提供强制保护,A 类提供验证保护。 
(1)自主保护。 
C 类分为两个子类 C1 和 C2,C1 安全级别低于 C2。每个子类都支持自主存取控制,即存取权限由数据对象的所有者决定。 
①C1 子类对所有权与存取权限加以区分,虽然它允许用户拥有自己的私有数据,但仍然支持共享数据的概念。 
②C2 子类还要求通过注册、审计及资源隔离以支持责任说。 
(2)强制保护。 
B 类分为三个子类 B1、B2 和 B3,B1 安全级别最低,B3 最高。 
①B1 子类要求“标识化安全保护”,并要求每个数据对象都必须标以一定的密级,同时还要求安全策略的非形式化说明。 
②B2 子类要求安全策略的形式化说明,能识别并消除隐蔽通道,隐蔽通道的例子有:从合法查询的结果中推断出不合法查询的结果;通过合法的计算推断出敏感信息。 
                                       
③B3 子类要求支持审计和恢复以及指定安全管理者。 
(3)验证保护。 
A 类要求安全机制是可靠的且足够支持对指定的安全策略给出严格的数学证明。 
有些 DBMS 产品提供 B1 级强制存取控制及 C2 级自主存取控制。支持强制存取控制的 DBMS 也称为多级安全系统或可信系统。 
9.5SQLServer的安全控制 
9.5.1身份验证模式 
1.Windows 身份验证模式 
SQL Server 将用户的身份验证交给了 Windows 操作系统来完成,SQL Server 将通过 Windows 操作系统来获得用户信息,并对登录名和密码进行重新验证。 
当使用Windows身份验证模式时,用户必须首先登录到Windows操作系统中,然后再登录到SQL Server。
而且用户登录到 SQL Server 时,只需选择 Windows 身份验证模式,而无须再提供登录名和密码,系统会从用户登录到 Windows 操作系统时提供的用户名和密码中查找当前用户的登录信息,以判断其是否是 SQL Server 的合法用户。 
对于 SQLServer 来说,一般推荐使用 Windows 身份验证模式,因为这种安全模式能够与 Windows 操作系统的安全系统集成在一起,以提供更多的安全功能。 
2.混合身份验证模式 
混合身份验证模式是指 SQL Server 允许 Windows 授权用户和 SQL 授权用户登录到 SQL Server 数据库服务器。如果希望允许非 Windows 操作系统的用户也能登录到 SQL Server 数据库服务器上,则应该选择混合身份验证模式。如果在混合身份验证模式下选择使用 SQL 授权用户登录 SQLServer 数据库服务器,则用户必须提供登录名和密码两部分内容,因为 SQLServer 必须要用这两部分内容来验证用户的合法身份。 
SQL Server 身份验证的登录信息(用户名和密码)都保存在 SQLServer 实例上,而 Windows 身份验证的登录信息是由 Windows 和 SQLServer 实例共同保存的。 
9.5.2登录账户 
SQL Server 2008 的安全权限是基于标识用户身份的登录标识符(Login ID,登录 ID)的,登录 ID
就是控制访问 SQLServer 数据库服务器的用户账户。如果未指定有效的登录 ID,则用户不能连接到SQLServer 数据库服务器。 
在 SQL Server2008 中,有两类登录账户。 
①由 SQL Server 自身负责身份验证的登录账户; 
②登录到 SQLServer 的 Windows 网络账户,可以是组账户或用户账户。 
在安装完 SQL Server2008 之后,系统本身会自动地创建一些登录账户,称为内置系统账户,用户也可以根据自己的需要创建自己的登录账户。 
1.建立登录账户 
建立登录账户可以通过 SQL Server2008 的 SSMS 工具图形化地实现(本章介绍的所有操作均可在 SSMS工具中实现),也可以通过 T-SQL 语句实现,这里只介绍用 T-SQL 语句实现的方法。 
创建新的登录账户的 T-SQL 语句是 CREATE LOGIN,其简化语法格式为: 

CREATE LOGIN login_name {  WITH <option_list1 > | FROM<sources>} 
<sources> ::= 
          WINDOWS [ WITH<windows_options>[,…] ] 
<option_list1 > ::= 
          PASSWORD = ‘password’ [,<option_list2> [,… ] ] 
<option_list2> ::= 
           SID = sid 
           | DEFAULT_DATABASE = database  
           | DEFAULT_LANGUAGE = language  
<windows_options> ::= 
            DEFAULT_DATABASE = database  
            | DEFAULT_LANGUAGE = language 

其中各参数的含义为: 
⚫  login_name:指定创建的登录名。有四种类型的登录名:SQL Server 身份验证的登录名、Windows身份验证的登录名、证书映射的登录名和非对称密钥映射的登录名。如果从 Wmdows域账户映射 login_name,则 login_name 必须用方括号[ ]括起来。 
⚫  WINDOWS:指定将登录名映射到 Windows 用户名。 
⚫  PASSWORD=‘password’:仅适用于 SQL Server 身份验证的登录名。指定新建登录名的密码。 
⚫  SID = sid:仅适用于 SQL Server 身份验证的登录名。指定新登录名的 GUID(全球唯一标识符)。如果未选择此选项,则 SQL Server 将自动指派 GUID。 
                                       
⚫  DEFAULT_DATABASE = database:指定新建登录名的默认数据库。如果未包括此选项,则默认数据库将设置为 master。 
⚫  DEFAULT_LANGUAGE = language:指定新建登录名的默认语言。如果未包括此选项,则默认语言将设置为服务器的当前默认语言。 
【例 1】创建 SQLServer 身份验证的登录账户。登录名为 SQL_USerl,密码为 alb2c3XY。 
CREATE LOGIN SQL_User1 WITH PASSWORD=‘a1b2c3XY’ 
【例 2】创建 Wmdows 身份验证的登录账户。从 Windows 域账户创建[TEST\Win_User2]登录账户。 
CREATE LOGIN [TEST\Win_User2] FROM WINDOWS 
【例 3】创建 SQL Server 身份验证的登录账户。登录名为 SQL_User3,密码为 AD4h9fcdhx32MOP。要求该登录账户首次连接服务器时必须更改密码。 
CREATE LOGIN SQL_User3 WITH PASSWORD='AD4h9fcdhx32MOP' 
MUST_CHANGE 
2.修改登录账户属性 
对于已经建立好的 SQL Server 登录账户,可以对登录账户的密码、默认数据库等属性进行修改。 
修改登录账户属性的 T-SQL 语句是 ALTER LOGIN,其语法格式为: 

ALTER LOGIN login_name 
        {  
       <status_option> 
        | WITH <set_option>[,…]     
       } 
<status_option> : : = 
         ENABLE | DISABLE  
<set_option> ::= 
       PASSWORD ='password' 
[ OLD_PASSWORD ='oldpassword' 
] 
| DEFAULT_DATABASE = database  
| DEFAULT_LANGUAGE = language  
| NAME = login_name 

其中各参数的含义为: 
⚫  login_name:指定正在更改的登录名。 
⚫  ENABLE | DISABLE:启用或禁用此登录名。 
⚫  PASSWORD=‘password’:仅适用于 SQL Server 身份验证的登录账户。指定正在更改的登录名的密码。 
⚫  OLD_PASSWORD=‘oldpassword’:仅适用于 SQL Server 身份验证的登录账户。要指定新密码的登录名的当前密码。 
⚫  DEFAULT_DATABASE = database:指定将指派给该登录名的默认数据库。 
DEFAULT_LANGUAGE = language:指定将指派给该登录名的默认语言。 
⚫  NAME = login_name:重命名该登录名的新名称。如果是 Windows 身份验证的用户,则与新名称对应的 Windows 的用户名必须与 SQL Server 中的登录名相关联。 
【例 4】启用已禁用的登录账户。启用 SQL_User1 登录账户。 
ALTER LOGIN SQL_User1 ENABLE 
【例 5】更改登录账户的密码。将 SQL_User1 登录账户的密码改为 IsaPwd324。 
ALTER LOGIN SQL_User1 WITH PASSWORD=‘IsaPwd324’ 
【例 6】更改登录账户名。将 SQL_User3 登录账户名改为 NewUser。 
ALTER LOGIN SQL_User3 WITH NAME=NewUser  
3.删除登录账户 
由于 SQLServer 的登录账户可以是多个数据库中的合法用户,因此在删除登录账户时,应该先将该登录账户在各个数据库中映射的数据库用户删除掉(如果有的话),然后再删除登录账户。否则会产生没有对应的登录账户的孤立的数据库用户。 
删除登录账户的 T-SQL 语句为 DROP LOGIN,其语法格式为: 
DROP LOGIN login_name;其中 login_name 为要删除的登录账户的名字。 
注意,不能删除正在使用的登录账户,也不能删除拥有任何数据库对象、服务器级别对象的登录账户。 
【例 7】删除 SQL_User2 登录账户。 
DROP LOGIN SQL_User2 
                                       
9.5.3数据库用户 
默认情况下,新建立的数据库只有一个用户:dbo,它是数据库的拥有者。 
1.建立数据库用户 
建立数据库用户的 T-SQL 语句是 CREATEUSER,其简化的语法格式如下: 
CREATE USER user_name[{|FOR|FROM} 
LOGIN login_name] 
其各参数说明如下: 
●user_name:指定在此数据库中用于识别该用户的名称。 
●LOGIN login_name:指定要映射为数据库用户的 SQL Server 登录名。login_name 必须是服务器中有效的登录名。 
注意: 
●如果省略 FOR LOGIN,则新的数据库用户将被映射到同名的 SQL Server 登录名。 
●不能使用 CREATE USER 语句创建 guest 用户,因为每个数据库中均已存在 guest 用户。默认 guest用户是禁用状态,可通过授予 guest 用户 CONNECT 权限来启用该用户。 
【例 8】首先创建名为 SQL_JWC 且具有密码的 SQL Server 身份验证的服务器登录名,然后在 test 数据库中创建与此登录名对应的数据库用户 JWC。 

CREATE LOGIN SQL_JWC 
      WITH PASSWORD=‘123456’ 
GO 
USE test 
GO 
CREATE USER JWC FOR LOGIN SQL_JWC 
GO 

2.Guest 用户 
Guest 是 SQL Server 中一个特殊的数据库用户,在实际应用中经常作为数据库的匿名访问者使用。
当没有映射到数据库用户的登录账户试图访问数据库时,SQL Server 将尝试用 guest 用户来连接。可以通过为 guest 用户授予 CONNECT 权限来启用用户数据库中的 guest 用户。 
启用 guest 用户(使 guest 用户具有连接权限)的语句如下: 
GRANT CONNECT TO guest; 
禁用 guest 用户(收回 guest 用户的连接权限)的语句如下: 
REVOKE CONNECT TOguest; 
注意:在每个数据库中还有一个特殊用户:dbo,该用户的全称是 databaseowner。dbo 是创建该数据库的登录账户映射到该数据库中的用户,其所创建的对象都是 dbo.对象名。 
3.删除数据库用户 
从当前数据库中删除一个用户,实际就是解除登录账户和数据库用户之间的映射关系,但并不影响登录账户的存在。删除数据库用户之后,其对应的登录账户仍然存在。 
删除数据库用户的 T-SQL 语句是 DROP USER,其语法格式为: 
DROP USER user_name;其中 user_name 为要在此数据库中删除的用户名。 
注意:不能从数据库中删除拥有对象的用户。必须先删除或转移安全对象的所有者,然后再删除拥有这些对象的数据库用户。 
9.5.4权限管理 
1.对象级别的权限 
数据库对象上允许的操作权限可以分为六种不同的类型,如下表所示。 
                                     
 (1)授权语句。 
T-SQL 授权语句的简化语法格式为: 

GRANT <permission> [ , …n] 
     ON 
          [OBJECT :: ] [ schema_name ] .object_name[ ( column [,…n ] ) ] 
               TO <database_principal> [ ,…n] 
          [ WITH GRANT OPTION ] 
<permission> ::= 
          ALL [ PRIVILEGES ] | permission [ ( column [,…n ] ) ] 

其中各参数的含义如下: 
⚫  Permission:指定可以授予的对象权限。 
⚫  ALL:指授予适用于指定对象的所有 ANSI-92 权限。对于不同的对象,ALL 的含义有所不同。 
  标量函数权限:EXECUTE、REFERENCES。 
  表值函数权限:DELETE、INSERT、REFERENCES、SELECT、UPDATE 。 
  存储过程权限:EXECUTE 
  表权限:DELETE 、INSERT、REFERENCES、SELECT、UPDATE。 
  视图权限:DELETE、INSERT、REFERENCES、SELECT、UPDATE。 
⚫  PRIVILEGES:包含此参数是为了符合 ANSI-92 标准。 
⚫  ON [ OBJECT::] [schema_name].object_name:指定被授予权限的对象。如果指定了 schema_name,则 OBJECT 短语是可选的。如果使用了 OBJECT 短语,则需要作用域限定符(::)。如果未指定 schema_name,则使用默认架构。如果指定了 schema_name,则需要架构作用域限定符(.)。 
⚫  TO:指定要向其授予权限的主体,可以是数据库用户名,也可以是用户定义的角色名。 
⚫  WITH GRANT OPTION:指示该主体还可以向其他主体授予所指定的权限。 
⚫  Column:指定表、视图或表值函数中将被授予权限的列名。只能在 SELECT、REFERENCES 及 UPDATE
操作上对列进行授权。 
【例 9】授予用户 RosaQdM 对 Address 表具有 SELECT 权限。 
GRANT SELECT ON Address TO RosaQdM 
【例 10】授予用户 RosaQdM 对 HumanResources.Employeelnfo 存储过程具有 EXECUTE 权限。 
(2)拒绝权限。 
拒绝用户具有某权限使用的是 DENY 语句,在 T-SQL 中其简化语法格式如下: 

DENY<permission>[ , …n ] ON 
       [OBJECT : : ][ schema_name ] . object_name [ ( column [,…n ] ) ] 
            TO <database_principal> [,…n] 
       [CASCADE ] 
       [AS <database_principal> ] 

其中,CASCADE 表示要拒绝的权限也会被对此主体授予该权限的其他主体拒绝。其他各参数含义同GRANT 语句。 
【例 11】拒绝用户 RosaQdM 对 Person.Address 表具有 SELECT 权限。 
DENY SELECT ON OBJECT::Person.Address TO RosaQdM 
【例 12】拒绝用户 RosaQdM 对 HumanResources.Employeelnfo 存储过程具有 EXECUTE 权限。 
DENY EXECUTE ON HumanResources.Employeelnfo TO RosaQdM                                       
(3)授权语句 
收权也就是将已授给用户的权限收回来,即不允许用户再具有该权限。语法格式如下: 

REVOKE  [ALL [ PRIVILEGES ] ] |<permission>[,…n ] 
     ON 
          [OBJECT : : ] [ schema_name ]. object_name [ ( column [,…n ] ) ] 
          { FROM I TO} < database_principal > [ , …n ] 
          [CASCADE ] [ AS <role_name> ]     

各参数含义如下: 
CASCADE:对应 GRANT 语句中的 WITH GRANT OPTION,表示要撤销的权限也会从此主体授予或拒绝该权限的其他主体中撤销。 
AS :指定要基于哪个角色发出这个命令。 
其他参数含义同 GRANT 语句。 
【例 13】撤销用户 RosaQdM 对 Person.Address 表的 SELECT 权限。 
REVOKE SELECT ON OBJECT::Person.Address FROM RosaQdM 
2.语句级别的权限 
 
(1)授权语句。 
语法格式如下: 
GRANT { ALL | [ , …n  ] | 
        TO [,…n ] 
【例 14】授予用户 RosaQdM 具有创建表的权限。 
GRANT CREATE TABLE TO RosaQdM 
【例 15】授予用户 userl 和 user2 都具有创建表和视图的权限。 
GRANT CREATE TABLE,CREATE VIEW TO userl,user2 
(2)拒绝权限。 
语法格式如下: 
DENY { ALL | [,…n ] } 
     TO [ ,…n ] 
【例 16】拒绝用户 userl 具有创建视图的权限。 
DENY CREATE VIEW TO userl 
(3)收权语句。 
语法格式如下: 
REVOKE { ALL | [,…n ] } 
        { FROM | TO }[ ,...n ] 
【例 17】收回用户 RosaQdM 创建表的权限。 
REVOKE CREATE TABLEF ROM RosaQdM 
9.5.5角色 
在 SQL Server2008 中,角色分为预定义的系统角色和用户定义角色两种。同时,根据角色作用范围的不同,系统角色又分为服务器级角色(称为固定服务器角色)和数据库级角色(称为固定数据库角色)。
用户定义的角色均是数据库级角色。 
1.固定服务器角色 
固定服务器角色的作用域属于服务器范围,这些角色具有完成特定服务器级管理活动的权限。用户不能添加、删除或更改固定服务器角色。可以将登录账户添加到固定服务器角色中,使其成为服务器角色中的成员,从而具有服务器角色的权限。固定服务器角色中的每个成员都具有向其所属角色添加其他登录账户的权限。                                       
下表列出了 SQLServer2008 支持的固定服务器角色及其所具有的权限。 
 
系统预定义服务器角色 public。每个 SQLServer 登录名都是 public 服务器角色中的成员。如果未向某个服务器主体授予或拒绝对某个安全对象的特定权限,则该用户将具有授予 public 角色的权限。 
(1)为固定服务器角色添加成员。 
在固定服务器角色中添加成员使用的是 sp_addsrvrolemember 系统存储过程。 
语法格式如下: 
sp_addsrvrolemember [ @ loginame = ] 'login', 
               [@ rolename = ] 'role' 
各参数含义如下: 
⚫  [ @ loginame = ]‘login’:要添加到固定服务器角色中的登录名。login 可以是 SQL Server 身
份验证的登录名,也可是 Windows 身份验证的登录名。如果该 Windows 登录名没有 SQL Server 的访问权
限,则该操作将自动授予该登录名对 SQL Server 的访问权限。 
⚫  [@ rolename =]‘role’:要添加到的固定服务器角色的名称,默认值为 NULL。 
该存储过程的返回值为:0(成功)或 1(失败)。 
【例 18】将 Windows 身份验证的 TEST\Win_Userl 登录名添加到 sysadmin 角色中。 
EXEC sp_addsrvrolemember 'TEST\Win_Userl','sysadmin’ 
【例 19】将 SQL 身份验证的 SQL_User2 登录名添加到 dbcreator 角色中。 
EXEC sp_addsrvrolemember 'SQL_User2','dbcreator' 
(2)删除固定服务器角色成员。 
从固定服务器角色中删除成员使用的是 sp_dropsrvrolemember 系统存储过程。 
语法格式如下: 
sp_dropsrvrolemember [ @ loginame = ] 'login', 
              [@ rolename = ] 'role' 
各参数含义如下: 
⚫  [ @ loginame = ]‘login’: 要从固定服务器角色中删除的登录名。 
⚫  [ @ rolename = ] ‘role’: 固定服务器角色名称。 
该存储过程的返回值为:0(成功)或 1(失败)。 
【例 20】从 dbcreator 角色中删除 SQL_User2。 
EXEC sp_dropsrvrolemember 'SQL_User2','dbcreator' 
2.固定数据库角色 
固定数据库角色是定义在数据库级别上的,而且存在于每个数据库中。用户不能添加、删除或更改固定数据库角色,但可以将数据库用户添加到固定数据库角色中,使其成为数据库角色中的成员,从而具有数据库角色的权限。固定数据库角色的成员来自于每个数据库中的用户。固定数据库角色为管理数据库一级的权限提供了方便。 
下表列出了 SQL Server2008 支持的固定数据库角色及其具有的权限。

系统预定义的数据库角色 public。每个数据库用户都是 public 数据库角色中的成员。如果未向某个
用户授予或拒绝对安全对象的特定权哏,则该用户将具有 public 角色的权限。 
(1)为固定数据库角色添加成员。 
数据库角色成员的来源是数据库中的用户。 
语法格式如下: 
sp_addrolemember [ @ rolename = ] ‘role', 
[@ membername = ] ‘security_account' 
各参数含义如下: 
⚫  [ @ rolename = ]‘role’:当前数据库中的数据库角色名。 
⚫  [ @ membername = ]‘security_account’:要添加到角色中的数据库用户名。security_account 
可以是数据库用户、数据库角色、Windows 登录名或 Windows 组。如果新成员是没有相应数据库用户的Windows 登录名,则将为其创建一个对应的数据库用户。 
该存储过程的返回值为:0(成功)或 1(失败)。 
【例 21】将 SQL_User2 添加到当前数据库的 db_datawriter 角色中。 
EXEC sp_addrolemember ‘db_datawriter',‘SQL_User2' 
(2)删除固定数据库角色成员。 
从固定数据库角色中删除成员使用的是 sp_droprolemember 系统存储过程。 
语法格式如下: 
sp_droprolemember [ @ rolename = ]‘role’, 
                    [@ membername = ]‘security_account’ 
各参数含义如下: 
⚫  [ @ rolename = ]‘role’:当前数据库中的数据库角色名。 
⚫  [ @ membername = ]‘security_account’:要添加到角色中的数据库用户名。security_account 
可以是数据库用户、数据库角色、Windows 登录名或 Windows 组。如果新成员是没有相应数据库用户的Windows 登录名,则将为其创建一个对应的数据库用户。 
该存储过程的返回值为:0(成功)或 1(失败)。 
【例 22】在当前数据库中,删除 db_datawriter 角色中的 SQL_USer2 成员。 
EXEC sp_droprolemember‘db_datawriter’,‘SQL_User2’ 
3.用户定义的角色 
用户定义的角色属于数据库一级的角色。用户定义的角色主要是为简化用户在使用数据库时的权限管理。 
(1)创建用户定义的角色。 
创建用户自定义角色的 T-SQL 语句是 CREATE ROLE。其语法格式为: 
CREATE ROLE role_name [ AUTHORIZATION owner_name ] 
各参数含义如下: 
⚫  role_name:待创建角色的名称。 
⚫  AUTHORIZATION owner_name:将拥有新角色的数据库用户或角色。如果未指定用户,则执行 CREATE ROLE 的用户将拥有该角色。 
【例 23】在当前数据库中创建用户自定义角色 MathDept,其拥有者为 Software 角色。 
CREATE ROLE MathDept AUTHORIZATION Software 
(2)为用户定义的角色授权。 
为用户定义的角色授权使用的 T-SQL 语句与实现对数据库用户授权完全一样。 
(3)添加和删除用户定义的角色中的成员。 
为用户定义的角色添加和删除成员使用的语句与为固定数据库角色添加和删除成员完全一样。       (4)删除用户定义的角色。 
删除用户定义的角色的 T-SQL 语句是 DROP ROLE。其语法格式如下: 
DROP ROLE role_name 
注意:不能从数据库中删除拥有安全对象的角色。 
【例 24】在当前数据库中删除用户定义的角色 InfoDept。 
DROP ROLE InfoDept 
9.6Oracle的安全管理 
Oracle 的安全控制机制可分为数据库级的安全控制、表级、行级、列级的安全控制。数据库级的安全性通过用户身份认证和授予用户相应系统权限来保证,而表级、行级、列级的安全性.通过授予或回收对象特权保证的。 
Oracle 不仅支持集中式应用,也支持跨平台、分布式数据库应用,即用户数据物理上可以被分布存储在网络的多个结点(场地)中,而逻辑上是一个整体。 
对于一个实际可运行的系统来说,通常可设置两级安全管理员:全局数据安全管理员和场地数据安全管理员。全局数据安全管理员负责管理、协调,维护全局数据的一致性和安全性,各场地的安全管理员负责维护本结点数据库的安全性,包括用户管理、系统特权与角色的管理。 
然而,由于 Oracle 分布式数据库系统没有全局数据库管理系统,没有全局数据字典,没有全局死锁检测及全局管理调度程序,其结点之间的互操作是由 Oracle 的通信模块和数据库服务器共同完成的,即网络中的每个数据库服务器都是全局事务的协调者。 
9.6.1用户与资源管理 
Oracle 数据库中的用户按其操作权限的大小可分为 DBA 用户和普通用户。 
⚫  DBA 用户:DBA 用户是在数据库系统安装时由 DBMS 自动创建生成的,它们是 sys 和 system 用户,拥有全部的系统特权(权限)。 
⚫  普通用户:普通用户是由 DBA 用户或具有相应特权的用户创建,并授予系统特权的用户。 
(1)建立用户。 
【例 25】建立一个 Oracle 数据库用户 user1。 
CREATE USER user1 IDENTIFIED BY u66771  
DEFAULT TABLESPACE student  
QUOTA 5M ON student 
命令中的 user1 是新建的用户名,密码是 u66771; 
DEFAULT 子句指定新用户创建的数据库对象,如表、视图等将被存储在 student 表空间中; 
QUOTA 子句限制 user1 使用 student 表空间中的空间限额为 5MB。 
(2)管理用户和资源。 
具有 DBA 特权的用户可以改变一个用户对系统资源的使用限额,并对用户密码进行管理。 
【例 26】将 user1 用户对 student 表空间的空间使用限额增至 60MB。 
ALTER USER user1 
QUOTA 60M ON student 
DBA 用户可以用下面的命令修改任何用户的密码,普通用户也可以用此命令修改自己的密码,如将自己的密码改为 wl2345,用命令: 
ALTER USER user1 IDENTIFIED BY w12345        ——w12345 为新的密码 
(3)删除用户。 
【例 27】从数据库中删除 userl 用户及其所拥有的全部数据库对象。 
DROP USER userl CASCADE 
命令中的 CASCADE 选项指定在删除用户的同时,删除其所拥有的全部数据库对象,否则仅删除 userl用户名。 
9.6.2权限管理 
1.系统特权 
Oracle 提供了三种默认的角色(一组特权),分别为: 
⚫  Connect:具有这种角色的用户不能在数据库中建立任何对象,但可以查询数据字典及访问有权限的数据库对象。 
⚫  Resource:具有这种角色的用户可以在数据库中建立关系表、视图、序列、索引、聚集、存储过程、存储函数、触发器、数据库链路。 
⚫  DBA:这种角色拥有 Oracle 预定义的所有系统特权。 
(1)授予系统特权和角色。 
【例 28】授予用户 userl 具有建立表和视图的权限。 
GRANT create table, create view TO userl WITH ADMIN OPTION 
(2)回收系统特权和角色。                                        
【例 29】回收角色 test 的系统特权 create procedure。 
REVOKE create procedure FROM test 
2.对象特权 
对象特权用于维护表级、行级与列级数据的安全性。下表列出了数据库对象——表、视图、序列、快照、存储过程与函数各对象上允许的操作权限表示操作允许)。 

 
(1)授予对象权限。 
【例 30】将 dep 表上的全部操作权授予 user1 用户。 
GRANT all ON dep TO user1 
(2)回收对象特权。 
表的拥有者根据需要可以随时回收曾经授予的对象特权。如回收用户 user1 在 dep 表上的全部权限,语句如下: 
REVOKE all ON dep FROM user1 

热门文章

暂无图片
编程学习 ·

那些年让我们目瞪口呆的bug

程序员一生与bug奋战&#xff0c;可谓是杀敌无数&#xff0c;见怪不怪了&#xff01;在某知识社交平台中&#xff0c;一个“有哪些让程序员目瞪口呆的bug”的话题引来了6700多万的阅读&#xff0c;可见程序员们对一个话题的敏感度有多高。 1、麻省理工“只能发500英里的邮件” …
暂无图片
编程学习 ·

redis的下载与安装

下载redis wget http://download.redis.io/releases/redis-5.0.0.tar.gz解压redis tar -zxvf redis-5.0.0.tar.gz编译 make安装 make install快链方便进入redis ln -s redis-5.0.0 redis
暂无图片
编程学习 ·

《大话数据结构》第三章学习笔记--线性表(一)

线性表的定义 线性表&#xff1a;零个或多个数据元素的有限序列。 线性表元素的个数n定义为线性表的长度。n为0时&#xff0c;为空表。 在比较复杂的线性表中&#xff0c;一个数据元素可以由若干个数据项组成。 线性表的存储结构 顺序存储结构 可以用C语言中的一维数组来…
暂无图片
编程学习 ·

对象的扩展

文章目录对象的扩展属性的简洁表示法属性名表达式方法的name属性属性的可枚举性和遍历可枚举性属性的遍历super关键字对象的扩展运算符解构赋值扩展运算符AggregateError错误对象对象的扩展 属性的简洁表示法 const foo bar; const baz {foo}; baz // {foo: "bar"…
暂无图片
编程学习 ·

让程序员最头疼的5种编程语言

世界上的编程语言&#xff0c;按照其应用领域&#xff0c;可以粗略地分成三类。 有的语言是多面手&#xff0c;在很多不同的领域都能派上用场。大家学过的编程语言很多都属于这一类&#xff0c;比如说 C&#xff0c;Java&#xff0c; Python。 有的语言专注于某一特定的领域&…
暂无图片
编程学习 ·

写论文注意事项

参考链接 给研究生修改了一篇论文后&#xff0c;该985博导几近崩溃…… 重点分析 摘要与结论几乎重合 这一条是我见过研究生论文中最常出现的事情&#xff0c;很多情况下&#xff0c;他们论文中摘要部分与结论部分重复率超过70%。对于摘要而言&#xff0c;首先要用一小句话引…
暂无图片
编程学习 ·

安卓 串口开发

上图&#xff1a; 上码&#xff1a; 在APP grable添加 // 串口 需要配合在项目build.gradle中的repositories添加 maven {url "https://jitpack.io" }implementation com.github.licheedev.Android-SerialPort-API:serialport:1.0.1implementation com.jakewhart…
暂无图片
编程学习 ·

2021-2027年中国铪市场调研与发展趋势分析报告

2021-2027年中国铪市场调研与发展趋势分析报告 本报告研究中国市场铪的生产、消费及进出口情况&#xff0c;重点关注在中国市场扮演重要角色的全球及本土铪生产商&#xff0c;呈现这些厂商在中国市场的铪销量、收入、价格、毛利率、市场份额等关键指标。此外&#xff0c;针对…
暂无图片
编程学习 ·

Aggressive cows题目翻译

描述&#xff1a; Farmer John has built a new long barn, with N (2 < N < 100,000) stalls.&#xff08;John农民已经新建了一个长畜棚带有N&#xff08;2<N<100000&#xff09;个牛棚&#xff09; The stalls are located along a straight line at positions…
暂无图片
编程学习 ·

剖析组建PMO的6个大坑︱PMO深度实践

随着事业环境因素的不断纷繁演进&#xff0c;项目时代正在悄悄来临。设立项目经理转岗、要求PMP等项目管理证书已是基操&#xff0c;越来越多的组织开始组建PMO团队&#xff0c;大有曾经公司纷纷建造中台的气质&#xff08;当然两者的本质并不相同&#xff0c;只是说明这个趋势…
暂无图片
编程学习 ·

Flowable入门系列文章118 - 进程实例 07

1、获取流程实例的变量 GET运行时/进程实例/ {processInstanceId} /变量/ {变量名} 表1.获取流程实例的变量 - URL参数 参数需要值描述processInstanceId是串将流程实例的id添加到变量中。变量名是串要获取的变量的名称。 表2.获取流程实例的变量 - 响应代码 响应码描述200指…
暂无图片
编程学习 ·

微信每天自动给女[男]朋友发早安和土味情话

微信通知&#xff0c;每天给女朋友发早安、情话、诗句、天气信息等~ 前言 之前逛GitHub的时候发现了一个自动签到的小工具&#xff0c;b站、掘金等都可以&#xff0c;我看了下源码发现也是很简洁&#xff0c;也尝试用了一下&#xff0c;配置也都很简单&#xff0c;主要是他有一…
暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法&#xff0c;在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较&#xff0c;从而确定目标数是在中间数的左边还是右边&#xff0c;将查…
暂无图片
编程学习 ·

项目经理,你有什么优势吗?

大侠被一个问题问住了&#xff1a;你和别人比&#xff0c;你的优势是什么呢? 大侠听到这个问题后&#xff0c;脱口而出道&#xff1a;“项目管理能力和经验啊。” 听者抬头看了一下大侠&#xff0c;显然听者对大侠的这个回答不是很满意&#xff0c;但也没有继续追问。 大侠回家…
暂无图片
编程学习 ·

nginx的负载均衡和故障转移

#注&#xff1a;proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_dir; #设置Web缓存区名称为cache_one&#xff0c;内存缓存空间大小为200MB&#xff0c;1天没有被访问的内容自动清除&#xff0c;硬盘缓存空间大小为30GB。 pro…
暂无图片
编程学习 ·

业务逻辑漏洞

身份认证安全 绕过身份认证的几种方法 暴力破解 测试方法∶在没有验证码限制或者一次验证码可以多次使用的地方&#xff0c;可以分为以下几种情况︰ (1)爆破用户名。当输入的用户名不存在时&#xff0c;会显示请输入正确用户名&#xff0c;或者用户名不存在 (2)已知用户名。…