GRANT — 定义访问权限
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
[, ...] | 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 命令变体将数据库对象上的特定权限授予一个或多个角色。如果此前已经授予过某些权限,新授予的权限会加到现有权限之上。
关键字 PUBLIC 表示要把权限授予所有角色,包括以后可能创建的角色。PUBLIC 可以视为一个隐式定义的组,并且始终包含所有角色。任何特定角色实际拥有的权限,是直接授予给它的权限、授予给它当前所属任一角色的权限,以及授予给 PUBLIC 的权限之和。
如果指定了 WITH GRANT OPTION,权限接收者随后可以再把该权限授予其他人。没有授予选项时,接收者不能这样做。授予选项不能授予给 PUBLIC。
如果指定了 GRANTED BY,指定的授权者必须是当前用户。该子句目前仅以这种形式存在,只是为了兼容 SQL。
没有必要向对象拥有者(通常是创建它的用户)授予权限,因为拥有者默认拥有全部权限。(不过,出于安全考虑,拥有者也可以选择撤销自己的某些权限。)
删除对象或以任何方式更改其定义的权利,不被视为一种可授予的权限;它是拥有者固有的,不能被授予或撤销。(不过,可以通过授予或撤销拥有该对象的角色的成员资格,获得类似效果;见下文。)拥有者还隐式拥有该对象上的全部授予选项。
可能的权限包括:
SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGESETALTER SYSTEMMAINTAIN #具体的权限类型见 Section 5.8。
TEMP #TEMPORARY 的另一种拼写。
ALL PRIVILEGES #授予该对象类型可用的全部权限。 在 PostgreSQL 中,PRIVILEGES 关键字是可选的, 不过在严格 SQL 中则是必需的。
FUNCTION 语法适用于普通函数、聚合函数和窗口函数,但不适用于过程;对于过程请使用 PROCEDURE。或者,使用 ROUTINE 可以在不区分精确类型时指代函数、聚合函数、窗口函数或过程。
还可以选择在一个或多个模式中,对同一类型的所有对象授予权限。目前仅对表、序列、函数和过程支持这一功能。ALL TABLES 也会影响视图和外部表,这与针对特定对象的 GRANT 命令相同。ALL FUNCTIONS 也会影响聚合函数和窗口函数,但不包括过程,这同样与针对特定对象的 GRANT 命令一致。要包含过程,请使用 ALL ROUTINES。
这种 GRANT 命令变体把一个角色的成员资格授予一个或多个其他角色,并修改成员资格选项 SET、INHERIT 和 ADMIN;详见 Section 21.3。角色成员资格之所以重要,是因为它可能使成员能够访问授予给该角色的权限,也可能使其能够对该角色本身作出更改。不过,实际赋予的权限取决于该授权所关联的选项。要修改现有成员资格的这些选项,只需再次指定该成员资格并给出更新后的选项值即可。
下面描述的每个选项都可以设为 TRUE 或 FALSE。关键字 OPTION 可作为 TRUE 的同义词,因此 WITH ADMIN OPTION 等同于 WITH ADMIN TRUE。修改现有成员资格时,省略某个选项表示保留其当前值。
ADMIN 选项允许成员随后将该角色的成员资格授予其他人,也允许撤销该角色中的成员资格。没有该选项时,普通用户不能这样做。角色不被视为在其自身上持有 WITH ADMIN OPTION。数据库超级用户可以向任何人授予或撤销任何角色的成员资格。该选项默认为 FALSE。
INHERIT 选项控制新成员资格的继承状态;有关继承的细节见 Section 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 列的序列。序列上的权限必须单独设置。
有关具体权限类型以及如何检查对象权限的更多信息,请参见 Section 5.8。
将表 films 上的插入权限授予所有用户:
GRANT INSERT ON films TO PUBLIC;
将视图 kinds 上的所有可用权限授予用户 manuel:
GRANT ALL PRIVILEGES ON kinds TO manuel;
请注意,如果上述命令由超级用户或 kinds 的拥有者执行,确实会授予所有权限;但如果由其他人执行,则只会授予该执行者持有授予选项的那些权限。
将角色 admins 的成员资格授予用户 joe:
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 扩展。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。