GRANT — 定义访问权限
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }routine_name
[ ( [ [argmode
] [arg_name
]arg_type
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] } ON PARAMETERconfiguration_parameter
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANTrole_name
[, ...] TOrole_specification
[, ...] [ WITH { ADMIN | INHERIT | SET } { OPTION | TRUE | FALSE } ] [ GRANTED BYrole_specification
] whererole_specification
can be: [ GROUP ]role_name
| PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER
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
MAINTAIN
如第 5.8 节中定义的特定类型的权限。
TEMP
TEMPORARY
的替代拼写。
ALL PRIVILEGES
授予对象类型的所有可用权限。PRIVILEGES
关键字在 PostgreSQL 中是可选的,但严格的 SQL 要求它。
FUNCTION
语法适用于普通函数、聚合函数和窗口函数,但不适用于过程;请使用 PROCEDURE
。或者,使用 ROUTINE
来引用函数、聚合函数、窗口函数或过程,而不管其精确类型。
还可以选择在单个或多个模式中授予相同类型的所有对象的权限。目前仅对表、序列、函数和过程支持此功能。ALL TABLES
也会影响视图和外部表,就像特定对象的 GRANT
命令一样。ALL FUNCTIONS
也会影响聚合函数和窗口函数,但不影响过程,就像特定对象的 GRANT
命令一样。使用 ALL ROUTINES
来包括过程。
这个 GRANT
命令的变体将角色中的成员资格授予一个或多个其他角色,并修改成员资格选项 SET
、INHERIT
和 ADMIN
;有关详细信息,请参阅第 21.3 节。角色中的成员资格非常重要,因为它可能会允许访问授予角色的每个成员的权限,并且可能还会允许更改角色本身。但是,实际授予的权限取决于与授予关联的选项。要修改现有成员资格的选项,只需使用更新的选项值指定成员资格即可。
下面描述的每个选项都可以设置为 TRUE
或 FALSE
。关键字 OPTION
被接受为 TRUE
的同义词,因此 WITH ADMIN OPTION
是 WITH ADMIN TRUE
的同义词。更改现有成员资格时,省略选项会导致保留当前值。
ADMIN
选项允许成员反过来将角色中的成员资格授予其他人,并撤销角色中的成员资格。如果没有管理选项,普通用户则无法执行此操作。角色不被认为对自己持有 WITH ADMIN OPTION
。数据库超级用户可以将任何角色中的成员资格授予任何人或撤销任何人的成员资格。此选项默认为 FALSE
。
INHERIT
选项控制新成员资格的继承状态;有关继承的详细信息,请参阅第 21.3 节。如果将其设置为 TRUE
,则会导致新成员从授予的角色继承。如果设置为 FALSE
,则新成员不会继承。如果创建新角色成员资格时未指定,则默认为新成员的继承属性。
如果 SET
选项设置为 TRUE
,则允许成员使用 SET ROLE
命令更改为授予的角色。如果一个角色是另一个角色的间接成员,则只有在存在一系列授予(每个授予都具有 SET TRUE
)的情况下,它才能使用 SET ROLE
更改为该角色。此选项默认为 TRUE
。
要创建由另一个角色拥有的对象或将现有对象的所有权授予另一个角色,您必须能够使用 SET ROLE
切换到该角色;否则,诸如 ALTER ... OWNER TO
或 CREATE DATABASE ... OWNER
之类的命令将会失败。但是,继承角色权限但无权使用 SET ROLE
切换到该角色的用户可以通过操作由该角色拥有的现有对象来获得对该角色的完全访问权限(例如,他们可以重新定义现有函数以充当特洛伊木马)。因此,如果要继承角色的权限,但不应通过 SET ROLE
访问,则该角色不应拥有任何 SQL 对象。
如果指定了 GRANTED BY
,则授予将被记录为由指定的角色完成。用户只能在他们拥有该角色的权限时才能将授予归因于另一个角色。记录为授权者的角色必须在目标角色上具有 ADMIN OPTION
,除非它是引导超级用户。当授予被记录为具有除引导超级用户之外的授权者时,它取决于授权者是否继续拥有角色的 ADMIN OPTION
;因此,如果撤销了 ADMIN OPTION
,则必须同时撤销依赖的授予。
与权限不同,角色的成员资格不能授予给 PUBLIC
。另请注意,此形式的命令不允许在 role_specification
中使用噪音词 GROUP
。
REVOKE
命令用于撤销访问权限。
自 PostgreSQL 8.1 起,用户和组的概念已统一为一个称为角色的实体。因此,不再需要使用关键字 GROUP
来标识被授权者是用户还是组。GROUP
仍然可以在命令中使用,但它是一个噪音词。
如果用户拥有特定列或整个表的权限,则他们可以在该列上执行 SELECT
、INSERT
等操作。在表级别授予权限,然后撤销某一列的权限,并不会达到预期的效果:表级别的授权不受列级别操作的影响。
当对象的非所有者尝试在对象上 GRANT
权限时,如果用户对该对象没有任何权限,则该命令将直接失败。只要有某种权限可用,该命令将继续执行,但它只会授予用户拥有授权选项的那些权限。GRANT ALL PRIVILEGES
形式在未持有任何授权选项时会发出警告消息,而其他形式如果未持有命令中明确命名的任何权限的授权选项,则会发出警告。(原则上,这些陈述也适用于对象所有者,但由于所有者始终被视为持有所有授权选项,因此这些情况永远不会发生。)
应该注意的是,数据库超级用户可以访问所有对象,而无需考虑对象权限设置。这类似于 Unix 系统中 root
的权限。与 root
一样,除非绝对必要,否则不建议以超级用户身份操作。
如果超级用户选择发出 GRANT
或 REVOKE
命令,则该命令的执行方式就好像是由受影响对象的所有者发出的一样。特别是,通过此类命令授予的权限将显示为由对象所有者授予。(对于角色成员资格,该成员资格显示为由引导超级用户授予。)
GRANT
和 REVOKE
也可以由不是受影响对象的所有者的角色执行,但该角色是拥有该对象的角色的成员,或者是持有该对象上 WITH GRANT OPTION
权限的角色的成员。在这种情况下,权限将被记录为由实际拥有该对象或持有 WITH GRANT OPTION
权限的角色授予。例如,如果表 t1
由角色 g1
拥有,而角色 u1
是 g1
的成员,那么 u1
可以将 t1
上的权限授予 u2
,但这些权限将显示为直接由 g1
授予。角色 g1
的任何其他成员稍后都可以撤销它们。
如果执行 GRANT
的角色通过多个角色成员路径间接地拥有所需的权限,则未指定将记录哪个包含角色已执行授予。在这种情况下,最佳做法是使用 SET ROLE
来成为您想要执行 GRANT
的特定角色。
授予表的权限不会自动扩展到该表使用的任何序列的权限,包括与 SERIAL
列关联的序列。必须单独设置序列的权限。
有关特定权限类型以及如何检查对象权限的更多信息,请参阅 第 5.8 节。
授予所有用户在表 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 允许对象所有者撤销自己的普通权限:例如,表所有者可以通过撤销他们自己的 INSERT
、UPDATE
、DELETE
和 TRUNCATE
权限来使表对自己变为只读。根据 SQL 标准,这是不可能的。原因是 PostgreSQL 将所有者的权限视为由所有者授予给他们自己;因此他们也可以撤销这些权限。在 SQL 标准中,所有者的权限是由一个假定的实体 “_SYSTEM” 授予的。由于不是 “_SYSTEM”,所有者无法撤销这些权限。
根据 SQL 标准,授权选项可以授予给 PUBLIC
;PostgreSQL 仅支持将授权选项授予给角色。
SQL 标准允许 GRANTED BY
选项仅指定 CURRENT_USER
或 CURRENT_ROLE
。其他变体是 PostgreSQL 扩展。
SQL 标准为其他类型的对象提供了 USAGE
权限:字符集、排序规则、转换。
在 SQL 标准中,序列仅具有 USAGE
权限,该权限控制 NEXT VALUE FOR
表达式的使用,这等效于 PostgreSQL 中的函数 nextval
。序列权限 SELECT
和 UPDATE
是 PostgreSQL 扩展。序列 USAGE
权限对 currval
函数的应用也是 PostgreSQL 扩展(该函数本身也是)。
数据库、表空间、模式、语言和配置参数的权限是 PostgreSQL 扩展。
如果您在文档中发现任何不正确的内容、与特定功能的使用体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。