第9学时许可
在上一学时中,你学习了安全性的概念,知道了怎样保证你服务器的安全,以及怎样禁
止那些非法用户进入你的服务器。但是,你将面临的问题是当用户进入你服务器中的数据库
后,怎么办?经常会遇到在一个数据库里存有一些某些用户不能访问的信息这种情况。例如,
在一个数据库里存有人员资料数据,你可能不想让所有用户都看到工资和纳税情况,但是又
允许所有用户能访问到姓名和电话号码资料。想实现这种类型的功能,需要分配许可给某些
用户,并撤销另一些用户的访问权。
本学时的要点包括:
• 什么是许可
• 许可类型
• 许可状态
• 分配许可
• 拥有权链
9.1 什么是许可
简单地说,许可用于控制用户在SQL Server里执行特定任务的能力。它们允许你的用户
访问数据库里的对象并授权他们对那些对象进行某些操作。如果用户没有被明确地授予访问
数据库里一个对象的许可,他们将不能访问数据库里的任何东西。
在数据库里分配许可可以有几个不同的层次。你能分配许可给单个用户、你建立的角色
和增加到服务器上的Windows NT组。当你分配许可时,记住分配许可给一个角色或一个组,
比分配给单个用户要容易得多。它们分配许可的实际操作是一样的,区别在于工作量。分配
许可给一个有1 0 0人的角色或组,要比分配许可1 0 0次给所有1 0 0个用户要容易得多。
在分配许可给任何用户前,你需要保证已经研究过他们的需求。一些用户只是需要看看
存在数据库中的数据,一些用户需要能增加和修改数据,还有些用户则需要在数据库中创建
对象。D B A最主要的责任之一是保证把适当的许可分配给需要它的用户。
9.2 许可类型
在SQL Server中有三种类型的许可。其中两种可以委派给其他用户。第三种类型的许可
只允许属于特定角色的人使用。这三种许可类型是语句许可、对象许可和隐含许可。
9.2.1 语句许可
语句许可通常只给那些需要在数据库中创建或修改对象、执行数据库或事务日志备份的
用户。这类许可是SQL Server中功能最强大的一些许可,并且正常情况下,很少人需要这些
许可。通常,只有数据库开发人员或其他帮助管理服务器的用户需要这类许可。重要的是要
认识到所有这些许可只限分配在单个数据库这一级,跨数据库的许可是不可能的。
当分配语句许可给你的用户时,你就给了他们创建对象的能力,通常使用对应的S Q L命
令来引用。语句许可包括:
• C R E ATE DATA B A S E—得到这种许可的用户能在服务器上创建新的数据库。这种许可
只能在m a s t e r数据库中设置。
• CREATE DEFA U LT—得到这种许可的用户能在当前数据库上创建缺省对象。
• CREATE PROCEDURE—这种许可允许用户在当前数据库中创建存储过程。
• CREATE RULE—这种许可允许用户在当前数据库中创建规则。
• CREATE TA B L E—拥有这种许可的用户可以在当前数据库里创建表。
• CREATE VIEW—这种许可允许用户在当前数据库里创建视图。
• BACKUP DATA B A S E—这种许可允许用户创建一个给予他们这种许可的数据库的备
份。
• BACKUP LOG—这种许可允许用户创建一个给予他们这种许可的数据库的事务日志
的备份。
关于语句许可,要记住实际上你将很少分配这种许可给用户。这是因为你将更多地分配
用户到一个或多个预定义的服务器角色中,在那里他们将获得这些许可。
9.2.2 对象许可
对象许可分配给数据库层次上的对象,并允许用户访问和操作数据库中已存在的对象。
没有这些许可,你的用户将不能访问数据库里的任何对象。这些许可,像语句许可一样,实
际上给了用户运行特定S Q L命令的能力,通常也通过这些命令来实现。可用的对象许可有以
下几种:
• S E L E C T—这种许可分配给数据库中一个指定表的用户。当用户拥有这种许可后,他
便能访问、存储该表上的数据。
• I N S E RT—这种许可分配给数据库中一个指定表的用户。当用户拥有这种许可后,他
便能够增加新数据到该表上。
• U P D AT E—这种许可分配给数据库中一个指定表的用户。当用户拥有这种许可后,他
便能修改数据库里存在的数据。
• D E L E T E—这种许可分配给数据库中一个指定表的用户。当用户拥有这种许可后,他
便能从表中删除数据。
• E X E C U T E—这种许可分配给一个存储过程的用户。拥有这种许可的用户可以运行该
存储过程。
• R E F E R E N C E S—这种特殊类型的许可允许一个用户使用一个主键/外键关系把两个表
链接到一起。在大多数正常情况下,你的用户不需要有这种类型的许可。
有关分配对象许可的问题是每个用户或角色一次只能分配一种对象。如果你要把许可分
配给单个用户,将要耗费许多时间。较好的方法是把许可分配给角色,然后再分配用户到这
个角色。
9.3 许可状态
在使用SQL Server许可工作时,对于一个指定的用户,一个许可可以有三种状态。这些
第9学时许可8 1
下载
8 2 SQL Server 7 24学时教程
状态决定了用户能否执行这种特殊功能。重要的一点是记住当许可被授予一个角色或从一个
角色撤销时,属于该角色的用户便继承了角色的许可状态。即使一个用户被直接授予或撤销
一种许可,而他是已经被授予或撤销同样许可的角色中的成员时,角色许可将覆盖直接许可。
许可的三种状态是禁止、撤销和授予。
9.3.1 禁止
禁止许可是许可的最高级别。一种许可对一个用户禁止(无论在什么级别)后,禁止这个用
户访问,即使他在另一个级别被授予访问权。例如, M a r k是E d i t o r s角色中的一员。E d i t o r s角
色在a u t h o r s表上被授予S E L E C T许可,而M a r k在a u t h o r s表上被禁止S E L E C T许可。这时,
M a r k便不能访问a u t h o r s表。反过来也一样适用。
9.3.2 撤销
当一个许可被撤销时,它只是简单地删除以前分配给用户许可的禁止或授予状态。如果
同样的许可在另一级别上被授予或禁止,还依然适用。例如, Mark 是E d i t o r s角色中的一员。
E d i t o r s角色在a u t h o r s表上被授予S E L E C T许可,而M a r k在a u t h o r s表上被撤销了S E L E C T许可。
这时, M a r k仍然能访问a u t h o r s表。要想彻底地取消这个许可,你必须明确地在E d i t o r s角色上
撤销或禁止这个许可,或者对M a r k禁止这个许可。
9.3.3 授予
一个授予许可将会删除以前的禁止许可或撤销许可,并允许用户执行这个功能。如果同
一个许可在任一其他级上被禁止,用户将不能使用这项功能。如果这个许可在另一级上被撤
销,用户仍然能够使用这项功能。例如,如果Mark 在a u t h o r s表上被授予S E L E C T许可,而
E d i t o r s角色在a u t h o r s表上被撤销S E L E C T许可,M a r k仍然能访问a u t h o r s表。
9.4 分配许可
你已学习了能分配的那些许可和能分配许可所在的级别。我们该来看一下如何分配许可。
你可以通过SQL Enterprise Manager或在SQL Query Analyzer中运行S Q L命令来分配许可。你
必须是数据库拥有者,是对象拥有者,或属于分配许可的d b s e c u r i t y a d m i n数据库角色。
9.4.1 使用SQL Enterprise Manager分配许可
使用SQL Enterprise Manager分配许可是最容易的方法。所有工作都通过图形界面完成,
你不需要知道任何实际运行的底层S Q L命令。下面将教你分配许可给用户Te s t U s e r,该用户是
上一学时在p u b s数据库中所创建的。
1) 打开SQL Enterprise Manager并连接到你要使用许可的服务器上。
2) 展开服务器名字旁边的树,显示服务器上所有对象目录。
3) 展开数据库文件夹旁的树,显示服务器上所有数据库。
4) 点击p u b s数据库旁边的加号。这将显示p u b s数据库中所有对象的目录。
5) 点击“Ta b l e s”文件夹。在右边框中找到A u t h o r s表,在其上点击鼠标右键,选择“ A l l
Ta s k s”选项,然后点击“ Manage Permissions”选项。这将打开“ Object Properties”窗口,
下载
如图9 - 1所示。
6) 要分配给Te s t U s e r用户的许可是能够在表中对数据使用S E L E C T和I N S E RT操作,但是
又要禁止U P D AT E和D E L E T E操作的许可。要做到这些,点击与所分配的许可同一行上的方框。
对授予许可,点击一下,直到你看到一个勾号。对禁止许可,点击两下,直到你在方框中看
到红色的X。对撤销许可,在方框中点击,直到方框中什么也没有。在你分配完成上述许可后,
屏幕应该如图9 - 2所示。
7) 当你完成许可分配后,点击“ O K”按钮,SQL Server将分配所有这些许可。
9.4.2 使用SQL命令分配许可
在分配许可时,另一个选择是使用S Q L命令并在SQL Query Analyzer中运行它们。这将通
过使用G R A N T、D E N Y、R E V O K E命令来实现。这些命令的语法如下:
对于语句许可:
第9学时许可8 3
下载
图9-1 “Object Properties”
对话框
图9-2 分配许可后的“O b j e c t
P r o p e r t i e s”对话框
对于对象许可:
下面是选项的意义:
选项描述
A L L 随你执行的命令不同,该项将指定所有许可被授予、撤销禁止
statement[, . . .n] 该项是你要应用的语句许可。有关语句许可的清单可以在前面“语句许
可”部分找到
TO / F R O M 这个关键词指定你分配许可到哪个帐号上。如果分配的是授予许可,要
使用关键词TO;如果分配的是撤销或禁止,要使用关键词F R O M
security_account[, . . .n] 这是你要使用的许可的帐号
permission[, . . .n] 这是你要使用的对象许可的名称。可用的对象许可列表可以在前面“对
象许可”部分中找到
column[, . . .n] 如果需要,可以把对象许可分配到具体的列上。如果要这样做,你要在
此给出列名清单
O N 这个关键词将告诉SQL Server把许可分配给哪张表、哪个视图或哪个存
储过程
table view 这是你分配许可的表或视图的名称
s t o r e d p r o c e d u r e 这是你分配执行许可的存储过程的名称
[WITH GRANT OPTION] 当使用对象许可时,如果你指定了这个关键词,将允许用户进一步分配
授予许可给其他的用户
[ C A S C A D E ] 在你分配撤销或禁止许可给一个用户时,如果你指定这个选项,SQL Server
将同时撤销或禁止这个用户曾向其他用户授予过的许可
程序清单9 - 1中的代码将授予用户Te s t U s e r在a u t h o r s表上的S E L E C T、U P D AT E和I N S E RT
许可。
程序清单9-1 分配许可
GRANT SELECT, UPDATE, INSERT ON authors TO Te s t U s e r
9.5 拥有权链
在你学习许可时,把本节放进来似乎有些奇怪,但是这会对你在后续课程中和在后面将
要使用的项目中创建对象产生明确的影响。存储过程和视图要依赖数据库里的其他对象,如
表、视图或其他存储过程。这些依赖关系有时被叫作拥有权链。
大多数情况下,拥有存储过程或视图的用户将同时拥有下层对象,往往这些下层对象作
为一个新对象存在于同一个数据库中。
当用户访问一个视图或一个存储过程时,如果所有的下层对象都属于同一个用户,且都
存在于同一个数据库中, SQL Server将不检查这些下层对象的许可。如果任一个对象属于不
8 4 SQL Server 7 24学时教程
下载
|
|
第9学时许可8 5
同的用户或在不同的数据库中,你将不得不处理所谓的断裂的拥有权链。如果有断裂的拥有
权链发生, SQL Server将在链中下一个节点不属于同一个用户的每个对象上检查的许可。主
要问题是对象的拥有者必须是分配许可给对象的那个人。这就意味着,每次上层对象的许可
被改变,所有其他对象的拥有者都不得不调整他们对象的许可。如果他们不改变,新用户将
因为许可问题不能访问这些下层对象。
重要的一点是你要保证当数据库创建时,数据库中所有的对象都要属于同一个人。要做
到这一点,最简单的办法是确保打算在数据库中创建对象的用户能以数据库拥有者的身份来
创建。你还应当确保所有其他的用户被禁止许可在数据库中创建对象。
9.6 课时小结
在本学时中,你学习了许可和怎样分配许可。首先,你学了许可有三种基本类型—只有
两种能分配给用户。其次,你学了有两种不同的方法用于分配许可,即通过SQL Enterprise
M a n a g e r和使用SQL Query Analyzer中的S Q L命令。最后,你明白了什么是拥有权链和怎样避
免断裂的拥有权链。
9.7 专家答疑
问题:所有有关数据访问的许可都由我的用户访问数据时所使用的应用程序来处理。对
我来说,在数据库中分配对象许可还很重要吗?
解答:对,你仍然需要在你的数据库里分配许可给对象,因为你的用户有可能使用其他
的方法(如SQL Query Analyzer)来访问你数据库中的数据。
问题:我有一个用户,他在数据库里创建了一个对象,而这个用户已经离开公司。在我
从数据库中删除这个对象之前,我需要做些什么?
解答:你需要删除那个用户所拥有的这个对象,或者通过使用s p c h a n g e o b j e c t o w n e r系统
存储过程改变这个对象的拥有者为另一个用户。
9.8 课外作业
这些思考题和练习题是供你加深理解用的。答案可以在附录“答案”中找到。
9.8.1 思考题
1) 许可被用来做什么?
2) 什么是语句许可?
3) 什么是对象许可?
4) 什么是隐含许可?
5) 用什么命令在一个表上允许一个用户有S E L E C T许可?
6) 什么是拥有权链?
7) 什么是断裂的拥有权链?
9.8.2 练习题
写出语句以允许用户Te s t U s e r具有在p u b s数据库上创建表的能力。
阅读(571) | 评论(0) | 转发(0) |