34. 使用者与安全性管理
建立与管理使用者登入账户
管理数据库存取权限
管理数据库角色
安全性账户授权
本章总结
本章将学习在 Microsoft SQL Server 2000 环境下管理使用者并确保安全性。安全性管理和备份、回复计划、容量规模及空间管理一样,都是 DBA 例行的工作。少了系统的安全性,数据就会遗失或被破坏。
本章涵盖了使用者和安全性管理有关的主题。我们会学习建立与管理使用者登入账户,以及不同的验证模式;另外还将学习 SQL Server 使用者 ID。 使用者登入账户 (user login)是用来验证使用者是否允许存取该 SQL Server,可透过 Microsoft Windows NT、Microsoft Windows 2000 或 SQL Server 来验证。 使用者ID (user ID)分配使用者权限,用来在个别数据库中存取特定对象。使用者 ID 与使用者登入账户相关,不过两者可以设定一样的名称,也可以设定不一样的名称,这些稍后将在本章讨论。本章学习在 SQL Serve r中分配的不同类型权限,以及如何使用权限。另外也会学习利用角色简化使用者的管理工作。最后会学到的是 SQL Server 2000 安全账户授权。在看完本章后,您应具备管理使用者登入账户和安全性的常识。
建立与管理使用者登入账户
现在先透过使用者登入账户,开始管理使用者与安全性的第一步。本节会介绍登入账户的重要性,以及用于维持登入账户的验证模式。接着我们会介绍三种建立登入的方法:使用 SQL Server Enterprise Manager、使用 Transact-SQL(T-SQL),以及使用 建立登入精灵 。最后回学习利用 Enterprise Manager 和T-SQL建立新的使用者账户。
建立使用者登入账户的原因
使用者登入账户可达到保护数据的目的,避免数据库被未验证过的使用者有意或无意的更改。利用使用者登入账户可识别 SQL Server 中的每一个授权使用者。每个使用者登入账户都拥有一组唯一的名称和密码。如果没有使用者登入账户,所有对 SQL Server 的连接将使用同一个识别符号,这样就无法根据不同层级的使用者设立不同层级的安全存取范围。
使用者登入账户可设定不同层级的安全存取,也就是用不同的登入账户就有不同存取对象和执行功能的权限。我们可对某些数据库对象加密,例如将预存程序和检视对未验证使用者隐藏定义。使用者登入账户可以允许特定层级的使用者插入或更新新信息至数据库数据表,而一般层级的使用者只能用只读方式存取数据表。
让我们回到 第 18 章 的范例,了解登入账户如何限制数据的存取。范例中利用检视表限制对特定数据的存取。假定一个 Employee 资料表中包含职员姓名、电话号码、办公室号码、等级、工资、奖金等信息,为避免使用者存取数据表中的机密数据,要先建立检视表,只包含如职员姓名、电话号码及办公室号码等较不机密的信息,透过使用者登入账户限制存取基底数据表的数据,仅允许检视表数据的存取。当然,如果没有利用使用者登入账户做控管,而允许任何使用者存取检视表或数据表,就失去了使用检视表的意义。
验证模式
验证模式有两种:Microsoft Windows 验证和混合模式验证。在 Windows 验证模式中,操作系统会负责验证使用者,在 SQL Server 中利用操作系统的验证决定使用者的权限。在混合模式验证中,Windows NT/2000 和 SQL Server 同时负责验证使用者。在存取 SQL Server 之前,必须先登入 Windows NT/2000 账户。因此选择验证模式前,必须决定是否要使用双重的验证。让我们更详细的了解这两种验证模式,然后学习执行这些模式。
Windows 验证
在 Windows 验证中,SQL Server 透过 Microsoft Windows NT/2000 来提供登入的安全性。当使用者登入 Windows NT/2000,同时确认了使用者账户身份。然后 SQL Server 将验证使用者是否为 Windows NT/2000 确认的使用者,然后依验证身分给与数据库存取的权限。SQL Server 的登入程序结合了 Windows 的安全登入程序,透过 Windows NT/2000 提供的复杂加密过程,建置了网络安全性属性。由于 SQL Server 和 Windows 的登入安全性验证是结合在一起的,所以这种方式不再需要别的验证方法。用来登入的唯一密码就是 Windows NT/2000 的密码。
Windows 验证是比混合验证模式更好的安全性方法,因为它提供了附加的安全性特性,包括安全确认、加密密码、稽核、密码到期时间、最小密码长度,以及在特定次数的失败登入后自动锁定账户。
混合模式验证
在混合模式验证中,使用者可以用 Windows 验证或 SQL Server 验证来存取SQL Server。当有一个来自非安全系统的连接时,SQL Server 会验证这个登入,检验是否设定过这个 SQL Server 登入账户。这个账户验证在 SQL Server 中执行,根据储存在数据库中的使用者名称和密码进行检验。在尝试连接 SQL Server 时,系统会提示使用者提供使用者名称和密码。如果没有提供这些信息,SQL Server 系统会拒绝该使用者的存取。
在您执行 Windows 95/98 时无法使用 Windows 验证模式,因此在这些平台上您必须使用 SQL Server 验证(用混合模式验证)。此外,Web 应用程序需要 SQL Server 验证(透过 Internet Information Server,或称为 IIS),因为这些应用程序的使用者并不一定都在同一个网域中,因此就不能依靠 Windows 安全性,这时就需要使用 SQL Server 安全性。其它需要存取数据库的应用程序也同样需要 SQL Server 验证:一些应用程序的开发人员会因为它们的应用程序结构简单而喜欢使用 SQL Server 安全装置。在使用 SQL Server 安全装置时(在信任网络中),应用程序的开发人员不再需要提供应用程序自身的安全性验证,这样可以简化他们的工作。
设定验证模式
请依下列步骤,用 Enterprise Manager 设定验证模式:
1. 开启 Enterprise Manager 窗口,在左边窗格中的服务器名称上按一下鼠标右钮,并从快捷菜单中选择 内容 ,进入 SQL Server 属性窗口。按一下 安全性 页签,如图34-1所示。
图34-1「SQL Server属性」窗口的「安全性」页签
2. 在这个页签中,选择安全性方法和启动服务账户。在 安全性 区域中,指定是否使用 Windows NT/2000 和 SQL Server(混合模式)验证,或只使用 Windows NT/2000 验证。这里可以指定登入稽核层级。登入稽核层级指定保留哪些登入时的记录。应该根据安全性需要选择稽核等级,有四个等级可使用:
o 无 预设选项;不执行登入稽核。
o 成功 记录所有成功的登入尝试。
o 失败 记录所有失败的登入尝试。
o 全部 记录所有的登入尝试。
________________________________________
说明
稽核层级是一个数据库属性,同样的,这个设定将套用到所有的登入上。
________________________________________
3. 在 启动服务账户 区域中,指定在启动 SQL Server 服务时使用的 Windows NT 账户。可使用内建的本机系统账户,或指定一个账户后提供密码。按 确定 接受设定。
登入账户和使用者
接下来的几个章节中将学习建立登入账户和使用者。在开始之前,需要先了解何谓登入账户和使用者。这里仅将这两个字词简要的定义。
我们可以看到,要连到数据库中,可能会需要 Windows NT/2000 使用者账户,或许同时也许需要使用 SQL Server 验证。不论使用的是 Windows NT/2000 验证或混合模式验证,连接到 SQL Server 的账户都被称为「登入」账户。除了 SQL Server 登入账户,每个数据库会分配一组指定的使用者,这些使用者是虚拟账户。这些虚拟账户提供 SQL Server 登入账户一个别名。例如在 Northwind 数据库中,也许有使用者的名称为 manager ,而这个使用者名称和 SQL Server 登入账户 guest 有关;在 pubs 数据库中,可能有使用者名称也是 manager ,而这个使用者名称却与 SQL Server 登入账户 sa 有关。在预设情况下,SQL Server 登入账户和数据库使用者 ID 设定没有相关,因此并没有任何权限。
建立 SQL Server 登入账户
大部分的管理任务可以使用多种方法执行,而建立使用者登入账户也不例外。您能透过三种途径的任何一种来建立登入:使用 Enterprise Manager、使用 T-SQL 或使用 Create SQL Server Login Wizard。在本节中,您将学到如何使用这三种方法建立 SQL Server 登入账户。
利用 Enterprise Manager 建立 SQL Server 登入账户
要利用 Enterprise Manager 建立 SQL Server 登入账户,请按照下列步骤操作:
1. 在 Enterprise Manager 窗口的左边窗格中,展开服务器群组、服务器,然后展开 安全性 数据夹。在 登入 上按一下鼠标右钮,然后在快捷菜单中选择 新增登入 ,进入 SQL Server 登入属性窗口,如图34-2所示。在 一般 页签的 名称 文字方块中键入SQL Server登入账户。如果使用的是Windows验证,那么这个名称必须是有效的Windows NT或Windows 2000账户名称。接下来在 网域 文字方块中指定 Windows NT 或 Windows 2000 的网域。在预设区域指定使用者使用的预设数据库和语言。在 验证 区域中,指定是否使用 Windows NT 或 Windows 2000 账户,或者使用 SQL Server 验证。如果选择 SQL Server 验证,则使用混合模式验证。
图34-2「SQL Server 登入属性」窗口的「一般」页签
2. 按一下 服务器角色 页签,如图34-3所示。在这个页签中可以指定新的登入选取的服务器角色,在可使用的角色清单中选择。按一下 属性 允许检视和修改所选取的角色。(有关角色的讨论将在本章的 <管理数据库角色> 一节中进行。)
图34-3「SQL Server 登入属性」窗口的「服务器角色」页签
3. 选取 数据库存取 页签,如图34-4所示。这个页签可指定权限使用者可以存取的数据库。(数据库权限将在 <管理数据库存取权限> 一节中说明。)您可选择多个数据库以及对于这些数据库可用的角色。按 属性 就能检视和管理数据库角色属性。
图34-4「SQL Server 登入属性」窗口的「数据库存取」页签
4. 完成指定选项之后,按一下 确定 储存登入账户。要看新的登入账户和其它登入账户,可以在 Enterprise Manager 中选取 登入 数据夹。在右边的选单中会列出所有登入账户。
使用 T-SQL 建立登入账户
使用 T-SQL 可以建立登入账户,需要使用 sp_addlogin 预存程序或sp_grantlogin 预存程序。sp_addlogin 预存程序只能将 SQL Server 验证过的使用者加入 SQL Server 数据库中。sp_grantlogin 预存程序则可以将 Windows NT/2000 验证过的使用者加入。
sp_addlogin 预存程序的语法如下:
sp_addlogin [@loginame =] 'login'
[ , [ @passwd = ] 'password' ]
[ , [ @defdb = ] 'database' ]
[ , [@deflanguage = ] 'language' ]
[ , [ @sid = ]'sid' ]
[ , [ @encryptopt = ] 'encryptionoption' ]
可选择的参数如下:
• 密码 指定 SQL Server 登入账户密码。默认值为 NULL。
• 数据库 指定登入账户的预设数据库。默认值为 master 数据库。
• 语言 指定登入账户的预设语言。默认值为现有的 SQL Server 语言设定。
• 安全性识别码 (sid)指定安全性识别码(一个唯一的数值)。如果没有指定这个数值,系统将会自动产生一个数值。使用者通常不使用 sid 参数,但是管理员可能在一些情况下会使用到 sid 。当 DBA 执行疑难排解任务时,可能需要使用 sid ,以确定正在检查哪个登入账户。 sid 参数是登入账户的内部识别码。
• encryptopt_option指定是否在系统数据表中将密码加密。默认值为NULL,表示密码被加密。指定 skip_encryption 表示密码没有加密。如果指定 skip_encryption_old,那么在较早版本的 SQL Server 中已加密的密码将不再被加密。只有在想要避免加密系统数据表中的密码时,才需要更改这个设定。
下面是一个简单的新增登入账户的范例:
EXEC sp_addlogin 'PatB'
记住在预存程序名称前要使用 EXEC 关键词。
下面是一个较复杂的新增登入账户范例。
sp_addlogin 'SharonR','mypassword','Northwind','us_english'
这个命令建立了名叫 SharonR 的使用者,使用 mypassword 密码。预设数据库为 Northwind,预设语言为 U.S. English。一般而言,让 SQL Server 来建立安全性识别比您自己来建立要好些。
sp_grantlogin 预存程序有下列语法:
sp_grantlogin 'login_name'
使用 sp_grantlogin 预存程序的范例如下:
EXEC sp_grantlogin 'MOUNTAIN_DEW\DickB'
在增加了这些登入账户之后,在左边的窗格中选取 登入 数据夹,以便在Enterprise Manger 中检视这些登入账户。
使用建立登入精灵
可依下列步骤,利用 建立登入精灵 建立 SQL Server 登入账户:
1. 展开一个服务器群组,并选取一个服务器。在 工具 菜单中选择 精灵 。在 选择精灵 对话框中展开 数据库 数据夹,选择 建立登入精灵 ,如图34-5所示,按 确定 。此时将显示 欢迎使用建立登入精灵 ,如图34-6所示。
图34-5选择精灵画面
图34-6欢迎使用建立登入精灵画面
2. 按 下一步 进入 选取这个登入的验证模式 画面,如图34-7所示。在这个画面中,您可以指定是否使用 Windows 验证或 SQL Server 验证(混合模式)。
图34-7选取这个登入的验证模式画面
3. 按 下一步 进入 使用Windows NT的账户验证 画面或 使用SQL Server的验证 画面,出现的画面取决于步骤 2 中选取的验证模式。图34-8显示稍后的画面。在这个画面中指定登入 ID 和密码。如果选择的是 Windows NT 验证,请键入网域名称和使用者账户名称。
图34-8使用 SQL Server 的验证画面
4. 按 下一步 ,显示 同意对安全性角色的存取 画面,如图34-9所示。在这个画面中,可以选取分配到该登入账户上的数据库角色。
图34-9同意对安全性角色的存取画面
5. 按 下一步 进入 同意对数据库进行存取画面 ,如图34-10所示。在这个画面中可以选取登入账户可以存取的数据库。
图34-10同意对数据库进行存取画面
6. 按 下一步 进入 完成建立登入精灵 画面,如图34-11所示,这里可以在文字方块中检查摘要信息。要变更设定可按 上一步 回到之前的画面,按 完成 即可完成建立新登入账户。
图34-11完成建立登入精灵画面
建立 SQL Server 使用者
SQL Server 使用者可以利用 Enterprise Manager 或 T-SQL 建立。(在 SQL Server 中并没有用来完成这项设定的精灵)。本节中将利用这两种方式建立 SQL Server 使用者。请记住,SQL Server 使用者是为特定的数据库所定义,且特定的使用者登入名称对该数据库有不同的使用权限。SQL Server 使用者 ID 可被视为 SQL Server 登入账户的同义词,但是在登入时两者并不需要使用相同的名称。
________________________________________
说明
建立 SQL Server 使用者前,必须先为该使用者定义 SQL Server 登入账户,因为使用者名称需参照 SQL Server 登入账户。
________________________________________
使用 Enterprise Manager 建立使用者
与 SQL Server 登入账户不同的是,登入账户是在 Enterprise Manager 的 Security 数据夹中建立的,而 SQL Server 使用者则在 Enterprise Manager 左侧选单的指定数据库档案夹中建立。要使用 Enterprise Manager 建立使用者,请按照下列步骤操作:
1. 在需要建立使用者的数据库上按一下鼠标右钮,在快捷菜单中选择 新增 ,然后选择 数据库使用者 ,进入 数据库使用者属性 窗口,如图34-12所示。在 登入名称 下拉式清单中键入一个有效的 SQL Server 登入账户名称,并在 使用者名称 文字方块中键入新的使用者名称。在 数据库角色使用权限 清单中选取合适的复选框,为新使用者分配数据库角色。在本章的后面可以看到,为这些角色分配权限,便能够将权限套用到使用者上。
图34-12数据库使用者属性画面
2. 按下 属性 按钮进入 数据库角色属性 画面,如图34-13所示。在这个窗口中可以更改选取的数据库角色。这个任务将在本章的 <管理数据库角色> 一节中解释。
图34-13数据库角色属性画面
3. 在我们完成了这些设定选项后,按两次 确定 即可建立数据库使用者。
使用 T-SQL 建立使用者
要使用 T-SQL 建立数据库使用者,可以执行 sp_adduse 预存程序。这个预存程序可以在 ISQL 或 OSQL 中执行,语法如下:
sp_adduser [ @loginame = ] 'login'
[ , [ @name_in_db = ] 'user' ]
[ , [ @grpname = ] 'group' ]
Login 这个参数是 SQL Server 登入账户的名称,是必须提供的数据。user 变量是新的使用者名称,group 则是新使用者所隶属的群组或角色。如果没有指定 user 值,那么它的值会与 login 参数相同。
下面的命令建立了一个新的数据库使用者,其名称为 JackR 和 Windows NT 或Windows 2000 账户 FORT_WORTH\DB_User:
sp_adduser 'FORT_WORTH\DB_User', 'JackR'
FORT_WORTH 是系统或者网域名称,而 DB_User 是 Windows NT 或Windows 2000 账户名称。
管理数据库存取权限
存取权限 (permissions)用来控制数据库对象的存取,并指定可操作特定数据库操作的使用者。可以将服务器和数据库存取权限都设定。服务器存取权限允许 DBA 执行数据库管理任务,数据库存取权限则是用来允许或者禁止存取数据库对象和陈述式。本节中将讨论存取权限的类型,以及如何分配存取权限。
服务器存取权限
服务器存取权限是分配给 DBA,允许DBA执行管理任务。这些存取权限定义在固定服务器角色。使用者登入账户也可以分配给固定服务器角色,但是这些角色不能被更改。(在本章稍后的 <使用固定的服务器角色> 一节中将讨论服务器角色。)服务器存取权限包括 SHUTDOWN、CREATE DATABASE、BACKUP DATABASE 和 CHECKPOINT 存取权限。服务器存取权限只能授权 DBA 作为执行管理任务使用,而不需要更改或者授予个人使用者。
数据库对象存取权限
数据库对象权限是权限类型中,属于允许数据库对象存取的类型。在存取数据表或检视使用 SQL 陈述式(如 SELECT、INSERT、UPDATE 和 DELETE)存取对象时,就需要使用对象存取权限。使用 EXECUTE 陈述式执行预存程序时也需要对象存取权限。
使用 Enterprise Manager 指定对象存取权限
要使用 Enterprise Manager 将数据库对象存取权限授予使用者,请按照下列步骤操作:
1. 展开服务器群组,展开一个服务器,展开需要分配存取权限的数据库,然后选取 使用者 数据夹。在右边窗格中会列出使用者。请在使用者名称上按一下鼠标右钮,并从快捷菜单中选择 内容 ,进入 数据库使用者属性 窗口,如图34-14所示。
图34-14「数据库使用者属性」窗口
2. 按下 权限 按钮,进入 数据库使用者属性 窗口,如图34-15所示。(也可以在使用者名称上按一下鼠标右钮,从快捷菜单中选择 所有工作 ,然后选择 管理使用权限 来进入这个个窗口)。这里可以管理分配该使用者的存取权限,可以为该使用者分配多种存取权限,利用画面中的复选框指定 SELECT、INSERT、UPDATE、DELETE、EXEC 和 Declarative Referential Integrity(DRI)窗体数据列的存取权限。这些对象列在 对象 数据列中。也可以使用画面上方的选项来列出所有的对象,或只显示这个使用者有权限的对象。
图34-15数据库使用者属性窗口中的权限窗口
使用 T-SQL 分配对象存取权限
执行 GRANT 陈述式,可利用 T-SQL 将对象存取权限指定给使用者。GRANT陈述式的语法如下:
GRANT {ALL | permission}
[ column ON {table | view} ] |
[ ON table(column) ] |
[ ON view(column) ] |
[ ON {stored_procedure | extended_procedure} ]
TO security_account
[ WITH GRANT OPTION ]
[ AS {group | role} ]
security_account 参数必须是下列账户类型之一:
• Microsoft SQL Server使用者
• Microsoft SQL Server角色
• Microsoft Windows NT 或 Windows 2000 使用者
• Windows NT 或 Windows 2000 群组
使用 GRANT OPTION 关键词允许使用者将该权限授予其它使用者。这在授予存取权限给其它的 DBA 时很有用。然而,应该要小心使用 GRANT 选项。
AS 选项指定要执行 GRANT 陈述式的权限。GRANT 陈述式必须在使用者或角色有被授予权限时才能执行。
GRANT 陈述式可以按照下面的方式使用:
GRANT SELECT , INSERT, UPDATE
ON Customers
TO Guest
WITH GRANT OPTION
AS Accounting
因为 Accounting 角色可以在 Customers 资料表上授予存取权限,所以要使用AS Accounting 选项。GRANT OPTION 关键词让 MaryW 可将存取权限授予其它的使用者。
________________________________________
相关信息
要检视 GRANT 陈述式中指定的存取权限清单,请参阅< 在线丛书 >索引中的GRANT。
________________________________________
使用 T-SQL 撤销对象存取权限
您可以用 T-SQL REVOKE 命令来撤销使用者的对象存取权限。REVOKE 陈述式的语法如下:
REVOKE [ GRANT OPTION FOR ]
{ ALL [ PRIVILEGES ] | permission }
[ column ON {table | view} ] |
[ ON table(column) ] |
[ ON view(column) ] |
[ ON {stored_procedure | extended_procedure} ]
{ TO | FROM } security_account
[ CASCADE ]
[ AS {group | role} ]
security_account 参数必须是下列账户类型之一:
• Microsoft SQL Server 使用者
• Microsoft SQL Server 角色
• Microsoft Windows NT 或 Windows 2000 使用者
• Windows NT 或 Windows 2000 群组
与撤销存取权限相同,GRANT OPTION FOR 选项允许您撤销之前用 GRANT OPTION 关键词授予的存取权限。AS 选项指定要执行 REVOKE 陈述式的权限。
以下是使用 REVOKE 陈述式的范例:
REVOKE ALL
ON Customers
TO MaryW
REVOKE AL L陈述式将移除在 Customers 数据表中使用者 MaryW 拥有的所有存取权限。
________________________________________
相关信息
要检视在 REVOKE 陈述式中指定的存取权限清单,请查阅《在线丛书》索引中的 REVOKE。
________________________________________
数据库陈述式存取权限
除了数据库对象存取权限,您还可以分配陈述式存取权限。对象存取权限让使用者存取数据库中现存的对象,而陈述式存取权限则授权使用者建立数据库对象,包括数据库和数据表。陈述式存取权限如下:
• BACKUP DATABASE 执行 BACKUP DATABASE 命令
• BACKUP LOG 执行 BACKUP LOG 命令
• CREATE DATABASE 用来建立新的数据库
• CREATE DEFAULT 用来建立可关联至字段的默认值
• CREATE PROCEDURE 用来建立预存程序
• CREATE RULE 用来建立规则
• CREATE TABLE 用来建立新的数据表
• CREATE VIEW 用来建立新的检视
陈述式存取权限可以用 Enterprise Manager 或 T-SQL 分配。
使用 Enterprise Manager 分配陈述式存取权限
要使用 Enterprise Manager 为使用者授予数据库的陈述式存取权限,请按照下列步骤操作:
1. 展开一个服务器群组,展开一个服务器,然后展开 数据库 数据夹。在需要分配存取权限的数据库上按一下鼠标右钮,并从快捷菜单中选择 内容 ,显示数据库的属性窗口,如图34-16所示。
图34-16数据库的属性窗口
2. 选取 权限 页签,如图34-17所示。在这里可以为存取该数据库的使用者分配存取权限。这些数据列包含复选框,规定了所要分配的陈述式存取权限,而 使用者/角色 字段列出了存取这个数据库的使用者和角色。
图34-17数据库属性窗口的权限页签
使用 T-SQL 分配陈述式存取权限
您可以使用 GRANT T-SQL 陈述式为使用者分配陈述式存取权限。GRANT 陈述式的语法如下:
GRANT { ALL | statement }
TO security_account
可以分配给使用者的陈述式存取权限包括 CREATE DATABASE、CREATE DEFAULT、CREATE PROCEDURE、CTEATE RULE、CREATE TABLE、CREATE VIEW、BACKUP DATABASE 和 BACKUP LOG,如前所述。例如要为使用者账户 Elea 新增 CREATE DATABASE和CREATE TABLE 陈述式存取权限,请使用下面的命令:
GRANT CREATE DATABASE,CREATE TABLE
TO 'Elea'
所以,为使用者账户新增陈述式存取权限其实并不困难。
使用 T-SQL 撤销陈述式存取权限
您也可以使用 T-SQL 陈述式 REVOKE 来撤销使用者账户的陈述式存取权限。REVOKE 陈述式的语法如下:
REVOKE { ALL | statement }
FROM security_account
例如,要从使用者账户 Elea 上撤销 CREATE DATABASE 陈述式存取权限,可使用下列命令:
REVOKE CREATE DATABASE
FROM 'Elea'
正如所见,撤销使用者的陈述式存取权限也不是个复杂的过程。
管理数据库角色
使用数据库角色可以简化管理使用者存取权限的工作。数据库角色就是设计用来允许一组使用者接受同样的数据库存取权限,这样便不需要个别的分配这些存取权限。不要分配给每个使用者个人的存取权限,可以为一组使用者建立角色,然后分配存取权限。
角色是为了特殊的工作群组、工作类别或工作任务而设计。在这种情况下,根据新使用者所执行的工作,它们可以成为一个或多个数据库角色的成员。例如,角色可能定义成工作类别,如支付性账户、接受性账户、工程以及人力资源等。当一个使用者加入这些部门或群组中时,他或她就被分配为这个角色的一个成员。一个使用者可以是一个或多个角色的成员,但是并不一定要求使用者成为某一角色的成员。除了成为数据库角色的成员以外,使用者也可以分配个人存取权限。
建立和修改角色
和 DBA 所执行的大多数任务一样,建立和修改数据库角色也可以透过Enterprise Manager 或 T-SQL 命令来完成。(SQL Server 没有提供这一类的精灵。)这两种方法必须完成同样的例行性任务:
• 建立数据库角色。
• 为角色分配存取权限。
• 为角色分配使用者。
当检视角色时,可以看到分配给角色的存取权限和分配给角色的使用者。
使用 Enterprise Manager 管理角色
要使用 Enterprise Manager 建立数据库角色,请按照下列步骤操作:
1. 展开一个服务器群组,展开一个服务器,然后展开 数据库 数据夹。在需要建立角色的数据库上按一下鼠标右钮(本范例使用 Northwind),并从快捷菜单中选择 新增 ,接着选择 数据库角色 。另外一种方法,可以展开数据库,在 角色 上按一下鼠标右钮,并从快捷菜单中选择 新增数据库角色 。这两种方法都可进入 数据库角色属性 窗口,如图34-18所示。
图34-18「数据库角色属性」窗口
2. 在 名称 文字方块中键入名称来为角色分配描述性名称-请选择一个有助于记住角色功能的名称。
3. 按一下 新增 为角色分配使用者。这时将会显示可以存取该数据库的使用者账户清单,如图34-19所示。选取要分配给该角色的使用者。如果要取消选择使用者,只要在使用者名称上再按一下就可以了。在完成修改角色成员后,按一下 确定 即可建立了新角色。现在返回 Enterprise Manager 窗口中。
图34-19新增角色成员对话框
4. 要为角色分配存取权限,先展开 角色 数据夹开启 数据库角色属性 窗口,在角色名称上按一下鼠标右钮,并从快捷菜单中选择 内容 。然后按一下 权限 ,进入 数据库角色属性 - Northwind 窗口,如图34-20所示。
在这个窗口中,可以为数据库中的对象角色分配不同的存取权限。选择清单中适合的复选框。数据库对象是列在 对象 数据列中的。选择窗口上方的选项可以检视所有的对象,或是列出这个角色有权限的对象。一旦分配了一个角色给某个使用者,使用者就获得了分配给这个角色的所有存取权限。
在建立了角色后,可以在 数据库角色属性 窗口中修改。要修改角色,请按照为角色增加存取权限的步骤操作。也可以在 数据库角色属性 窗口中新增以及删除使用者和存取权限。
使用 T-SQL 管理角色
也可以使用 sp_addrole 预存程序来建立角色。sp_addrole 预存程序的语法如下:
sp_addrole [ @rolename = ] 'role'
[ , [ @ownername = ] 'owner' ]
图34-20数据库角色属性 - Northwind窗口
例如,要在 Northwind 数据库中加入一个名称为 readonly 的角色,请使用下列 T-SQL 命令:
USE Northwind
GO
sp_addrole 'readonly' , 'dbo'
GO
USE Northwind 命令选取 Northwind 为目前数据库。如果没有指定数据库,那么在预设数据库中会建立角色。
这个预存程序只能建立角色。要为角色增加存取权限,请使用前面描述的 GRANT 陈述式。要为角色删除存取权限,请使用 REVOKE 陈述式。
例如,要为 readonly 角色增加 Employees、Customers 和 Orders 数据表的SELECT 存取权限,请使用下列的 GRANT 陈述式:
USE Northwind
GO
GRANT SELECT
ON Employees
TO readonly
GO
GRANT SELECT
ON Customers
TO readonly
GO
GRANT SELECT
ON Orders
TO readonly
GO
要为角色增加使用者,请使用 sp_addrolemember 预存程序。sp_addrolemember 预存程序的语法如下:
sp_addrolemember 'role','security_account'
下列命令可为 readonly 角色增加使用者:
USE Northwind
GO
sp_addrolemember 'readonly' , 'Guest'
GO
使用固定的服务器角色
在 SQL Server 安装时,建立了大量预先定义的服务器角色。这些固定服务器角色被用来授予存取权限给 DBA,这些角色包含了服务器存取权限以及对象和陈述式存取权限,清单如下:
• bulkadmin可以执行大量插入
• dbcreator可以建立和变更数据库
• diskadmin可以管理磁盘档案
• processadmin可以管理S QL Server 程序
• securityadmin可以管理登入账户和建立数据库存取权限
• serveradmin可以设定任何服务器选项,并且可以关闭数据库
• setupadmin可以管理连结的服务器和启动程序
• sysadmin可以执行任何服务器行为
为使用者账户分配固定服务器角色,可让使用者执行角色所拥有存取权限的管理任务。依需要让所有的DBA使用相同的管理账户可能会更好些。与数据库角色相比,固定服务器角色比个人存取权限更容易维护,但是固定服务器角色是不能修改的。您可以按照下列步骤为一个使用者分配固定服务器角色。
1. 在 Enterprise Manager 中展开一个服务器群组,展开一个服务器,展开 安全性 数据夹,然后选取 服务器角色 。在需要加入使用者的固定服务器角色上按鼠标右钮,并从快捷菜单中选择 内容 ,进入 服务器角色 窗口,如图34-21所示。
图34-21服务器角色窗口
2. 按 新增 ,为新增的使用者账户分配固定服务器角色。这将呼叫 新增成员 对话框,如图34-22所示。
图34-22新增成员对话框
3. 选取了需要加入固定服务器角色的使用者之后,按一下 确定 ,返回 服务器角色属性 窗口。请按一下 确定 为安全性角色新增使用者。
安全性账户授权
SQL Server 2000 使用 Kerberos 安全模式建立安全性。(关于 Kerberos 安全模式的信息可参阅 第 2 章 。)SQL Server 2000 使用 Kerberos 通讯协议来支持客户端与服务器之间的相互认证。这使得客户端的安全识别能够在计算机之间流通,于是就可连接到不同的服务器上;登入新的服务器时,可使用个人化的用户识别进行数据的存取。这就是安全性账户授权。
我们来看一个安全性账户授权的例子。假定一个用户连接到 Server A 为NTDOMAIN\AlexR,而 ServerA 又与 ServerB 相连接。那么 ServerB 就知道连接的安全性识别为 NTDOMAIN\AlexR。这减少了用户登入到 ServerB 的需求。
如果要使用安全性账户授权,所连接的所有服务器都必须能够执行 Windows 2000,并支持 Kerberos,而且您必须正在使用 Active Directory 服务。下列选项必须在 Active Directory 中设定,以便进行授权:
• 账户敏感无法授权 要求授权的使用者绝对不能选择这个选项。
• 账户可以授权 SQL Server 2000 的服务器账户一定要选这个选项。
• 计算机可以授权 执行 SQL Server 2000 的服务器一定要选这个选项。
设定 SQL Server
在使用安全性账户授权之前,必须先设定 SQL Server 2000 来接受授权。授权促成彼此相互确认。要使用安全性账户授权,SQL Server 2000 必须有 Windows 2000 账户网域管理员分配的 Service Principal Name(SPN)。SPN 必须分配到计算机上 SQL server 的服务器账户。SPN 必须证明 SQL server 是经由特定服务器以及 Windows 2000 账户网域管理员认证的。您可以让您的网域管理员使用在 Windows 2000 Resource Kit 上取得的 Setspn 公共程序,来为 SQL Server 建立一个 SPN。
要建立 SPN,请执行下列命令:
setspn -A MSSQLSvc/Host:port serviceaccount
以下为使用这个命令的范例:
setspn -A MSSQLSvc/MyServer.MyDomain.MyCompany.com sqlaccount
________________________________________
相关信息
关于 Setspn 公用程序的相关信息,请参阅 Windows 2000 文件。
________________________________________
您也必须用 TCP/IP 来使用安全性账户授权,不能使用已命名的管道,因为 SPN要使用特定的 TCP/IP 通讯端。如果使用多重连接埠,每个连接埠都必须有 SPN。
您可以用 LocalSystem 账户授权。SQL Server 将在服务器启动时自己注册登记,并且自动登记 SPN。这个选项比使用网域的使用者账户来授权还要容易。然而,当 SQL Server 关闭时,SPN 将无法替 LocalSystem 账户注册。为了在 LocalSystem 账户之下授权,请在 Setspn 公用程序中执行下列命令:
setspn -A MSSQLSvc/Host:port serviceaccount
________________________________________
说明
如果您要在 SQL Server 2000 中变更服务器账户,您必须删除之前定义的SPN,然后建立新的账户。
________________________________________
本章总结
本章学习了 SQL Server 使用者和安全性管理,也看到了如何使用数据库登入账户和数据库使用者账户允许数据库的存取。此外还学习如何建立与管理登入账户和数据库使用者,并学到了如何利用数据库角色简化使用者管理,并依照工作性质分配角色的存取权限。角色可以分配给多个使用者,让分配存取权限和修改变得更加容易。此外也看到了被称为固定服务器角色的特殊角色,这些角色是用来为使用者和 DBA 分配管理存取权限。最后我们看到了在 SQL Server 2000 中安全性的提升,使得服务器之间的安全性账户更能够安全地流通。在 第 35 章 中,我们将学习 SQL 预存程序以及如何调校 SQL 查询。