GRANT
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 ]
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...]
| ALL SEQUENCES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
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 ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
其中role_specification可以是:
[ GROUP ] role_name
| PUBLIC
| CURRENT_USER
| SESSION_USER
GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]
说明
GRANT命令有两个基本变体:一个授予数据库对象(表,列,视图,外表,序列,数据库,外部数据包装,外部服务器,函数,过程,过程语言,模式或表空间)的权限。,以及授予角色成员资格的人。这些变体在许多方面类似,但它们的不同足以单独描述。
GRANT数据库对象
GRANT命令的此变体为数据库对象提供对一个或多个角色的特定权限。这些权限将添加到已授予的权限(如果有)。
那里也是在一个或多个模式中为相同类型的所有对象授予特权的选项。目前仅对表,序列,函数和过程支持此功能。ALL TABLES 也会影响视图和外部表,就像特定对象 GRANT 命令一样。 ALL FUNCTIONS 也会影响聚合函数,但不会影响程序,就像特定对象GRANT命令一样。
关键字 PUBLIC 表示将授予所有角色的权限,包括可能稍后创建的角色。 PUBLIC可以被视为一个隐式定义的组,它始终包含所有角色。任何特定角色都将拥有直接授予它的权限总和,授予其当前成员的任何角色的权限,以及授予PUBLIC 的权限。
如果指定了 WITH GRANT OPTION,则权限的收件人可以依次将其授予其他人。如果没有授权选项,收件人就无法执行此操作。无法将授予选项授予PUBLIC 。
无需向对象的所有者(通常是创建它的用户)授予权限,因为默认情况下所有者具有所有权限。(但是,所有者可以选择撤销他们自己的一些安全权限。)
删除对象或以任何方式更改其定义的权利不被视为可授予的权限;它是所有者固有的,不能被授予或撤销。(但是,通过授予或撤销拥有该对象的角色的成员资格可以获得类似的效果;请参阅下文。)所有者也隐含地拥有该对象的所有授权选项。
Vastbase E100将某些类型的对象的默认权限授予 PUBLIC。默认情况下,对表,表列,序列,外部数据包装器,外部服务器,大型对象,模式或表空间不授予PUBLIC 权限。对于其他类型的对象,授予 PUBLIC 的默认权限如下: CONNECT 和TEMPORARY (创建临时表)数据库权限; EXECUTE 功能和程序的特权;和 USAGE语言和数据类型(包括域)的特权。当然,对象所有者可以默认和明确授予权限。(为了最大限度地提高安全性,请在创建对象的同一事务中发出 REVOKE;然后没有其他用户可以使用该对象的窗口。)此外,可以使用 ALTER DEFAULT PRIVILEGES命令更改这些初始默认权限设置。
可能的特权是:
SELECT
允许来自指定表,视图或序列的任何列或列出的特定列的 SELECT。也允许使用 COPYTO。在 UPDATE或 DELETE中引用现有列值也需要此权限。对于序列,此权限还允许使用 currval函数。对于大对象,此权限允许读取对象。
INSERT
允许 INSERT的新行进入指定的表。如果列出了特定列,则只能在 INSERT命令中分配这些列(因此其他列将接收默认值)。也允许 COPYFROM。
UPDATE
允许指定表的任何列或列出的特定列的 UPDATE。(实际上,任何非平凡的 UPDATE 命令也都需要 SELECT权限,因为它必须引用表列来确定要更新的行和/或计算列的新值。) SELECT… FOR UPDATE 和 SELECT … FOR SHARE 也至少需要一个特权列,除了SELECT 权限。对于序列,此权限允许使用 nextval 和 setval函数。对于大对象,此权限允许写入或截断对象。
DELETE
允许来自指定表的 DELETE行。 (实际上,任何非平凡的 DELETE命令也需要 SELECT 权限,因为它必须引用表列来确定要删除的行。)
TRUNCATE
允许指定表上的 TRUNCATE。
REFERENCES
允许创建引用指定表或表的指定列的外键约束。 (见 CREATE TABLE声明。)
TRIGGER
允许在指定的表上创建触发器。 (见 [CREATE TRIGGER陈述。)
CREATE
对于数据库,允许在数据库中创建新的模式和发布。
对于模式,允许在模式中创建新对象。要重命名现有对象,您必须拥有该对象并拥有包含架构的此权限。
对于表空间,允许在表空间中创建表,索引和临时文件,并允许创建将表空间作为其默认表空间的数据库。(请注意,撤消此权限不会改变现有的权限对象。)
CONNECT
允许用户连接到指定的数据库。在连接启动时检查此权限(除了检查 pg_hba.conf强加的任何限制)。
TEMPORARY
TEMP
允许在使用指定数据库时创建临时表。
EXECUTE
允许使用指定的函数或过程以及在函数顶部实现的任何运算符的使用。这是适用于功能和过程的唯一类型的权限。FUNCTION 语法也适用于聚合函数。或者,使用 ROUTINE来引用函数,聚合函数或过程,而不管它是什么。
USAGE
对于过程语言,允许使用指定的语言创建该语言的函数。这是适用于过程语言的唯一类型的权限。
对于模式,允许访问指定模式中包含的对象(假设还满足对象自己的特权要求)。从本质上讲,这允许被授权者在模式中”查找”对象。没有这个权限,仍然可以看到对象名称,例如通过查询系统表。此外,在撤消此权限后,现有后端可能具有先前已执行此查找的语句,因此这不是一种防止对象访问的完全安全的方法。
对于序列,此权限允许使用 currval 和 nextval 函数。
对于类型和域,此权限允许在创建表,函数和其他模式对象时使用类型或域。(请注意,它不控制类型的一般”用法”,例如查询中出现的类型的值。它只会阻止创建依赖于类型的对象。权限的主要目的是控制哪些用户创建依赖项在一个类型上,这可能会阻止所有者以后更改类型。)
对于外部数据包装器,此权限允许使用外部数据包装器创建新服务器。
对于服务器,此权限允许使用服务器创建外部表。受助者还可以创建,更改或删除与该服务器关联的自己的用户映射。
ALL PRIVILEGES
一次授予所有可用权限。 PRIVILEGES 关键字在Vastbase E100中是可选的,尽管严格的SQL需要它。
其他命令所需的权限列在相应命令的参考页面上。
角色上的 GRANT
GRANT命令的此变体将角色的成员资格授予一个或多个其他角色。角色的成员资格很重要,因为它向每个成员传达授予角色的权限。
如果指定了 WITH ADMIN OPTION,则成员可以依次将该角色的成员资格授予其他人,并撤销该角色的成员资格。如果没有admin选项,普通用户就无法做到这一点。角色不被视为自身保留WITH ADMIN OPTION,但它可以从会话用户与角色匹配的数据库会话中授予或撤消其成员资格。数据库超级用户可以向任何人授予或撤销任何角色的成员资格。具有CREATEROLE 权限的角色可以授予或撤消任何非超级用户角色的成员身份。
与具有特权的情况不同,角色的成员资格不能授予 PUBLIC。另请注意,此命令形式不允许使用噪声字 GROUP 。
注意事项
REVOKE命令用于撤消访问权限。
用户和组的概念已经统一为一种称为角色的实体。因此,不再需要使用关键字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列的序列。序列的权限必须单独设置。
使用 psql的 dp 命令获取有关表和列的现有权限的信息。例如:
=> \dp mytable
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+---------+-------+-----------------------+--------------------------
public | mytable | table | miriam=arwdDxt/miriam | col1:
: =r/miriam : miriam_rw=rw/miriam
: admin=arw/miriam
(1 row)
dp 显示的条目因此被解释为:
角色名=xxxx -- 被授予给一个角色的特权
=xxxx -- 被授予给 PUBLIC 的特权
r -- SELECT ("读")
w -- UPDATE ("写")
a -- INSERT ("追加")
d -- DELETE
D -- TRUNCATE
x -- REFERENCES
t -- TRIGGER
X -- EXECUTE
U -- USAGE
C -- CREATE
c -- CONNECT
T -- TEMPORARY
arwdDxt -- ALL PRIVILEGES (对于表,对其他对象会变化)
* -- 用于前述特权的授权选项
/yyyy -- 授予该特权的角色
在创建表 mytable 并执行以下操作后,用户 miriam 将看到上面的示例显示:
GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
对于非表对象,还有其他 d 命令可以显示其权限。
如果给定对象的”访问权限”列为空,则表示该对象具有默认权限(即,其权限列为空)。默认权限始终包括所有者的所有权限,并且可以包括PUBLIC 的某些权限,具体取决于对象类型,如上所述。对象上的第一个 GRANT 或REVOKE 将实例化默认权限(例如,生成 {miriam=arwdDxt/miriam}),然后根据指定的请求修改它们。同样,只有具有非默认权限的列才会在”列访问权限”中显示条目。 (注意:为此目的,”默认权限”始终表示对象类型的内置默认权限。其权限受ALTER DEFAULT PRIVILEGES命令影响的对象将始终显示一个显式权限条目,其中包含 ALTER 。)
请注意,所有者的隐式授权选项未在访问权限显示中标记。只有在明确授予某人授予选项时,才会显示* 。
示例
向表 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标准不支持为每个命令设置多个对象的权限。
Vastbase E100允许对象所有者撤销他们自己的普通权限:例如,表所有者可以通过撤销他们自己的INSERT , UPDATE , DELETE 和 TRUNCATE权限使该表只读给自己。根据SQL标准,这是不可能的。原因是Vastbase E100将所有者的特权视为已由所有者授予他们自己;因此他们也可以撤销它们。在SQL标准中,所有者的特权由假定的实体”_SYSTEM”授予。不是”_SYSTEM”,所有者不能撤销这些权利。
根据SQL标准,可以将授予选项授予 PUBLIC ; Vastbase E100仅支持向角色授予授权选项。
SQL标准为其他类型的对象提供了 USAGE 特权:字符集,排序规则,翻译。
在SQL标准中,序列只有 USAGE 特权,它控制 NEXT VALUE FOR表达式的使用,这相当于Vastbase E100中的函数 nextval 。序列权限 SELECT 和UPDATE 是Vastbase E100扩展。将序列 USAGE 特权应用于 currval函数也是Vastbase E100扩展(函数本身也是如此)。