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
授予对象类型可用的所有权限。PostgreSQL 中 PRIVILEGES
关键字是可选的,尽管严格的 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扩展。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用此表单报告文档问题。