选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

5.7. 权限 #

一旦一个对象被创建,它会被分配一个所有者。所有者通常是执行创建语句的角色。对于大部分类型的对象,初始状态下只有所有者(或者超级用户)能够对该对象做任何事情。为了允许其他角色使用它,必须分配权限

有不同种类的权限:SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGE。 适用于特定对象的权限取决于对象的类型(表、函数等)。 有关这些权限含义的更多详细信息如下所示。 后续的各节和各章还将展示这些权限是如何使用的。

修改或销毁对象的权利始终只属于该对象的拥有者。

可以使用适合该对象类型的ALTER命令,将对象分配给新的拥有者,例如:

ALTER TABLE table_name OWNER TO new_owner;

超级用户始终可以这样做;普通角色只有同时是对象的当前拥有者(或拥有者角色的成员),并且是新拥有者角色的成员,才能这样做。

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

GRANT UPDATE ON accounts TO joe;

ALL代替某个具体权限,会授予与该对象类型相关的全部权限。

特殊的角色PUBLIC可用于向系统中的每个角色授予权限。此外,当数据库用户很多时,可以设置角色来协助管理权限 — 详见Chapter 21

要撤销权限,使用名称贴切的REVOKE命令:

REVOKE ALL ON accounts FROM PUBLIC;

对象拥有者的特殊权限(即执行DROPGRANTREVOKE等操作的权利)始终隐含在拥有者身份中,不能授予或撤销。不过,对象拥有者可以选择撤销自己的普通权限,例如将表设为对自己和其他人都只读。

通常,只有对象的拥有者(或超级用户)可以授予或撤销对象上的权限。不过,也可以在授予权限时附带授权选项,使接收者有权进一步将该权限授予其他人。如果之后撤销了授权选项,所有从该接收者直接或经过授权链取得此权限的用户都会失去权限。详见GRANTREVOKE参考页。

可用的权限如下:

SELECT

允许从表、视图、物化视图或其他类似表的对象的任意列或指定列进行SELECT。也允许使用COPY TO。在UPDATEDELETE中引用已有列值时,也需要此权限。对于序列,此权限还允许使用currval函数。对于大对象,此权限允许读取该对象。

INSERT

允许向表、视图等INSERT新行。可以在指定列上授予此权限,此时INSERT命令只能为这些列赋值(其他列因而会取得默认值)。也允许使用COPY FROM。

UPDATE

允许对表、视图等的任何列或特定列进行UPDATE操作。 (实际上,任何非平凡的UPDATE命令都需要SELECT权限, 因为它必须引用表列来确定要更新的行,和/或为列计算新值。) SELECT ... FOR UPDATESELECT ... FOR SHARE 除了SELECT权限之外,还要求在至少一个列上具有此权限。 对于序列,此权限允许使用nextvalsetval函数。 对于大对象,此权限允许写入或截断该对象。

DELETE

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

TRUNCATE

允许在表上使用TRUNCATE

REFERENCES

允许创建引用某个表或该表指定列的外键约束。

TRIGGER

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

CREATE

对于数据库,允许在数据库中创建新模式和发布。

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

对于表空间,允许在其中创建表、索引和临时文件,并允许创建以该表空间为默认表空间的数据库。(注意,撤销此权限不会改变已有对象的位置。)

CONNECT

允许被授予该权限的用户连接到数据库。此权限在连接启动时进行检查(除pg_hba.conf施加的任何限制之外)。

TEMPORARY

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

EXECUTE

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

USAGE

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

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

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

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

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

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

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

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

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

Table 5.1. 访问控制列表权限缩写

权限 缩写 适用对象类型
SELECT r读取 LARGE OBJECTSEQUENCETABLE(以及类似表的对象)、表列
INSERT a追加 TABLE、表列
UPDATE w写入 LARGE OBJECTSEQUENCETABLE、表列
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

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

Table 5.2. 访问权限摘要

对象类型 所有权限 默认 PUBLIC 权限 psql 命令
DATABASE CTc Tc \l
DOMAIN U U \dD+
FUNCTIONPROCEDURE X X \df+
FOREIGN DATA WRAPPER U \dew+
FOREIGN SERVER U \des+
LANGUAGE U U \dL+
LARGE OBJECT rw  
SCHEMA UC \dn+
SEQUENCE rwU \dp
TABLE(以及类似表的对象) arwdDxt \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=arwdDxt/miriam+| col1:                +|
        |         |       | =r/miriam            +|   miriam_rw=rw/miriam |
        |         |       | admin=arw/miriam      |                       |
(1 row)

如果某个对象的Access privileges列为空,表示该对象具有默认权限 (也就是说,它在相关系统目录中的权限条目为 null)。 默认权限始终包括所有者的全部权限,并且根据对象类型的不同,还可能包括授予PUBLIC的一些权限,如上所述。 对象上的第一个GRANTREVOKE将实例化默认权限 (例如生成miriam=arwdDxt/miriam),然后再根据指定的请求修改它们。 类似地,只有具有非默认权限的列才会在Column privileges中显示条目。 (注意:这里的default privileges始终是指该对象类型的内置默认权限。 受ALTER DEFAULT PRIVILEGES命令影响的对象,总会显示一个显式权限条目,其中包含ALTER的影响。)

注意,访问权限显示中不会标出拥有者隐含的授权选项。只有明确向某人授予了授权选项时,才会显示*