GRANT
GRANT
定义访问权限。
概要
GRANT { {SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER | TRUNCATE } [, ...] | ALL [PRIVILEGES] } ON { [TABLE] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC} [, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] TO { role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { {USAGE | SELECT | UPDATE} [, ...] | ALL [PRIVILEGES] } ON { SEQUENCE sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { {CREATE | CONNECT | TEMPORARY | TEMP} [, ...] | ALL [PRIVILEGES] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [PRIVILEGES] } ON { FUNCTION function_name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [PRIVILEGES] } ON LANGUAGE lang_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | USAGE } [, ...] | ALL [PRIVILEGES] } ON SCHEMA schema_name [, ...] TO { [ GROUP ] role_name | PUBLIC} [, ...] [ WITH GRANT OPTION ] GRANT { CREATE | ALL [PRIVILEGES] } ON TABLESPACE tablespace_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT parent_role [, ...] TO member_role [, ...] [WITH ADMIN OPTION] GRANT { SELECT | INSERT | ALL [PRIVILEGES] } ON PROTOCOL protocolname TO username
描述
Greenplum数据库将用户和组的概念统一为一种称为角色的实体。 因此,不必使用关键字GROUP来标识被授予者是用户还是组。 命令中仍然允许使用GROUP,但这是一个干扰词。
GRANT命令具有两种基本变体: 一种对数据库对象(表,列,视图,外部表,序列,数据库,外部数据包装器,外部服务器,函数,过程语言,模式或表空间)授予特权, 以及授予一个角色中的成员关系。
GRANT命令的此变体将一个数据库对象的特定特权授予一个或多个角色。 这些特权将添加到已授予的特权(如果有)中。
还有一个选项可以授予一个或多个模式中所有相同类型的对象的特权。 当前仅表,序列和函数支持此功能(但请注意,ALL TABLES被视为包括视图和外部表)。
关键字PUBLIC表示将特权授予所有角色,包括以后可能创建的角色。 可以将PUBLIC视为始终包含所有角色的隐式定义的组级别角色。 任何特定角色将具有直接授予它的特权,授予它当前所属的任何角色的特权以及授予PUBLIC的特权的总和。
如果指定了WITH GRANT OPTION,则特权的接收者可以依次将其授予其他人。 没有grant option,接收者将无法做到这一点。 Grant options不能授予PUBLIC。
无需向对象的所有者(通常是创建该对象的角色)授予特权,因为所有者默认情况下具有所有特权。 (但是,所有者可以出于安全考虑选择撤销自己的某些特权。)
删除对象或以任何方式更改其定义的权利不视为可授予的特权;它是所有者固有的,不能被授予或撤销。 (但是,通过授予或撤消拥有对象的角色的成员资格,可以获得类似的效果;请参阅下文。) 所有者也隐式拥有该对象的所有授予选项。
Greenplum数据库将某些类型的对象的默认特权授予PUBLIC。 默认情况下,不将在表,表列,序列,外部数据包装器,外部服务器,大型对象,模式或表空间上的权限授予PUBLIC。 对于其他类型的对象,授予PUBLIC的默认特权如下:
- 数据库的CONNECT和TEMPORARY(创建临时表)特权,
- 函数的EXECUTE特权
- 语言和数据类型(包括域)的USAGE特权。
当然,对象所有者可以REVOKE默认特权和明确授予的特权。 (为了获得最大的安全性,请在创建对象的同一事务中执行REVOKE;因此,没有任何时间窗口可供其他用户使用该对象。)
GRANT命令的此变体将一个角色的成员资格授予一个或多个其他角色。 角色的成员资格意义重大,因为它可以将授予角色的特权传达给每个成员。
如果指定了WITH ADMIN OPTION,则成员可以依次将角色的成员资格授予其他人,也可以撤消该角色的成员资格。 没有admin选项,普通用户将无法做到这一点。 角色不被认为拥有WITH ADMIN OPTION本身,但是它可以从会话用户与角色匹配的数据库会话中授予或撤销成员资格。 数据库超级用户可以以任何角色向任何人授予或撤销成员资格。 具有CREATEROLE特权的角色可以授予或撤消不是超级用户的任何角色的成员资格。
与具有特权的情况不同,不能将角色的成员资格授予PUBLIC。
您还可以使用GRANT命令指定哪些用户可以访问受信任的协议。 (如果该协议不受信任,则您不能授予任何其他用户权限以使用它来读取或写入数据。)
- 要允许用户使用受信任的协议创建可读的外部表:
GRANT SELECT ON PROTOCOL protocolname TO username
- 要允许用户使用受信任的协议创建可写外部表:
GRANT INSERT ON PROTOCOL protocolname TO username
- 要允许用户使用受信任的协议创建可读和可写的外部表:
GRANT ALL ON PROTOCOL protocolname TO username
您还可以使用此命令来授予用户创建和使用s3和pxf外部表的权限。 但是,类型为http,https,gpfdist和gpfdists的外部表是在Greenplum数据库内部实现的,而不是作为自定义协议来实现的。 对于这些类型,请使用CREATE ROLE或ALTER ROLE命令为每个用户设置CREATEEXTTABLE或NOCREATEEXTTABLE属性。 有关语法和示例,请参见CREATE ROLE。
参数
- SELECT
- 允许从指定表,视图或序列的任何列或列出的特定列中进行SELECT。 还允许使用COPY TO。 引用UPDATE或DELETE中现有的列值也需要此特权。
- INSERT
- 允许将新行INSERT到指定表中。 如果列出了特定的列,则只能在INSERT命令中指定那些列(其他列将接收默认值)。 还允许COPY FROM。
- UPDATE
- 允许UPDATE指定表的任何列或列出的特定列。 SELECT ... FOR UPDATE和SELECT ... FOR SHARE在至少一列上也需要此特权(以及SELECT特权)。 对于序列,此特权允许使用nextval()和setval()函数。
- DELETE
- 允许从指定表中DELETE一行。
- REFERENCES
- 尽管Greenplum数据库当前不支持外键约束,但仍可接受此关键字。 要创建外键约束,必须在引用列和被引用列上都具有此特权。 可以为表的所有列或仅特定列授予特权。
- TRIGGER
- 允许在指定的表上创建触发器。
Note: Greenplum数据库不支持触发器。
- TRUNCATE
- 允许对指定表中的所有行进行TRUNCATE。
- CREATE
- 对于数据库,允许在数据库中创建新的schema。
- 对于schema,允许在schema内创建新对象。 要重命名现有对象,您必须拥有该对象,并对包含的schema具有此特权。
- 对于表空间,允许在表空间内创建表和索引,并允许创建将表空间作为其默认表空间的数据库。 (请注意,撤消此特权不会更改现有对象的位置。)
- CONNECT
- 允许用户连接到指定的数据库。 在连接启动时会检查此特权(除了检查pg_hba.conf施加的任何限制)。
- TEMPORARY
- TEMP
- 允许在使用数据库时创建临时表。
- EXECUTE
- 允许使用指定的函数以及使用在该函数之上实现的任何运算符。 这是适用于函数的唯一特权类型。 (此语法也适用于聚合函数。)
- USAGE
- 对于过程语言,允许使用指定的语言来创建该语言的函数。 这是适用于过程语言的唯一特权类型。
- 对于schema,允许访问指定schema中包含的对象(假设还满足对象自己的特权要求)。 从本质上讲,这允许被授予者在schema中查找对象。
- 对于序列,此特权允许使用currval()和nextval()函数。
- 对于类型和域,此特权允许在创建表,函数和其他schema对象时使用类型或域。 (请注意,它不控制类型的一般“用法”,例如查询中出现的类型的值。它仅防止创建依赖于类型的对象。 特权的主要目的是控制哪些用户基于类型创建依赖关系,这可能会阻止所有者稍后更改类型。)
- 对于外部数据包装器,此特权使被授予者可以使用该外部数据包装器创建新服务器。
- 对于服务器,此特权使被授予者可以使用服务器创建外部表, 还可以创建,更改或删除其自己与该服务器关联的用户的用户映射。
- ALL PRIVILEGES
- 一次授予所有可用特权。 PRIVILEGES关键字在Greenplum数据库中是可选的,尽管严格的SQL要求使用。
- PUBLIC
- 特殊的组级角色,表示将特权授予所有角色,包括以后可能创建的角色。
- WITH GRANT OPTION
- 特权的接收者可以依次将其授予他人。
- WITH ADMIN OPTION
- 角色的成员又可以将角色的成员身份授予其他人。
注解
如果用户对特定列或整个表拥有该特权,则用户可以在该列上执行SELECT,INSERT等操作。 在表级别上授予特权,然后将其撤销一列,这并不像你预想的那样: 表级授予不受列级操作的影响。
数据库超级用户可以访问所有对象,而不管对象特权设置如何。 该对象的一个例外是视图对象。 对视图中引用的表的访问权限是由视图所有者(不是当前用户,即使当前用户是超级用户)的权限决定的。
如果超级用户选择执行GRANT或REVOKE命令,则该命令的执行就像是由受影响对象的所有者执行的一样。 特别是,通过此类命令授予的特权似乎已由对象所有者授予。 对于角色成员资格,成员资格似乎已由包含它的角色授予。
GRANT和REVOKE也可以由不是受影响对象的所有者完成,但要求是拥有该对象的角色的成员, 或者是拥有对该对象的WITH GRANT OPTION特权的角色的成员来完成。 在这种情况下,特权将被记录为已由实际拥有对象或拥有WITH GRANT OPTION特权的角色授予。
授予表权限不会自动将权限扩展到该表使用的任何序列,包括与SERIAL列绑定的序列。 序列的权限必须单独设置。
GRANT命令不能用于为协议file,gpfdist或gpfdists设置特权。 这些协议在Greenplum数据库内部实现。 而是使用CREATE ROLE或ALTER ROLE命令来设置角色的CREATEEXTTABLE属性。
使用psql的\dp元命令来获取有关表和列的现有特权的信息。 您还可以使用其他\d元命令来显示非表对象的特权。
示例
向表mytable上的所有角色授予插入权限:
GRANT INSERT ON mytable TO PUBLIC;
将所有可用的特权授予在topten视图中的角色sally。 请注意,如果上述内容的确会由超级用户或topten的所有者执行, 将会授予所有特权,当由其他人执行时,它只会授予那些授予角色具有授予选项的那些权限。
GRANT ALL PRIVILEGES ON topten TO sally;
将角色admins的成员资格授予用户joe:
GRANT admins TO joe;
兼容性
PRIVILEGES关键字在SQL标准中是必需的,但在Greenplum数据库中是可选的。 SQL标准不支持为每个命令在多个对象上设置特权。
Greenplum数据库允许对象所有者撤消他们自己的普通特权: 例如,表所有者可以通过撤消其自己的INSERT,UPDATE,DELETE和TRUNCATE特权使该表对自己只读。 根据SQL标准,这是不可能的。 Greenplum数据库将所有者的特权视为由所有者授予了所有者;因此他们也可以撤销它们。 在SQL标准中,所有者的特权由假定的system实体授予。
SQL标准为其他类型的对象提供USAGE特权:字符集,排序规则,翻译。
在SQL标准中,序列仅具有USAGE特权, 该特权控制NEXT VALUE FOR表达式的使用,该表达式等效于Greenplum数据库中的nextval函数。 序列特权SELECT和UPDATE是Greenplum数据库扩展。 对currval函数应用序列USAGE特权也是Greenplum数据库扩展(函数本身也是)。
数据库,表空间,模式和语言的特权是Greenplum数据库扩展。