一旦一个对象被创建,它会被分配一个所有者。所有者通常是执行创建语句的角色。对于大部分类型的对象,初始状态下只有所有者(或者超级用户)能够对该对象做任何事情。为了允许其他角色使用它,必须分配权限。
有不同种类的权限:SELECT、INSERT、UPDATE、 DELETE、TRUNCATE、REFERENCES、 TRIGGER、CREATE、CONNECT、 TEMPORARY、EXECUTE、USAGE、 SET、ALTER SYSTEM以及MAINTAIN。 适用于特定对象的权限取决于对象的类型(表、函数等)。 有关这些权限含义的更多详细信息如下所示。 后续的各节和各章还将展示这些权限是如何使用的。
修改或销毁一个对象的权利是作为该对象的所有者所固有的,不能授予或撤销其本身。 (但是,与所有权限一样,该权利可以由拥有角色的成员继承;请参阅Section 21.3。)
一个对象可以通过该对象类型相应的ALTER命令来重新分配所有者,例如
ALTER TABLEtable_nameOWNER TOnew_owner;
超级用户总是可以做到这点,普通角色只有在同时是对象的当前所有者(或者继承拥有角色的权限)并且能够对新的拥有角色执行SET ROLE时,才能做同样的事。旧所有者的所有对象权限会随所有权一起转移给新所有者。
要分配权限,可以使用GRANT命令。例如,如果joe是一个已有角色,而accounts是一个已有表,更新该表的权限可以按如下方式授权:
GRANT UPDATE ON accounts TO joe;
用ALL取代特定权限会把与对象类型相关的所有权限全部授权。
一个特殊的名为PUBLIC的“角色”可以用来向系统中的每一个角色授予一个权限。同时,在数据库中有很多用户时可以设置“组”角色来帮助管理权限。详见Chapter 21。
要撤销以前授予的权限,请使用恰当命名的REVOKE命令:
REVOKE ALL ON accounts FROM PUBLIC;
一般情况下,只有对象拥有者(或者超级用户)可以授予或撤销一个对象上的权限。但是可以在授予权限时使用“with grant option”来允许接收人将权限转授给其他人。如果后来授予选项被撤销,则所有从接收人那里获得的权限(直接或者通过授权链获得)都将被撤销。更多详情请见GRANT和REVOKE参考页。
对象的所有者可以选择撤销自己的普通权限,例如,令表对于自己和其他人只读。 但是所有者总是被视为拥有所有的授予选项,所以他们总是可以重新授予自己的权限。
可用的权限包括:
SELECT #允许从表、视图、物化视图或其他类似表的对象的任何列或特定列进行SELECT。 还允许使用COPY TO。 这个权限还需要用于引用UPDATE、DELETE或MERGE中的现有列值。 对于序列,这个权限还允许使用currval函数。 对于大对象,这个权限允许读取对象。
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,以及数据库对象统计信息操作函数(见Table 9.97)。
其他命令所需的权限列在各自命令的参考页面上。
PostgreSQL在创建对象时,默认情况下将某些类型的对象的权限授予PUBLIC。 默认情况下,表、表列、序列、外部数据包装器、外部服务器、大对象、模式、表空间或配置参数不授予PUBLIC任何权限。 对于其他类型的对象,默认授予PUBLIC的权限如下: 数据库的CONNECT和TEMPORARY(创建临时表)权限; 函数和存储过程的EXECUTE权限;以及 语言和数据类型(包括域)的USAGE权限。 对象所有者当然可以REVOKE默认和明确授予的权限。(为了最大安全性,在创建对象的同时发出REVOKE; 这样就没有其他用户可以在其中使用对象的窗口。) 此外,可以使用ALTER DEFAULT PRIVILEGES命令覆盖这些默认权限设置。
Table 5.1显示了ACL(访问控制列表)值中用于这些权限类型的单字母缩写。 你将在下面列出的 psql 命令的输出中,或者在查看系统目录的 ACL 列时看到这些字母。
Table 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 |
Table 5.2使用上面所示的缩写总结了每种类型 SQL 对象可用的权限。 它还显示了可用于检查每种对象类型权限设置的psql命令。
Table 5.2. 访问权限摘要
| 对象类型 | 所有权限 | 默认 PUBLIC 权限 |
psql 命令 |
|---|---|---|---|
DATABASE |
CTc |
Tc |
\l |
DOMAIN |
U |
U |
\dD+ |
FUNCTION 或 PROCEDURE |
X |
X |
\df+ |
FOREIGN DATA WRAPPER |
U |
无 | \dew+ |
FOREIGN SERVER |
U |
无 | \des+ |
LANGUAGE |
U |
U |
\dL+ |
LARGE OBJECT |
rw |
无 | \dl+ |
PARAMETER |
sA |
无 | \dconfig+ |
SCHEMA |
UC |
无 | \dn+ |
SEQUENCE |
rwU |
无 | \dp |
TABLE(以及类似表的对象) |
arwdDxtm |
无 | \dp |
| 表列 | arwx |
无 | \dp |
TABLESPACE |
C |
无 | \db+ |
TYPE |
U |
U |
\dT+ |
已授予特定对象的权限显示为aclitem条目列表,每个条目的格式如下:
grantee=privilege-abbreviation[*].../grantor
每个aclitem列出了由特定授权者授予某个受让人的全部权限。具体权限由Table 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)
如果某个对象的“Access privileges”列为空,表示该对象具有默认权限 (也就是说,它在相关系统目录中的权限条目为 null)。 默认权限始终包括所有者的全部权限,并且根据对象类型的不同,还可能包括授予PUBLIC的一些权限,如上所述。 对象上的第一个GRANT或REVOKE将实例化默认权限 (例如生成miriam=arwdDxt/miriam),然后再根据指定的请求修改它们。 类似地,只有具有非默认权限的列才会在“Column privileges”中显示条目。 (注意:这里的“default privileges”始终是指该对象类型的内置默认权限。 受ALTER DEFAULT PRIVILEGES命令影响的对象,总会显示一个显式权限条目,其中包含ALTER的影响。)
注意所有者的隐式授予选项没有在访问权限显示中标记。仅当授予选项被显式授予给某人时才会出现*。
当对象的权限条目非空但为空集合时,“Access privileges”列会显示(none)。 这意味着根本没有授予任何权限,甚至连对象所有者也没有,这是一种很少见的情况。 (在这种情况下,所有者仍然拥有隐式的授予选项,因此仍然可以重新授予自己的权限;只是当前并不持有这些权限。)
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。