当创建一个对象时,它会被分配一个所有者。所有者通常是执行创建语句的角色。对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以对该对象执行任何操作。要允许其他角色使用它,必须授予权限。
有不同类型的权限:SELECT
、INSERT
、UPDATE
、DELETE
、TRUNCATE
、REFERENCES
、TRIGGER
、CREATE
、CONNECT
、TEMPORARY
、EXECUTE
、USAGE
、SET
、ALTER SYSTEM
和 MAINTAIN
。适用于特定对象的权限取决于对象的类型(表、函数等)。有关这些权限含义的更多详细信息将在下面出现。以下章节和章节还将向您展示如何使用这些权限。
修改或销毁对象的权利是对象所有者固有的,并且本身不能被授予或撤销。(但是,像所有权限一样,该权利可以由拥有角色的成员继承;请参阅第 21.3 节。)
可以使用适合该对象的 ALTER
命令将对象分配给新的所有者,例如
ALTER TABLEtable_name
OWNER TOnew_owner
;
超级用户始终可以这样做;普通角色只有在它们既是对象的当前所有者(或继承了拥有角色的权限)并且能够 SET ROLE
到新的拥有角色时才能这样做。
要分配权限,请使用 GRANT 命令。例如,如果 joe
是一个现有角色,而 accounts
是一个现有表,则可以使用以下命令授予更新表的权限
GRANT UPDATE ON accounts TO joe;
在特定权限的位置写入 ALL
将授予与对象类型相关的所有权限。
特殊的 “角色” 名称 PUBLIC
可用于向系统上的每个角色授予权限。此外,可以设置 “组” 角色来帮助管理数据库中有许多用户时的权限 - 有关详细信息,请参阅第 21 章。
要撤销先前授予的权限,请使用名称恰当的 REVOKE 命令
REVOKE ALL ON accounts FROM PUBLIC;
通常,只有对象的所有者(或超级用户)才能授予或撤销对象的权限。但是,可以授予权限 “带有授予选项”,这使接收者有权将其依次授予其他人。如果随后撤销授予选项,则所有从该接收者那里获得权限的人(直接或通过一系列授予)都将失去该权限。有关详细信息,请参阅 GRANT 和 REVOKE 参考页。
对象的所有者可以选择撤销他们自己的普通权限,例如使表对自己和其他人也变为只读。但是,所有者始终被视为拥有所有授予选项,因此他们始终可以重新授予自己的权限。
可用的权限是
SELECT
#允许从表、视图、物化视图或其他类似表的对象的任何列或特定列执行 SELECT
。还允许使用 COPY TO
。此权限还需要在 UPDATE
、DELETE
或 MERGE
中引用现有列值。对于序列,此权限还允许使用 currval
函数。对于大对象,此权限允许读取对象。
INSERT
#允许将新行 INSERT
到表、视图等中。可以在特定列上授予,在这种情况下,只能在 INSERT
命令中分配这些列(因此其他列将接收默认值)。还允许使用 COPY FROM
。
UPDATE
#允许 UPDATE
表、视图等的任何列或特定列。(实际上,任何重要的 UPDATE
命令都需要 SELECT
权限,因为它必须引用表列来确定要更新的行,和/或计算列的新值。) SELECT ... FOR UPDATE
和 SELECT ... FOR SHARE
还要求至少在一个列上具有此权限,此外还需要 SELECT
权限。对于序列,此权限允许使用 nextval
和 setval
函数。对于大对象,此权限允许写入或截断对象。
DELETE
#允许从表、视图等中 DELETE
行。(实际上,任何重要的 DELETE
命令都需要 SELECT
权限,因为它必须引用表列来确定要删除的行。)
TRUNCATE
#允许在表上执行 TRUNCATE
。
REFERENCES
#允许创建引用表或表的特定列的外键约束。
TRIGGER
#允许在表、视图等上创建触发器。
CREATE
#对于数据库,允许在数据库中创建新的模式和发布,并允许在数据库中安装受信任的扩展。
对于模式,允许在模式中创建新对象。要重命名现有对象,您必须拥有该对象并且具有包含模式的此权限。
对于表空间,允许在表空间中创建表、索引和临时文件,并允许创建将表空间作为其默认表空间的数据库。
请注意,撤销此权限不会更改现有对象的存在或位置。
CONNECT
#允许被授权者连接到数据库。此权限在连接启动时进行检查(除了检查 pg_hba.conf
施加的任何限制)。
TEMPORARY
#允许在使用数据库时创建临时表。
EXECUTE
#允许调用函数或过程,包括使用在函数之上实现的任何运算符。这是唯一适用于函数和过程的权限类型。
USAGE
#对于过程语言,允许使用该语言创建该语言的函数。这是唯一适用于过程语言的权限类型。
对于模式,允许访问模式中包含的对象(假设也满足对象自身的权限要求)。本质上,这允许被授权者 “查找” 模式中的对象。如果没有此权限,仍然可以通过查询系统目录来查看对象名称。此外,在撤销此权限后,现有会话可能具有先前执行此查找的语句,因此这不是防止对象访问的完全安全的方法。
对于序列,允许使用 currval
和 nextval
函数。
对于类型和域,允许在创建表、函数和其他模式对象时使用类型或域。(请注意,此权限不控制类型的所有 “使用”,例如查询中出现的类型值。它仅阻止创建依赖于该类型的对象。此权限的主要目的是控制哪些用户可以在类型上创建依赖项,这可能会阻止所有者以后更改类型。)
对于外部数据包装器,允许使用外部数据包装器创建新服务器。
对于外部服务器,允许使用服务器创建外部表。被授权者还可以创建、更改或删除与该服务器关联的自己的用户映射。
SET
#允许在当前会话中将服务器配置参数设置为新值。(虽然可以在任何参数上授予此权限,但除了通常需要超级用户权限才能设置的参数外,它没有任何意义。)
ALTER SYSTEM
#允许使用 ALTER SYSTEM 命令将服务器配置参数配置为新值。
MAINTAIN
#允许对关系执行 VACUUM
、ANALYZE
、CLUSTER
、REFRESH MATERIALIZED VIEW
、REINDEX
和 LOCK TABLE
命令。
其他命令所需的权限在相应命令的参考页面中列出。
当创建对象时,PostgreSQL 默认会授予某些类型的对象权限给 PUBLIC
。默认情况下,不会向 PUBLIC
授予表、表列、序列、外部数据包装器、外部服务器、大型对象、模式、表空间或配置参数的任何权限。对于其他类型的对象,默认授予 PUBLIC
的权限如下:数据库的 CONNECT
和 TEMPORARY
(创建临时表)权限;函数和过程的 EXECUTE
权限;以及语言和数据类型(包括域)的 USAGE
权限。对象所有者当然可以 REVOKE
默认和明确授予的权限。(为了最大程度的安全性,请在创建对象的同一事务中发出 REVOKE
;这样就不会有其他用户可以使用该对象的时间窗口。)此外,可以使用 ALTER DEFAULT PRIVILEGES 命令覆盖这些默认权限设置。
表 5.1 显示了在 ACL (访问控制列表) 值中用于这些权限类型的一个字母缩写。您将在下面列出的 psql 命令的输出中,或者在查看系统目录的 ACL 列时看到这些字母。
表 5.1. ACL 权限缩写
权限 | 缩写 | 适用的对象类型 |
---|---|---|
SELECT |
r (“读取”) |
LARGE OBJECT 、SEQUENCE 、TABLE (和类似表的对象)、表列 |
INSERT |
a (“追加”) |
TABLE 、表列 |
UPDATE |
w (“写入”) |
LARGE OBJECT 、SEQUENCE 、TABLE 、表列 |
DELETE |
d |
TABLE |
TRUNCATE |
D |
TABLE |
REFERENCES |
x |
TABLE 、表列 |
TRIGGER |
t |
TABLE |
CREATE |
C |
DATABASE 、SCHEMA 、TABLESPACE |
CONNECT |
c |
DATABASE |
TEMPORARY |
T |
DATABASE |
EXECUTE |
X |
FUNCTION 、PROCEDURE |
USAGE |
U |
DOMAIN 、FOREIGN DATA WRAPPER 、FOREIGN SERVER 、LANGUAGE 、SCHEMA 、SEQUENCE 、TYPE |
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+ |
FUNCTION 或 PROCEDURE |
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 |
表列 | 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
的一些权限,具体取决于对象类型,如上所述。对对象的第一个 GRANT
或 REVOKE
将实例化默认权限(例如,生成 miriam=arwdDxt/miriam
),然后根据指定请求修改它们。同样,仅针对具有非默认权限的列在 “列权限” 中显示条目。(注意:为此目的,“默认权限” 始终表示对象类型的内置默认权限。其权限已受 ALTER DEFAULT PRIVILEGES
命令影响的对象将始终显示为包含 ALTER
效果的显式权限条目。)
请注意,所有者的隐式授予选项不会在访问权限显示中标记。*
仅在明确授予某人授予选项时才会出现。
当对象的权限条目为非空但为空时,“访问权限” 列显示 (none)
。这意味着根本没有授予任何权限,即使是对对象的所有者也是如此,这是一种罕见的情况。(在这种情况下,所有者仍然具有隐式授予选项,因此可以重新授予自己的权限;但她目前没有任何权限。)
如果您在文档中发现任何不正确、与特定功能不符或需要进一步澄清的地方,请使用此表单报告文档问题。