在 SQL 中,用于授予用户(或角色)对数据库对象的权限的基本语句是 GRANT
。
语法如下 [1]:
GRANT <权限列表>
ON <关系或其他对象>
TO <授权ID列表>;
如果你希望被授权的用户(或角色)也能将这些权限进一步授予其他人,可以在语句末尾加上 WITH GRANT OPTION
[1]。
语法带 GRANT OPTION [1]:
GRANT <权限列表>
ON <关系或其他对象>
TO <授权ID列表>
WITH GRANT OPTION;
权限列表:指定要授予的权限,可以是一个或多个权限,用逗号分隔。
常见的权限包括
SELECT
(查询)INSERT
(插入)DELETE
(删除)UPDATE
(更新,可以指定到特定属性)ALL PRIVILEGES
(所有权限)。
有些权限(如 INSERT
和 UPDATE
)可以限制到关系的特定列上 [1]。
关系或其他对象:指定要授予权限的数据库对象,通常是表(关系)或视图 [1]。
授权 ID 列表:指定接收权限的用户或角色的授权 ID [1]。PUBLIC
也是一个特殊的授权 ID,表示授予所有用户权限 [1]。
示例 [1]:
假设你是 Sells
表的拥有者,你可以授予用户 sally
查询 Sells
表和更新 price
列的权限:
GRANT SELECT, UPDATE(price)
ON Sells
TO sally;
如果你还想让 sally
能够将更新 Sells
表的权限授予其他人,你可以这样授予:
GRANT UPDATE ON Sells TO sally WITH GRANT OPTION;
授权图
授权图是一种可视化权限流动的工具 。它可以帮助我们理解权限是如何从拥有者一级一级地授予其他用户,以及回收权限时会产生什么影响 。
授权图的组成 :
- 节点(Nodes): 图中的每个节点代表一个用户(授权 ID)拥有某个特定的权限。节点通常表示为
AP
,其中A
是授权 ID,P
是权限。
AP
:用户A
拥有权限P
。AP*
:用户A
拥有权限P
,并且拥有将此权限授予他人的能力(带有 GRANT OPTION)。AP**
:权限P
的来源,通常表示拥有对象的用户(即对象的拥有者)。拥有者默认拥有所有权限并带有 GRANT OPTION 。**
节点是权限的起点。- 边(Edges): 图中的边表示权限的授予过程。从节点
X
到节点Y
的边X -> Y
表示节点X
所代表的权限被用来授予了节点Y
所代表的权限 。
- 例如,如果用户
A
拥有权限P*
(带有 GRANT OPTION)或P**
(作为拥有者),并执行了GRANT P ON R TO B;
,则会从AP*
或AP**
到BP
绘制一条边。- 如果授予时带了
WITH GRANT OPTION
(GRANT P ON R TO B WITH GRANT OPTION;
),则会从AP*
或AP**
到BP*
绘制一条边。- 如果授予的是
P
的子权限Q
(例如UPDATE(a)
是UPDATE
的子权限),则边会指向BQ
或BQ*
。
如何查看授权图 :
要确定用户
C
是否拥有某个权限Q
,需要查看授权图中是否存在一条从任何XQ**
节点(表示权限Q
的来源)到CQ
、CQ*
或CQ**
节点(在实际图中通常只出现CQ
和CQ*
)的路径 。只要存在这样一条路径,并且路径上的所有边都有效,用户C
就拥有该权限 。这里的P
是Q
的一个超权限,也就是说,授予的权限P
需要包含Q
。回收权限 (REVOKE) 对授权图的影响 :
当用户
A
使用REVOKE P ON R FROM B;
回收权限时,会删除从AP
或AP*
节点到BP
或BP*
节点的对应边 。然后,系统会检查图中每个节点是否仍然可以从一个**
节点(拥有者)通过有效路径到达。如果某个节点无法从**
节点到达,则该节点所代表的权限被视为已回收,并从图中删除 。
- 使用
CASCADE
选项回收时,任何通过被回收权限(BP
或BP*
)授予出去的权限也会被一并回收(删除相应的边和不可达的节点) 。- 使用
RESTRICT
选项回收时,如果通过被回收权限(BP
或BP*
)授予出去的权限仍然存在(即存在从BP
或BP*
到其他节点的边),则回收操作会失败,以警告用户存在依赖的权限 。通过理解节点类型、边的含义以及回收操作对图结构的影响,就可以分析权限如何在用户之间传播和回收了。
指向原始笔记的链接