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
的备用拼写。
所有权限
授予对象类型的所有可用权限。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
选项允许成员反过来授予其他人该角色中的成员资格,以及吊销该角色中的成员资格。如果没有 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
。还要注意,该命令的此形式不允许在 角色规范
中使用噪音词 GROUP
。
REVOKE
命令用于撤销访问特权。
自 PostgreSQL 8.1 起,用户和组的概念已被统一到称为角色的单一实体类型中。因此,不再需要使用关键字 GROUP
来识别受让人是用户还是组。命令中仍然允许使用 GROUP
,但它是一个噪音词。
如果用户对特定列或其整个表的该特权,则其可以执行列上的 SELECT
、INSERT
等操作。在表级别授予该特权,然后针对一列撤销该特权不会产生可能想要的效果:表级别授予不受列级别操作的影响。
当对象的非所有者尝试对对象 GRANT
特权时,如果用户对该对象没有任何特权,该命令将彻底失败。只要提供了一些特权,该命令将继续执行,但它将只授予用户拥有授予选项的那些特权。GRANT ALL PRIVILEGES
形式在不持有任何授予选项时会发出警告消息,而其他形式在不持有命令中特定命名的任何特权的授予选项时会发出警告。(原则上这些语句也适用于对象的所有者,但由于所有者始终被视为拥有所有授予选项,所以永远不会发生这种情况。)
需要指出的是,数据库超级用户可以访问所有对象,而不管对象权限设置。这与 UNIX 系统中的 root
权限堪比。与 root
一样,除非绝对有必要,否则不建议以超级用户的身份执行操作。
如果超级用户选择发布 GRANT
或 REVOKE
命令,则按受影响对象的拥有者发布该命令的方式执行命令。特别是,将显示授予已授予特权权限的对象所有者。对于角色成员资格,将显示授予超级用户引导程序的成员资格。
不是受影响对象所有者,但属于拥有该对象的角色的成员,或属于在对象上拥有 WITH GRANT OPTION
权限的角色的成员,该成员也可执行 GRANT
和 REVOKE
。在此情况下,将记录权限由实际拥有对象或拥有 WITH GRANT OPTION
权限的角色授予。例如,如果表 t1
由角色 g1
拥有,其中角色 u1
是成员,那么 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 标准中,序列只拥有控制 NEXT VALUE FOR
表达式使用的 USAGE
权限,该表达式的功能与 PostgreSQL 中的 nextval
函数相同。序列权限 SELECT
和 UPDATE
是 PostgreSQL 扩展。序列 USAGE
权限应用于 currval
函数也是 PostgreSQL 扩展(函数本身也是扩展)。
数据库、表空间、模式、语言和配置参数上的权限是 PostgreSQL 扩展。