Skip to content

GRANT

GRANT — 定义访问权限

语法

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] }
    ON PARAMETER configuration_parameter [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT role_name [, ...] TO role_specification [, ...]
    [ WITH { ADMIN | INHERIT | SET } { OPTION | TRUE | FALSE } ]
    [ GRANTED BY role_specification ]

where role_specification can be:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

描述

GRANT命令有两个基本变体:一个授予对数据库对象(表、列、视图、外部表、序列、数据库、外部数据包装器、外部服务器、函数、过程、过程语言、大对象、配置参数、模式、表空间或类型)的权限,另一个授予角色成员资格。这些变体在许多方面类似,但它们有足够的差异,需要分别描述。

数据库对象上的 GRANT

GRANT命令变体向一个或多个角色授予数据库对象上的特定权限。这些权限将添加到已授予的权限(如果有)中。

关键字PUBLIC表示将向所有角色授予权限,包括以后可能创建的角色。可以将PUBLIC视为一个隐式定义的组,该组始终包括所有角色。任何特定角色都将拥有直接授予它的权限、授予其当前成员的任何角色的权限以及授予PUBLIC的权限的总和。

如果指定WITH GRANT OPTION,则权限接收者可以反过来将其授予其他人。如果没有授予选项,则接收者无法这样做。无法向PUBLIC授予授予选项。

如果指定GRANTED BY,则指定的授权者必须是当前用户。此子句目前仅以这种形式存在,以实现 SQL 兼容性。

无需向对象的拥有者(通常是创建它的用户)授予权限,因为拥有者默认拥有所有权限。(但是,拥有者可以选择出于安全原因撤销其自身的一些权限。)

删除对象或以任何方式更改其定义的权利不被视为可授予的权限;它是所有者固有的,不能授予或撤销。(但是,可以通过授予或撤销对拥有该对象的组的成员资格来获得类似的效果;请参见下文。)所有者也隐式拥有该对象的全部授予选项。

可能的权限是

SELECT
INSERT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
CREATE
CONNECT
TEMPORARY
EXECUTE
USAGE
SET
ALTER SYSTEM

特定类型的权限,如 第 5.7 节 中所定义。

TEMP

TEMPORARY 的替代拼写。

所有权限

授予对象类型可用的所有权限。PRIVILEGES 关键字在 PostgreSQL 中是可选的,尽管严格的 SQL 需要它。

FUNCTION语法适用于普通函数、聚合函数和窗口函数,但不适用于过程;请对这些函数使用PROCEDURE。或者,使用ROUTINE来引用函数、聚合函数、窗口函数或过程,而不管其确切类型如何。

还有一个选项可以在一个或多个模式中授予同类型的所有对象权限。此功能目前仅支持表、序列、函数和过程。ALL TABLES也影响视图和外部表,就像特定对象的GRANT命令一样。ALL FUNCTIONS也影响聚合和窗口函数,但不影响过程,同样就像特定对象的GRANT命令一样。使用ALL ROUTINES来包括过程。

对角色授予权限

GRANT命令的变体将角色成员资格授予一个或多个其他角色,以及成员资格选项SETINHERITADMIN的修改;有关详细信息,请参见第 22.3 节。角色成员资格很重要,因为它可能允许访问授予角色的权限,并可能允许对角色本身进行更改。但是,实际授予的权限取决于与授予关联的选项。要修改现有成员资格的选项,只需指定具有更新选项值的成员资格即可。

下面描述的每个选项都可以设置为TRUEFALSE。关键字OPTION被接受为TRUE的同义词,因此WITH ADMIN OPTIONWITH ADMIN TRUE的同义词。更改现有成员资格时,省略选项会导致保留当前值。

ADMIN选项允许成员反过来向其他人授予角色成员资格,并撤销角色成员资格。如果没有管理员选项,普通用户不能这样做。角色不被认为对自己拥有WITH ADMIN OPTION。数据库超级用户可以向任何人授予或撤销任何角色的成员资格。此选项默认为FALSE

INHERIT选项控制新成员资格的继承状态;有关继承的详细信息,请参阅第 22.3 节。如果将其设置为TRUE,它会导致新成员从被授予的角色中继承。如果设置为FALSE,新成员不会继承。如果在创建新角色成员资格时未指定,则默认为要添加的角色的继承属性。

SET选项(如果将其设置为TRUE)允许成员使用SET ROLE命令更改为被授予的角色。如果角色是另一个角色的间接成员,它只能在存在一系列每个都具有SET TRUE的授予的情况下使用SET ROLE更改为该角色。此选项默认为TRUE

要创建由另一个角色拥有的对象或将现有对象的拥有权授予另一个角色,您必须具有SET ROLE为该角色的能力;否则,诸如ALTER ... OWNER TOCREATE DATABASE ... OWNER之类的命令将失败。但是,继承角色权限但没有SET ROLE为该角色的能力的用户可能能够通过操作由该角色拥有的现有对象(例如,他们可以重新定义现有函数以充当特洛伊木马)来获得对该角色的完全访问权限。因此,如果要继承角色的权限但不能通过SET ROLE访问,则它不应拥有任何 SQL 对象。

如果指定了GRANTED BY,则授予被记录为由指定的角色完成。用户只能将授予归因于另一个角色,如果他们拥有该角色的权限。记录为授予者的角色必须在目标角色上具有ADMIN OPTION,除非它是引导超级用户。当授予被记录为具有引导超级用户以外的授予者时,它取决于授予者继续拥有角色的ADMIN OPTION;因此,如果撤销了ADMIN OPTION,则必须同时撤销依赖授予。

与权限不同,角色成员资格不能授予PUBLIC。另请注意,此命令形式不允许在*role_specification*中使用噪音词GROUP

注释

使用REVOKE命令撤销访问权限。

从PostgreSQL8.1 开始,用户和组的概念已统一为称为角色的单一实体类型。因此,不再需要使用关键字GROUP来标识受让人是用户还是组。命令中仍然允许使用GROUP,但它是一个噪音词。

如果用户对特定列或其整个表拥有该权限,则用户可以对该列执行SELECTINSERT等操作。在表级别授予权限,然后撤销对一列的权限不会产生预期效果:表级别授予不受列级别操作的影响。

当一个非对象所有者尝试对对象GRANT权限时,如果用户对该对象没有任何权限,则该命令将直接失败。只要存在某些权限,该命令将继续执行,但它只会授予用户拥有授予选项的那些权限。GRANT ALL PRIVILEGES形式在不持有任何授予选项时将发出警告消息,而其他形式在不持有命令中专门命名的任何权限的授予选项时将发出警告。(原则上,这些语句也适用于对象所有者,但由于所有者始终被视为拥有所有授予选项,因此永远不会出现这种情况。)

应当注意,数据库超级用户可以访问所有对象,而不管对象权限设置如何。这类似于 Unix 系统中root的权限。与root一样,除非绝对必要,否则不建议以超级用户身份操作。

如果超级用户选择发出GRANTREVOKE命令,则该命令将执行,就像它是由受影响对象的拥有者发出的。特别是,通过此类命令授予的权限将显示为由对象所有者授予的。(对于角色成员资格,成员资格显示为由引导超级用户授予的。)

也可以由一个角色执行GRANTREVOKE,该角色不是受影响对象的拥有者,但它是拥有该对象的组的成员,或者是一个在该对象上拥有WITH GRANT OPTION权限的组的成员。在这种情况下,将记录权限是由实际拥有该对象或拥有WITH GRANT OPTION权限的角色授予的。例如,如果表t1归角色g1所有,角色u1是其成员,则u1可以将t1上的权限授予u2,但这些权限将显示为直接由g1授予的。角色g1的任何其他成员以后都可以撤销它们。

如果执行GRANT的角色通过多个角色成员资格路径间接持有所需权限,则将记录哪个包含角色已执行授予操作尚不确定。在这种情况下,最佳做法是使用SET ROLE成为您希望执行GRANT的特定角色。

授予表上的权限不会自动将权限扩展到表使用的任何序列,包括绑定到SERIAL列的序列。必须单独设置序列上的权限。

请参阅第 5.7 节了解有关特定权限类型的更多信息,以及如何检查对象的权限。

示例

向表films上的所有用户授予插入权限

GRANT INSERT ON films TO PUBLIC;

向用户manuel授予视图kinds上的所有可用权限

GRANT ALL PRIVILEGES ON kinds TO manuel;

请注意,虽然如果由超级用户或kinds的所有者执行上述操作,确实会授予所有权限,但如果由其他人执行,则只会授予其他人具有授予选项的那些权限。

向用户joe授予角色admins的成员资格

GRANT admins TO joe;

兼容性

根据 SQL 标准,ALL PRIVILEGES中的PRIVILEGES关键字是必需的。SQL 标准不支持对每个命令设置多个对象上的权限。

PostgreSQL允许对象所有者撤销自己的普通权限:例如,表所有者可以通过撤销自己的INSERTUPDATEDELETETRUNCATE权限,使表对自己只读。根据 SQL 标准,这是不可能的。原因是PostgreSQL将所有者的权限视为所有者授予自己的权限;因此,他们也可以撤销这些权限。在 SQL 标准中,所有者的权限是由假定的实体“_SYSTEM”授予的。由于不是“_SYSTEM”,所有者无法撤销这些权利。

根据 SQL 标准,可以向PUBLIC授予授予选项;PostgreSQL 仅支持向角色授予授予选项。

SQL 标准允许GRANTED BY选项仅指定CURRENT_USERCURRENT_ROLE。其他变体是 PostgreSQL 扩展。

SQL 标准为其他类型的对象(字符集、排序规则、转换)提供了USAGE权限。

在 SQL 标准中,序列仅具有USAGE权限,它控制NEXT VALUE FOR表达式的使用,这等效于 PostgreSQL 中的nextval函数。序列权限SELECTUPDATE是 PostgreSQL 扩展。序列USAGE权限在currval函数中的应用也是 PostgreSQL 扩展(函数本身也是如此)。

对数据库、表空间、模式、语言和配置参数的权限是PostgreSQL扩展。

另请参见

REVOKEALTER DEFAULT PRIVILEGES