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