在 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 (所有权限)。

有些权限(如 INSERTUPDATE)可以限制到关系的特定列上 [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;

授权图

授权图是一种可视化权限流动的工具 。它可以帮助我们理解权限是如何从拥有者一级一级地授予其他用户,以及回收权限时会产生什么影响 。

授权图的组成 :

  1. 节点(Nodes): 图中的每个节点代表一个用户(授权 ID)拥有某个特定的权限。节点通常表示为 AP,其中 A 是授权 ID,P 是权限。
    • AP:用户 A 拥有权限 P
    • AP*:用户 A 拥有权限 P,并且拥有将此权限授予他人的能力(带有 GRANT OPTION)。
    • AP**:权限 P 的来源,通常表示拥有对象的用户(即对象的拥有者)。拥有者默认拥有所有权限并带有 GRANT OPTION 。** 节点是权限的起点。
  2. 边(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 的子权限),则边会指向 BQBQ*

如何查看授权图 :

要确定用户 C 是否拥有某个权限 Q,需要查看授权图中是否存在一条从任何 XQ** 节点(表示权限 Q 的来源)到 CQCQ*CQ** 节点(在实际图中通常只出现 CQCQ*)的路径 。只要存在这样一条路径,并且路径上的所有边都有效,用户 C 就拥有该权限 。这里的 PQ 的一个超权限,也就是说,授予的权限 P 需要包含 Q

回收权限 (REVOKE) 对授权图的影响 :

当用户 A 使用 REVOKE P ON R FROM B; 回收权限时,会删除从 APAP* 节点到 BPBP* 节点的对应边 。然后,系统会检查图中每个节点是否仍然可以从一个 ** 节点(拥有者)通过有效路径到达。如果某个节点无法从 ** 节点到达,则该节点所代表的权限被视为已回收,并从图中删除 。

  • 使用 CASCADE 选项回收时,任何通过被回收权限(BPBP*)授予出去的权限也会被一并回收(删除相应的边和不可达的节点) 。
  • 使用 RESTRICT 选项回收时,如果通过被回收权限(BPBP*)授予出去的权限仍然存在(即存在从 BPBP* 到其他节点的边),则回收操作会失败,以警告用户存在依赖的权限 。

通过理解节点类型、边的含义以及回收操作对图结构的影响,就可以分析权限如何在用户之间传播和回收了。

指向原始笔记的链接