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 ROLE
切换到该角色,前提是有一个授予链,其中每个授予都设置为 SET TRUE
。此选项默认为 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 的扩展。
如果您在文档中发现任何不正确、与您对特定功能的经验不符或需要进一步澄清的内容,请使用 此表单 来报告文档问题。