Postgresql 中文操作指南

5.7. Privileges #

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

有不同类型的权限:SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGESETALTER SYSTEM。适用于特定对象的权限因对象的类型(表格、函数等)而异。以下内容将更详细地显示这些权限的含义。以下部分和章节还将向您展示如何使用这些权限。

修改或销毁对象的对是对象所有者固有的,并且本身不可授予或撤销。(但是,与所有特权一样,该权利可以被所有权角色的成员继承;请参见 Section 22.3。)

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

ALTER TABLE table_name OWNER TO new_owner;

超级用户始终可以执行此操作;普通角色只有当他们同时是当前对象所有者(或继承所有者角色的权限)并能够 SET ROLE 到新的所有者角色时才能这样做。

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

GRANT UPDATE ON accounts TO joe;

编写 ALL 而不是特定权限将授予与对象类型相关的全部权限。

特殊“角色”名称 PUBLIC 可以用于向系统上的每个角色授予特权。同样,在数据库中有许多用户时,还可以设置“组”角色来帮助管理特权 - 有关详细信息,请参见 Chapter 22

若要撤销先前授予的权限,请使用恰如其名的 REVOKE 命令:

REVOKE ALL ON accounts FROM PUBLIC;

通常,只有对象的所有者(或超级用户)才能授予或撤销对对象上的权限。但是,可以授予“具有授予选项”的权限,这赋予接收者依次授予他人该权限的权利。如果随后撤销了“授予选项”,则所有直接或通过一系列授予从该接收者接收该权限的人员都将失去该权限。有关详细信息,请参阅 GRANTREVOKE 参考页面。

对象的拥有者可以选择撤销其自身的一般权限,例如,使其表给自己及其他人均为只读。但拥有者始终享有所有授予选项,从而可以随时重新授予自己的权限。

可用的权限为:

  • SELECT #

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

  • INSERT #

    • 允许在表、视图等中_INSERT_新行。可以针对特定列授予该权限,在这种情况下,只能在 INSERT 命令中为这些列分配值(因此其他列将接收默认值)。还允许使用 COPY FROM

  • UPDATE #

    • 允许 UPDATE 表格、视图等的任何列或特定列(在实践中,任何重要的 UPDATE 命令都需要 SELECT 权限,因为它必须引用表列来确定要更新的行和/或计算列的新值。)除了 SELECT 权限之外, SELECT …​ FOR UPDATESELECT …​ FOR SHARE 还需要至少一列上的此权限。对于序列,此权限允许使用 nextvalsetval 函数。对于大型对象,此权限允许写入或截断该对象。

  • DELETE #

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

  • TRUNCATE #

    • 允许对表进行_TRUNCATE_。

  • REFERENCES #

    • 允许创建引用表的外部键约束,或表的特定列。

  • TRIGGER #

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

  • CREATE #

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

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

    • 对于表空间,允许在表空间内创建表、索引和临时文件,并允许创建以表空间为其默认表空间的数据库。

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

  • CONNECT #

    • 允许被授予者连接到数据库。此权限在连接启动时进行检查(除了检查 pg_hba.conf 强制实施的任何限制)。

  • TEMPORARY #

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

  • EXECUTE #

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

  • USAGE #

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

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

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

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

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

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

  • SET #

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

  • ALTER SYSTEM #

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

不同命令所需的权限列在各个命令的参考页中。

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

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

Table 5.1. ACL Privilege Abbreviations

Privilege

Abbreviation

Applicable Object Types

SELECT

r (“read”)

LARGE OBJECTSEQUENCETABLE (以及类似表的对象),表列

INSERT

a (“append”)

TABLE, table column

UPDATE

w (“write”)

LARGE OBJECTSEQUENCETABLE ,表列

DELETE

d

TABLE

TRUNCATE

D

TABLE

REFERENCES

x

TABLE, table column

TRIGGER

t

TABLE

CREATE

C

DATABASE, SCHEMA, TABLESPACE

CONNECT

c

DATABASE

TEMPORARY

T

DATABASE

EXECUTE

X

FUNCTION, PROCEDURE

USAGE

U

DOMAINFOREIGN DATA WRAPPERFOREIGN SERVERLANGUAGESCHEMASEQUENCETYPE

SET

s

PARAMETER

ALTER SYSTEM

A

PARAMETER

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

Table 5.2. Summary of Access Privileges

Object Type

All Privileges

Default PUBLIC Privileges

psql Command

DATABASE

CTc

Tc

\l

DOMAIN

U

U

\dD+

FUNCTION or 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 (and table-like objects)

arwdDxt

none

\dp

Table column

arwx

none

\dp

TABLESPACE

C

none

\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)

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

请注意,所有者的隐式授予选项未在访问权限显示中标记。只有在明确向某人授予授予选项时,才会出现 *