2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

5.8. 权限 #

创建对象时,会为其分配一个所有者。所有者通常是执行创建语句的角色。对于大多数对象类型,初始状态是只有所有者(或超级用户)可以对该对象进行任何操作。要允许其他角色使用它,必须授予权限

权限类型不同:SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGESETALTER SYSTEMMAINTAIN。适用于特定对象的权限根据对象的类型(表、函数等)而有所不同。下面将详细介绍这些权限的含义。接下来的章节将展示如何使用这些权限。

修改或销毁对象的权利是对象所有者的固有权利,无法自行授予或撤销。(但是,与所有权限一样,该权利可以被拥有角色的成员继承;参见第 21.3 节。)

可以使用适当类型的 ALTER 命令将对象分配给新的所有者,例如

ALTER TABLE table_name OWNER TO new_owner;

超级用户始终可以执行此操作;普通角色只能在它们既是对象的当前所有者(或继承拥有角色的权限)又能够将 SET ROLE 设置为新的拥有角色的情况下执行此操作。

要分配权限,可以使用 GRANT 命令。例如,如果 joe 是一个现有角色,而 accounts 是一个现有表,则可以使用以下命令授予更新表的权限:

GRANT UPDATE ON accounts TO joe;

ALL 替换为特定权限将授予与对象类型相关的全部权限。

可以使用特殊角色名称 PUBLIC 将权限授予系统中的每个角色。此外,可以设置角色,以帮助在数据库中有许多用户的情况下管理权限 - 有关详细信息,请参见第 21 章

要撤销先前授予的权限,可以使用恰如其分的 REVOKE 命令

REVOKE ALL ON accounts FROM PUBLIC;

通常,只有对象的拥有者(或超级用户)可以授予或撤销对象的权限。但是,可以授予权限具有授权选项,这将使接收者有权将其转授给其他人。如果随后撤销了授权选项,则所有从该接收者(直接或通过一系列授权)获得该权限的人将失去该权限。有关详细信息,请参见 GRANTREVOKE 参考页面。

对象的拥有者可以选择撤销自己的普通权限,例如,让自己和其他人无法读取某个表。但拥有者始终被视为拥有所有授权选项,因此他们始终可以重新授予自己的权限。

可用的权限是

SELECT #

允许从表、视图、物化视图或其他类似表的任何列或特定列(或列)中进行 SELECT。还允许使用 COPY TO。此权限还用于在 UPDATEDELETEMERGE 中引用现有列值。对于序列,此权限还允许使用 currval 函数。对于大对象,此权限允许读取对象。

INSERT #

允许将新行插入到表、视图等中。可以授予特定列(或列),在这种情况下,只有这些列可以分配给 INSERT 命令(因此,其他列将接收默认值)。还允许使用 COPY FROM

UPDATE #

允许更新表、视图等中任何列或特定列(或列)。(实际上,任何非平凡的 UPDATE 命令都将需要 SELECT 权限,因为它必须引用表列以确定要更新哪些行,以及/或计算列的新值。) SELECT ... FOR UPDATESELECT ... FOR SHARE 也需要此权限,至少对一列需要此权限,此外还需要 SELECT 权限。对于序列,此权限允许使用 nextvalsetval 函数。对于大对象,此权限允许写入或截断对象。

DELETE #

允许从表、视图等中删除行。(实际上,任何非平凡的 DELETE 命令都将需要 SELECT 权限,因为它必须引用表列以确定要删除哪些行。)

TRUNCATE #

允许对表执行 TRUNCATE

REFERENCES #

允许创建引用表或表中特定列(或列)的外键约束。

TRIGGER #

允许在表、视图等上创建触发器。

CREATE #

对于数据库,允许在数据库中创建新的模式和发布,并允许在数据库中安装受信任的扩展。

对于模式,允许在模式中创建新对象。要重命名现有对象,您必须拥有该对象并且对包含该对象的模式具有此权限。

对于表空间,允许在表空间中创建表、索引和临时文件,并允许创建使用该表空间作为默认表空间的数据库。

请注意,撤销此权限不会更改现有对象的生存期或位置。

CONNECT #

允许被授权者连接到数据库。此权限在连接启动时进行检查(此外还检查 pg_hba.conf 强加的任何限制)。

TEMPORARY #

允许在使用数据库时创建临时表。

EXECUTE #

允许调用函数或过程,包括使用任何在函数之上实现的操作符。这是唯一适用于函数和过程的权限类型。

USAGE #

对于过程语言,允许使用该语言创建该语言的函数。这是唯一适用于过程语言的权限类型。

对于模式,允许访问模式中包含的对象(假设也满足这些对象的自身权限要求)。本质上,这允许被授权者查找模式中的对象。如果没有此权限,仍然可以查看对象名称,例如,通过查询系统目录。此外,在撤销此权限后,现有会话可能包含先前执行过此查找的语句,因此,这不是阻止对象访问的完全安全的方法。

对于序列,允许使用 currvalnextval 函数。

对于类型和域,允许在创建表、函数和其他模式对象时使用该类型或域。(请注意,此权限不控制类型的全部使用,例如查询中出现的该类型的值。它只阻止创建依赖于该类型的对象。此权限的主要目的是控制哪些用户可以创建对类型的依赖关系,这可能会阻止所有者稍后更改类型。)

对于外部数据包装器,允许使用外部数据包装器创建新的服务器。

对于外部服务器,允许使用服务器创建外部表。授予者还可以创建、更改或删除与该服务器关联的自己的用户映射。

SET #

允许在当前会话中将服务器配置参数设置为一个新的值。(虽然此权限可以授予任何参数,但它除了对通常需要超级用户权限才能设置的参数外,其他参数毫无意义。)

ALTER SYSTEM #

允许使用 ALTER SYSTEM 命令将服务器配置参数配置为一个新值。

MAINTAIN #

允许在关系上执行 VACUUMANALYZECLUSTERREFRESH MATERIALIZED VIEWREINDEXLOCK TABLE

其他命令所需的权限列在其各自命令的参考页面上。

PostgreSQL 在创建某些类型的对象时,默认会将这些对象的权限授予 PUBLIC。默认情况下,不会将任何权限授予表、表列、序列、外部数据包装器、外部服务器、大型对象、模式、表空间或配置参数的 PUBLIC。对于其他类型的对象,默认授予 PUBLIC 的权限如下:数据库的 CONNECTTEMPORARY(创建临时表)权限;函数和过程的 EXECUTE 权限;以及语言和数据类型(包括域)的 USAGE 权限。当然,对象所有者可以 REVOKE 默认权限和明确授予的权限。(为了获得最高安全性,请在创建对象的同一个事务中发出 REVOKE;这样,其他用户就无法在任何窗口中使用该对象。)此外,这些默认权限设置可以使用 ALTER DEFAULT PRIVILEGES 命令覆盖。

表 5.1 显示了在 ACL(访问控制列表)值中用于这些权限类型的单字母缩写。您将在下面列出的 psql 命令的输出中看到这些字母,或者在查看系统目录的 ACL 列时看到它们。

表 5.1. ACL 权限缩写

权限 缩写 适用对象类型
SELECT r (read) LARGE OBJECTSEQUENCETABLE(和类似表的对象)、表列
INSERT a (append) TABLE、表列
UPDATE w (write) LARGE OBJECTSEQUENCETABLE、表列
DELETE d TABLE
TRUNCATE D TABLE
REFERENCES x TABLE、表列
TRIGGER t TABLE
CREATE C DATABASESCHEMATABLESPACE
CONNECT c DATABASE
TEMPORARY T DATABASE
EXECUTE X FUNCTIONPROCEDURE
USAGE U DOMAINFOREIGN DATA WRAPPERFOREIGN SERVERLANGUAGESCHEMASEQUENCETYPE
SET s PARAMETER
ALTER SYSTEM A PARAMETER
MAINTAIN m TABLE

表 5.2 总结了每种 SQL 对象可用的权限,使用上面显示的缩写。它还显示了用于检查每种对象类型权限设置的 psql 命令。

表 5.2. 访问权限摘要

对象类型 所有权限 默认 PUBLIC 权限 psql 命令
DATABASE CTc Tc \l
DOMAIN U U \dD+
FUNCTIONPROCEDURE X X \df+
FOREIGN DATA WRAPPER U none \dew+
FOREIGN SERVER U none \des+
LANGUAGE U U \dL+
LARGE OBJECT rw none \dl+
PARAMETER sA none \dconfig+
SCHEMA UC none \dn+
SEQUENCE rwU none \dp
TABLE(和类似表的对象) arwdDxtm none \dp
Table column arwx none \dp
TABLESPACE C none \db+
TYPE U U \dT+

某个特定对象的已授予权限以 aclitem 条目的列表显示,每个条目都具有以下格式

grantee=privilege-abbreviation[*].../grantor

每个 aclitem 列出了某个特定授予者授予一个受让人所有权限。特定权限由 表 5.1 中的单字母缩写表示,如果权限是带有授予选项授予的,则在缩写后添加 *。例如,calvin=r*w/hobbes 表示角色 calvin 具有权限 SELECT (r),并且带有授予选项 (*),以及不可授予的权限 UPDATE (w),两者都是由角色 hobbes 授予的。如果 calvin 在同一个对象上还拥有由不同授予者授予的某些权限,则这些权限将作为单独的 aclitem 条目出现。aclitem 中的空受让人字段代表 PUBLIC

例如,假设用户 miriam 创建表 mytable 并执行以下操作

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;

然后,psql\dp 命令将显示

=> \dp mytable
                                  Access privileges
 Schema |  Name   | Type  |   Access privileges    |   Column privileges   | Policies
--------+---------+-------+------------------------+-----------------------+----------
 public | mytable | table | miriam=arwdDxtm/miriam+| col1:                +|
        |         |       | =r/miriam             +|   miriam_rw=rw/miriam |
        |         |       | admin=arw/miriam       |                       |
(1 row)

如果某个对象的“访问权限”列为空,则表示该对象具有默认权限(即,其在相关系统目录中的权限条目为空)。默认权限始终包括所有者对所有权限的访问权限,并且可以包括对 PUBLIC 的某些权限(具体取决于对象类型),如上所述。在对象上第一次执行 GRANTREVOKE 将实例化默认权限(例如,生成 miriam=arwdDxt/miriam),然后根据指定的请求进行修改。同样,只有具有非默认权限的列才会显示在“列权限”中。(注意:为此目的,“默认权限”始终是指对象类型的内置默认权限。其权限受到 ALTER DEFAULT PRIVILEGES 命令影响的对象将始终显示一个显式权限条目,其中包含 ALTER 的影响。)

请注意,所有者隐式授予选项在访问权限显示中没有标记。只有当显式授予某人授予选项时,才会显示 *

当对象的权限条目非空但为空时,“访问权限”列将显示 (none)。这意味着根本没有授予任何权限,即使是对象所有者也没有 - 这种情况很少见。(所有者在这种情况下仍然拥有隐式授予选项,因此可以重新授予自己的权限;但目前她没有权限。)

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。