设置权限
不论用户或角色,都是权限的设置对象。除了应用程序角色较特殊,与其他角色及用
户有相互排斥关系外,数据库角色及成员在权限的关系上非常密切。一个用户可能同时隶
属于多个数据库角色,每一角色又可拥有不同权限,此时用户获取实际权限的原则是“并
集”,除非有 deny(禁止)的设置。如角色 A 禁止读取数据表 B,但角色 C 可读取数据表
B,此时同时隶属角色 A 和 C 的用户,仍无法读取数据表 B,因为他已被禁止。
在权限的作用对象上,可分为服务器及数据库,即这两者可分别设置权限,请见如下
说明。
指定服务器权限
(1)在对象资源管理器的服务器上右击,再选择“属性”。
(2)在对话框中切换至“权限”。
(3)在“登录名或角色”中选择要设置权限的对象,在“显式权限”中分别勾选授权,
完成后单击“确定”按钮,如图 15-21 所示。
如图 15-21 所示,就是对服务器的权限设置。“授权者”就是当前登录至 SQL Server
服务器的登录名;“权限”是所有当前登录名可设置的权限;“授予”表示授予权限;若勾
选“具有授予”,表示 sa 授予选中对象的权限可再授予其他登录名;“拒绝”就是禁止使用。
这三个选项的选择有其连带关系,勾选“拒绝”,就自动清除“授予”及“具有授予”;若
勾选“具有授予”,则清除“拒绝”并选择“授予”。
“登录名或角色”就是被设置权限的对象,读者可单击“添加”按钮,指定其他登录
名或角色,但所有内置服务器角色均无法更改权限,但可以为 public 角色指定权限。
若要查看当前选择登录名或角色的权限,请单击“有效权限”按钮,因为有效权限可
能不止在图 15-21 中设置,还要视登录名所属的角色而定。所以图 15-21 只会显示在此设
置定义的权限,默认已有的权限则不会显示。
图 15-21 设置服务器权限
指定数据库权限
(1)在对象资源管理器中选择 eBook 数据库,右击后选择“属性”。
(2)在对话框中切换至“权限”。
(3)在“用户或角色”中选择要设置权限的对象,“显式权限”中分别勾选权限,完
成后单击“确定”按钮,如图 15-22 所示。
对象权限
(1)在对象资源管理器中选择 eBook 数据库,打开“数据表”,选择“Orders”数据
表,右击后选择“属性”。
(2)在对话框中切换至“权限”。
(3)单击“添加”按钮,再在对话框中指定要更改权限的用户、数据库角色或应用程
序角色。
(4)在“用户或角色”中选择要设置权限的对象,“显式权限”中分别勾选权限,完
成后单击“确定”按钮,如图 15-23 所示。
图 15-21 及图 15-23 的操作方式完全相同,区别是分别设置服务器、数据库及对象的
权限,可设置的对象也不同。在图 15-21 中可为登录名及服务器角色指定权限,在图 15-22
及图 15-23 中可为用户、数据库角色及应用程序角色指定权限;另一区别是可指定的权限
内容不同。
图 15-22 设置数据库权限
图 15-23 设置对象权限
权限内容
SQL Server 可设置的权限内容非常复杂,由服务器到对象共有 94 个权限,较难理解的
是服务器及数据库的属性,重要项目如表 15-4 所示。
表 15-4 重要权限说明
权限内容 说明
CONTROL 将类似所有权的能力授予给被授予者。被授予者实际上拥有安全对
象上已定义的所有权限
ALTER 授予更改特定安全对象的属性(除了所有权之外)的能力。在特定范
围授予 ALTER 权限时,也会一起授予更改、创建或删除该范围内
包含的任何安全对象的能力
ALTER ANY <服务器安全对象> 授予创建、更改或删除服务器安全对象的个别实例的能力
ALTER ANY <数据库安全对象> 授予 CREATE、ALTER 或 DROP 数据库安全对象的个别实例的
能力
TAKE OWNERSHIP 让被授予者可以取得被授予的安全对象的所有权
CREATE <服务器安全对象> 将创建服务器安全对象的能力授予被授予者
CREATE <数据库安全对象> 将创建数据库安全对象的能力授予给被授予者
VIEW DEFINITION 让被授予者能访问元数据
表 15-4 中的“安全对象”指的是权限设置操作的作用对象,如“Create Role”中的“Role”
就是此处的安全对象。
用 T-SQL 设置权限
在 T-SQL 中设置权限可使用 GRANT(授予)、DENY(拒绝)及 REVOKE(撒销)三个语句,
这三个语句的用法非常多,基本形式如下:
GRANT ALL 或权限名称 ON 对象 TO 用户或角色名称 WITH 选项
REVOKE ALL 或权限名称 ON 对象 TO 用户或角色名称 CASCADE
DENY ALL 或权限名称 ON 对象 TO 用户或角色名称 CASCADE
每 一 语 句 都 有 三 个 元 素 , 分 别 是 权 限 名 称 、 对 象 及 用 户 ( 角 色 ), 如 下
(Ch15\1524Grant.sql):
USE eBook
GRANT SELECT ON OBJECT::dbo.members TO David
GRANT REFERENCES (MemberID) ON OBJECT::dbo.Orders
TO David WITH GRANT OPTION
以上语句是使用 Grant 语句分别授予权限给 David,但对象内容不同,对象名称请以
“OBJECT::”开头,其后最好使用完整名称,即加上所有者。第二个 Grant 语句的作用对
象较特殊,“(MemberID) ON OBJECT:: dbo.Orders”,表示作用于 Orders 对象的 MemberID
字段,将此列的视图权限授予 David。同时加上“WITH GRANT OPTION”,表示 David 可
再将此权限授予他人,相当于图 15-23 的“具有授予”。
而在 Revoke 及 Deny 语句中,最后可加入 Cascade,此关键词的功能是一起撤销 To 之
后用户可授予其他人的权限,即取消“具有授予”。
查看可用权限
由于可用权限非常多,在 T-SQL 中没有选项可供选择,所以使用 GRANT、DENY 及
REVOKE 时,必须首先知道权限名称才能进行设置。读者可查看 sys.fn_builtin_permissions、
sys.database_permissions、sys.server_permissions 三个系统数据表,如图 15-24 所示。
图 15-24 查看可用权限
图 15-24 中的“permission_name”就是可用的权限名称,可应用在 Grant、DENY 或
Revoke 语句中。
查看权限内容
若要查看当前登录名及用户的权限内容,可执行 sp_helprotect 存储过程,如图 15-25
所示。
图 15-25 中的 Grantee 是授予权限的用户名称,Grantor 是将权限授予他人的用户名称。
sp_helprotect 存储过程之后最多可使用四个参数,分别代表对象名称、用户名称、授予人名
称,第四个参数可以是 o 或 s,分别代表查询对象权限或语句权限。