|<存储过程或扩展存储过程名>
TO <登录ID或角色名>[,…n]
[WITH GRANT OPTION]
[AS <角色名>]
ALL关键字表示你想要授予的是适用于那个对象类型的所有权限(EXECUTE绝不适用于表)。如果不使用ALL关键字,则需要提供一个或多个具体的权限,这些具体的权限是针对那个对象想要授予的。
PRIVILEGES是一个新的关键字,它除了提供ANSI-92兼容性外没有实际的功能。
ON关键字用作一个占位符,以说明接下来的是想要授予其权限的对象。注意,如果你是在表上授予权限,可以通过明确说明受影响的列的列表来指定下至列级的权限——如果不提供具体的列,则认为将影响所有的列。
在对列级权限的看法 上,微软似乎做的是些表面的事情。能够说一个用户可以在特定的表上进行SELECT,但仅限于在该表中特定的列上进行SELECT,这似乎很酷,然而,在 列级权限的使用中以及微软为实现列级权限所做的工作中,确实让安全性处理太过错综复杂了。鉴于此,近来关于该主题的文献,以及我从内部人士那里得到的消 息,似乎都表明微软想要丢弃列级安全性了。在使用上他们建议——如果需要限制用户只能看到特定的列,请改为考虑使用视图。
TO语句所做的事情正如你期望的那样——它指定想要把该访问权限授予谁。被授予权限的可以是登录ID或角色名。
WITH GRANT OPTION允许你向其授予访问权限的用户也能向其他用户授予访问权限。
由于使用该选项 后,要了解谁获得了访问什么的权限,将很快变得十分痛苦,因此,我建议避免使用该选项。当然,你总是可以进入到Management Studio中来查看对象上的权限,但那是被动反应的方式而非积极主动的方式——你是在查找当前访问级别上哪里出错了,而不是事先停止不希望发生的访问。
最后,但并非最不重要的,是AS关键字。该关键字处理的是一个登录名属于多个角色的问题。
接下来,我们来看一、两个例子。后面将看到,我们已 经创建的TestAccount账户,基于其是Public角色(所有的数据库用户都属于的东西,并且,无法从中移除)中的成员而拥有了一些访问权限。然 而,尚有大量的项目是TestAccount不具有访问权限的(由于Public是TestAccount唯一属于的角色,因此,Public也不具有那 些权限)。
先从以TestAccount用户登录开始。然后在Region表上尝试一个SELECT语句:
很快,你将收到来自SQL Server的消息,告知:你正在尝试去到你所不应该访问的地方。
单独以sa登录——如果你愿意,也可以在同一个查询编辑器实例中,通过选择菜单“文件”→“连接”,来完成这件事情。然后,为新的连接选择“SQL Server身份验证”,并用正确的密码以sa身份登录。现在,执行GRANT语句:










