# 授予

GRANT — 定义访问权限

# 概要

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | 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 { { 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 OPTION ]
    [ GRANTED BY role_specification ]

where role_specification can be:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

# 描述

授予command 有两种基本变体:一种授予对数据库对象(表、列、视图、外部表、序列、数据库、外部数据包装器、外部服务器、函数、过程、过程语言、模式或表空间)的权限,以及一个授予角色成员资格的角色。

# 这些变体在许多方面都相似,但它们的差异足以单独描述。

授予数据库对象这种变体授予命令将数据库对象的特定权限授予一个或多个角色。

这些权限将添加到已授予的权限(如果有)。关键词民众表示权限将授予所有角色,包括以后可能创建的角色。民众可以将其视为始终包含所有角色的隐含定义的组。任何特定角色都将拥有直接授予它的权限、授予其当前成员的任何角色的权限以及授予的权限的总和民众

.如果有授予选项被指定,特权的接受者可以反过来将其授予其他人。如果没有授予选项,接收者将无法这样做。授予选项不能授予民众

.如果授予者指定,指定的grantor必须是当前用户。

该子句目前以这种形式出现只是为了与 SQL 兼容。无需向对象的所有者(通常是创建它的用户)授予权限,因为所有者默认拥有所有权限。

(但是,所有者可以选择撤销他们自己的一些安全特权。)删除对象或以任何方式更改其定义的权利不被视为可授予的特权;它是所有者固有的,不能授予或撤销。(但是,通过授予或撤销拥有该对象的角色的成员资格可以获得类似的效果;见下文。)所有者也隐含地拥有该对象的所有授予选项。

可能的特权是:

选择
插入
更新
删除
截短
参考
扳机
创造
连接
暂时的
执行
用法

特定类型的特权,如第 5.7 节.

温度

的替代拼写暂时的.

所有特权

授予对象类型可用的所有权限。这特权关键字在 PostgreSQL 中是可选的,但在严格的 SQL 中是必需的。

功能语法适用于普通函数、聚合函数和窗口函数,但不适用于过程;采用程序对于那些。或者,使用常规指代函数、聚合函数、窗口函数或过程,无论其精确类型如何。

还有一个选项可以授予对一个或多个模式中相同类型的所有对象的权限。当前仅表、序列、函数和过程支持此功能。所有表格也影响视图和外部表,就像特定对象一样授予命令。所有功能也影响聚合和窗口函数,但不影响过程,就像特定对象一样授予命令。采用所有例程包括程序。

# 授予角色

这种变体授予命令将一个角色的成员资格授予一个或多个其他角色。角色中的成员资格很重要,因为它将授予角色的特权传达给其每个成员。

如果带管理员选项指定时,成员可以反过来将角色的成员资格授予其他人,也可以撤销角色的成员资格。如果没有 admin 选项,普通用户无法做到这一点。角色不被视为持有带管理员选项在其自身上,但它可以从会话用户与角色匹配的数据库会话中授予或撤销其自身的成员资格。数据库超级用户可以向任何人授予或撤销任何角色的成员资格。角色有创造者privilege 可以授予或撤销任何不是超级用户的角色的成员资格。

如果授予者指定时,授权记录为已由指定角色完成。只有数据库超级用户可以使用此选项,除非它指定执行命令的相同角色。

与具有特权的情况不同,角色的成员资格不能授予民众.另请注意,这种形式的命令不允许干扰词团体在*角色规范*.

# 笔记

撤销命令用于撤销访问权限。

从 PostgreSQL 8.1 开始,用户和组的概念被统一为一种称为角色的实体。因此不再需要使用关键字团体识别被授权者是用户还是组。团体在命令中仍然允许,但它是一个干扰词。

用户可以执行选择,插入等,如果他们对特定列或其整个表拥有该特权。在表级别授予特权,然后为一列撤销它不会像人们希望的那样:表级别授予不受列级别操作的影响。

当对象的非所有者试图授予对象的权限,如果用户对该对象没有任何权限,该命令将彻底失败。只要某些权限可用,该命令就会继续执行,但它只会授予用户具有授予选项的权限。这授予所有特权如果未持有任何授权选项,表单将发出警告消息,而如果未持有命令中特别指定的任何特权的授予选项,则其他表单将发出警告。(原则上,这些陈述也适用于对象所有者,但由于所有者始终被视为持有所有授权选项,因此这种情况永远不会发生。)

应该注意的是,数据库超级用户可以访问所有对象,而不管对象权限设置如何。这相当于权利在 Unix 系统中。与,除非绝对必要,否则以超级用户身份操作是不明智的。

如果超级用户选择发出授予或者撤销命令,该命令的执行就好像它是由受影响对象的所有者发出的一样。特别是,通过此类命令授予的权限似乎已由对象所有者授予。(对于角色成员身份,成员身份似乎已由包含角色本身授予。)

授予撤销也可以由不是受影响对象的所有者的角色完成,但它是拥有该对象的角色的成员,或者是拥有特权的角色的成员有授予选项物体上。在这种情况下,权限将被记录为由实际拥有对象或拥有权限的角色授予有授予选项.例如,如果表t1由角色拥有g1, 哪个角色u1是会员,那么u1可以授予权限t1u2, 但这些特权似乎是由g1.角色的任何其他成员g1以后可以撤销它们。

如果角色执行授予通过多个角色成员路径间接持有所需的权限,未指定哪个包含角色将被记录为已完成授权。在这种情况下,最好使用设定角色成为你想做的特定角色授予作为。

授予对表的权限不会自动将权限扩展到表使用的任何序列,包括绑定到的序列串行列。序列的权限必须单独设置。

第 5.7 节有关特定权限类型的更多信息,以及如何检查对象的权限。

# 例子

向表上的所有用户授予插入权限电影

GRANT INSERT ON films TO PUBLIC;

向用户授予所有可用权限曼纽尔正在查看种类

GRANT ALL PRIVILEGES ON kinds TO manuel;

请注意,如果由超级用户或所有者执行,上述内容确实会授予所有权限种类,当由其他人执行时,它只会授予其他人具有授予选项的权限。

授予角色成员资格管理员给用户

GRANT admins TO joe;

# 兼容性

根据 SQL 标准,特权关键词在所有特权是必须的。SQL 标准不支持为每个命令设置多个对象的权限。

PostgreSQL 允许对象所有者撤销他们自己的普通权限:例如,表所有者可以通过撤销他们自己的来使表对自己只读插入,更新,删除, 和截短特权。根据 SQL 标准,这是不可能的。原因是 PostgreSQL 将所有者的权限视为所有者授予自己的权限;因此他们也可以撤销它们。在 SQL 标准中,所有者的权限由假定实体授予“_系统”。不是“_SYSTEM”,所有者不能撤销这些权利。

根据 SQL 标准,授予选项可以授予民众;PostgreSQL 仅支持向角色授予授权选项。

SQL 标准允许授予者仅指定选项当前用户或者当前角色.其他变体是 PostgreSQL 扩展。

SQL 标准提供了一个用法其他类型对象的特权:字符集、排序规则、翻译。

在 SQL 标准中,序列只有一个用法权限,它控制使用下一个价值表达式,相当于函数下一个瓦尔在 PostgreSQL 中。序列特权选择更新是 PostgreSQL 扩展。序列的应用用法的特权曲线function 也是一个 PostgreSQL 扩展(就像函数本身一样)。

数据库、表空间、模式和语言的权限是 PostgreSQL 扩展。

# 也可以看看

撤销,更改默认权限