GRANT — 定义访问权限
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | 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
特定类型的权限,如 第 5.7 节 中所定义。
TEMP
TEMPORARY
的替代拼写。
所有权限
授予对象类型可用的所有权限。PRIVILEGES
关键字在 PostgreSQL 中是可选的,尽管严格的 SQL 需要它。
FUNCTION
语法适用于普通函数、聚合函数和窗口函数,但不适用于过程;请对这些函数使用 PROCEDURE
。或者,使用 ROUTINE
来引用函数、聚合函数、窗口函数或过程,而不管其确切类型如何。
还有一个选项可以在一个或多个模式中授予同类型的所有对象权限。此功能目前仅支持表、序列、函数和过程。ALL TABLES
也影响视图和外部表,就像特定对象的 GRANT
命令一样。ALL FUNCTIONS
也影响聚合和窗口函数,但不影响过程,同样就像特定对象的 GRANT
命令一样。使用 ALL ROUTINES
来包括过程。
此 GRANT
命令的变体将角色成员资格授予一个或多个其他角色,以及成员资格选项 SET
、INHERIT
和 ADMIN
的修改;有关详细信息,请参见 第 22.3 节。角色成员资格很重要,因为它可能允许访问授予角色的权限,并可能允许对角色本身进行更改。但是,实际授予的权限取决于与授予关联的选项。要修改现有成员资格的选项,只需指定具有更新选项值的成员资格即可。
下面描述的每个选项都可以设置为 TRUE
或 FALSE
。关键字 OPTION
被接受为 TRUE
的同义词,因此 WITH ADMIN OPTION
是 WITH ADMIN TRUE
的同义词。更改现有成员资格时,省略选项会导致保留当前值。
ADMIN
选项允许成员反过来向其他人授予角色成员资格,并撤销角色成员资格。如果没有管理员选项,普通用户不能这样做。角色不被认为对自己拥有 WITH ADMIN OPTION
。数据库超级用户可以向任何人授予或撤销任何角色的成员资格。此选项默认为 FALSE
。
INHERIT
选项控制新成员资格的继承状态;有关继承的详细信息,请参阅 第 22.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
是其成员,则 u1
可以将 t1
上的权限授予 u2
,但这些权限将显示为直接由 g1
授予的。角色 g1
的任何其他成员以后都可以撤销它们。
如果执行 GRANT
的角色通过多个角色成员资格路径间接持有所需权限,则将记录哪个包含角色已执行授予操作尚不确定。在这种情况下,最佳做法是使用 SET ROLE
成为您希望执行 GRANT
的特定角色。
授予表上的权限不会自动将权限扩展到表使用的任何序列,包括绑定到 SERIAL
列的序列。必须单独设置序列上的权限。
请参阅 第 5.7 节 了解有关特定权限类型的更多信息,以及如何检查对象的权限。
向表 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 扩展。