GRANT
更新时间:2026-06-25
GRANT
定义访问权限。
语法
SQL
1 GRANT { {SELECT | INSERT | UPDATE | DELETE | REFERENCES |
2 TRIGGER | TRUNCATE } [, ...] | ALL [PRIVILEGES] }
3 ON { [TABLE] table_name [, ...]
4 | ALL TABLES IN SCHEMA schema_name [, ...] }
5 TO { [ GROUP ] role_name | PUBLIC} [, ...] [ WITH GRANT OPTION ]
6
7 GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
8 [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
9 ON [ TABLE ] table_name [, ...]
10 TO { role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
11
12 GRANT { {USAGE | SELECT | UPDATE} [, ...] | ALL [PRIVILEGES] }
13 ON { SEQUENCE sequence_name [, ...]
14 | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
15 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
16
17 GRANT { {CREATE | CONNECT | TEMPORARY | TEMP} [, ...] | ALL
18 [PRIVILEGES] }
19 ON DATABASE database_name [, ...]
20 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
21
22 GRANT { USAGE | ALL [ PRIVILEGES ] }
23 ON DOMAIN domain_name [, ...]
24 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
25
26 GRANT { USAGE | ALL [ PRIVILEGES ] }
27 ON FOREIGN DATA WRAPPER fdw_name [, ...]
28 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
29
30 GRANT { USAGE | ALL [ PRIVILEGES ] }
31 ON FOREIGN SERVER server_name [, ...]
32 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
33
34 GRANT { EXECUTE | ALL [PRIVILEGES] }
35 ON { FUNCTION function_name ( [ [ argmode ] [ argname ] argtype [, ...]
36 ] ) [, ...]
37 | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
38 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
39
40 GRANT { USAGE | ALL [PRIVILEGES] }
41 ON LANGUAGE lang_name [, ...]
42 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
43
44 GRANT { { CREATE | USAGE } [, ...] | ALL [PRIVILEGES] }
45 ON SCHEMA schema_name [, ...]
46 TO { [ GROUP ] role_name | PUBLIC} [, ...] [ WITH GRANT OPTION ]
47
48 GRANT { CREATE | ALL [PRIVILEGES] }
49 ON TABLESPACE tablespace_name [, ...]
50 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
51
52 GRANT { USAGE | ALL [ PRIVILEGES ] }
53 ON TYPE type_name [, ...]
54 TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
55
56 GRANT parent_role [, ...]
57 TO member_role [, ...] [WITH ADMIN OPTION]
58
59 GRANT { SELECT | INSERT | ALL [PRIVILEGES] }
60 ON PROTOCOL protocolname
61 TO username
62 ```
63
64
65
66## 描述
67
68PalopgMPP数据库将用户和组的概念统一为一种称为角色的实体。 因此,不必使用关键字`GROUP`来标识被授予者是用户还是组。命令中仍然允许使用`GROUP`,但这是一个干扰词。
69
70 `GRANT`命令具有两种基本变体:一种对数据库对象(表,列,视图,外部表,序列,数据库,外部数据包装器,外部服务器,函数,过程语言,模式或表空间)授予权限,以及授予一个角色中的成员关系。
71
72
73 * **数据库对象上的GRANT**
74
75 `GRANT`命令的此变体将一个数据库对象的特定权限授予一个或多个角色。 这些权限将添加到已授予的权限(如果有)中。
76
77 还有一个选项可以授予一个或多个模式中所有相同类型的对象的权限。 当前仅表,序列和函数支持此功能(但请注意,`ALL TABLES`被视为包括视图和外部表)。
78
79 关键字`PUBLIC`表示将权限授予所有角色,包括以后可能创建的角色。 可以将`PUBLIC`视为始终包含所有角色的隐式定义的组级别角色。任何特定角色将具有直接授予它的权限,授予它当前所属的任何角色的权限以及授予`PUBLIC`的权限的总和。
80
81 如果指定了`WITH GRANT OPTION`,则权限的接收者可以依次将其授予其他人。 没有grant option,接收者将无法做到这一点。Grant options不能授予`PUBLIC`。
82
83 无需向对象的所有者(通常是创建该对象的角色)授予权限,因为所有者默认情况下具有所有权限。(但是,所有者可以出于安全考虑选择撤销自己的某些权限。)
84
85 删除对象或以任何方式更改其定义的权利不视为可授予的权限;它是所有者固有的,不能被授予或撤销。(但是,通过授予或撤消拥有对象的角色的成员资格,可以获得类似的效果;请参阅下文。)所有者也隐式拥有该对象的所有授予选项。
86
87 PalopgMPP数据库将某些类型的对象的默认权限授予`PUBLIC`。默认情况下,不将在表,表列,序列,外部数据包装器,外部服务器,大型对象,模式或表空间上的权限授予`PUBLIC`。对于其他类型的对象,授予`PUBLIC`的默认权限如下:
88
89
90 - 数据库的`CONNECT`和`TEMPORARY`(创建临时表)权限,
91
92 - 函数的`EXECUTE`权限
93
94 - 语言和数据类型(包括域)的`USAGE`权限。
95
96 当然,对象所有者可以`REVOKE`默认权限和明确授予的权限。(为了获得最大的安全性,请在创建对象的同一事务中执行`REVOKE`;因此,没有任何时间窗口可供其他用户使用该对象。)
97
98
99
100 * **角色上的GRANT**
101
102 `GRANT`命令的此变体将一个角色的成员资格授予一个或多个其他角色。 角色的成员资格意义重大,因为它可以将授予角色的权限传达给每个成员。
103
104 如果指定了`WITH ADMIN OPTION`,则成员可以依次将角色的成员资格授予其他人,也可以撤消该角色的成员资格。没有admin选项,普通用户将无法做到这一点。 角色不被认为拥有`WITH ADMINOPTION`本身,但是它可以从会话用户与角色匹配的数据库会话中授予或撤销成员资格。数据库管理员可以以任何角色向任何人授予或撤销成员资格。具有`CREATEROLE`权限的角色可以授予或撤消不是数据库管理员的任何角色的成员资格。
105
106 与具有权限的情况不同,不能将角色的成员资格授予`PUBLIC`。
107
108
109
110 * **协议上的GRANT**
111
112 还可以使用`GRANT`命令指定哪些用户可以访问受信任的协议。 (如果该协议不受信任,则您不能授予任何其他用户权限以使用它来读取或写入数据。)
113
114 - 要允许用户使用受信任的协议创建可读的外部表:
115
116 ``` sql
117 GRANT SELECT ON PROTOCOL protocolname TO username
118 ```
119
120 - 要允许用户使用受信任的协议创建可写外部表:
121
122 ``` sql
123 GRANT INSERT ON PROTOCOL protocolname TO username
124 ```
125
126 - 要允许用户使用受信任的协议创建可读和可写的外部表:
127
128 ``` sql
129 GRANT ALL ON PROTOCOL protocolname TO username
130 ```
131
132 还可以使用此命令来授予用户创建和使用`s3`和`pxf`外部表的权限。但是,类型为`http`,`https`,`scfs`和`scfs`的外部表是在PalopgMPP数据库内部实现的,而不是作为自定义协议来实现的。对于这些类型,请使用`CREATE ROLE`或`ALTER ROLE`命令为每个用户设置`CREATEEXTTABLE`或`NOCREATEEXTTABLE`属性。
133
134
135
136
137
138## 参数
139
140该SQL命令参数说明见下
141
142 SELECT
143 : 允许从指定表,视图或序列的任何列或列出的特定列中进行`SELECT`。 还允许使用`COPY TO`。引用`UPDATE`或`DELETE`中现有的列值也需要此权限。
144
145 INSERT
146 : 允许将新行`INSERT`到指定表中。 如果列出了特定的列,则只能在`INSERT`命令中指定那些列(其他列将接收默认值)。还允许`COPY FROM`。
147
148 UPDATE
149 : 允许`UPDATE`指定表的任何列或列出的特定列。 `SELECT ... FOR UPDATE`和`SELECT ... FOR SHARE`在至少一列上也需要此权限(以及`SELECT`权限)。
150
151 对于序列,此权限允许使用`nextval()`和`setval()`函数。
152
153 DELETE
154 : 允许从指定表中`DELETE`一行。
155
156 REFERENCES
157 : 尽管PalopgMPP数据库当前不支持外键约束,但仍可接受此关键字。 要创建外键约束,必须在引用列和被引用列上都具有此权限。可以为表的所有列或仅特定列授予权限。
158
159 TRIGGER
160 : 允许在指定的表上创建触发器。
161
162 TRUNCATE
163 : 允许对指定表中的所有行进行`TRUNCATE`。
164
165 CREATE
166 : 对于数据库,允许在数据库中创建新的schema。
167
168 对于schema,允许在schema内创建新对象。 要重命名现有对象,您必须拥有该对象,并对包含的schema具有此权限。
169
170 对于表空间,允许在表空间内创建表和索引,并允许创建将表空间作为其默认表空间的数据库。 (请注意,撤消此权限不会更改现有对象的位置。)
171
172 CONNECT
173 : 允许用户连接到指定的数据库。 在连接启动时会检查此权限(除了检查`sd_hba.conf`施加的任何限制)。
174
175 TEMPORARY \| TEMP
176 : 允许在使用数据库时创建临时表。
177
178 EXECUTE
179 : 允许使用指定的函数以及使用在该函数之上实现的任何运算符。 这是适用于函数的唯一权限类型。 (此语法也适用于聚合函数。)
180
181 USAGE
182 : 对于过程语言,允许使用指定的语言来创建该语言的函数。 这是适用于过程语言的唯一权限类型。
183
184 对于schema,允许访问指定schema中包含的对象(假设还满足对象自己的权限要求)。从本质上讲,这允许被授予者在schema中查找对象。
185
186 对于序列,此权限允许使用`currval()`和`nextval()`函数。
187
188 对于类型和域,此权限允许在创建表,函数和其他schema对象时使用类型或域。(请注意,它不控制类型的一般“用法”,例如查询中出现的类型的值。它仅防止创建依赖于类型的对象。权限的主要目的是控制哪些用户基于类型创建依赖关系,这可能会阻止所有者稍后更改类型。)
189
190 对于外部数据包装器,此权限使被授予者可以使用该外部数据包装器创建新服务器。
191
192 对于服务器,此权限使被授予者可以使用服务器创建外部表, 还可以创建,更改或删除其自己与该服务器关联的用户的用户映射。
193
194 ALL PRIVILEGES
195 : 一次授予所有可用权限。 `PRIVILEGES`关键字在PalopgMPP数据库中是可选的,尽管严格的SQL要求使用。
196
197 PUBLIC
198 : 特殊的组级角色,表示将权限授予所有角色,包括以后可能创建的角色。
199
200 WITH GRANT OPTION
201 : 权限的接收者可以依次将其授予他人。
202
203 WITH ADMIN OPTION
204 : 角色的成员又可以将角色的成员身份授予其他人。
205
206
207
208注解
209: 如果用户对特定列或整个表拥有该权限,则用户可以在该列上执行`SELECT`,`INSERT`等操作。在表级别上授予权限,然后将其撤销一列,这并不像你预想的那样:表级授予不受列级操作的影响。
210
211 数据库管理员可以访问所有对象,而不管对象权限设置如何。 该对象的一个例外是视图对象。对视图中引用的表的访问权限是由视图所有者(不是当前用户,即使当前用户是数据库管理员)的权限决定的。
212
213 如果数据库管理员选择执行`GRANT`或`REVOKE`命令,则该命令的执行就像是由受影响对象的所有者执行的一样。特别是,通过此类命令授予的权限似乎已由对象所有者授予。对于角色成员资格,成员资格似乎已由包含它的角色授予。
214
215 `GRANT`和`REVOKE`也可以由不是受影响对象的所有者完成,但要求是拥有该对象的角色的成员, 或者是拥有对该对象的`WITH GRANT OPTION`权限的角色的成员来完成。 在这种情况下,权限将被记录为已由实际拥有对象或拥有`WITH GRANT OPTION`权限的角色授予。
216
217 授予表权限不会自动将权限扩展到该表使用的任何序列,包括与`SERIAL`列绑定的序列。 序列的权限必须单独设置。
218
219 `GRANT`命令不能用于为协议`file`,`scfs`或`scfs`设置权限。 这些协议在PalopgMPP数据库内部实现。
220
221
222 使用`ssql`的`\dp`元命令来获取有关表和列的现有权限的信息。 还可以使用其他`\d`元命令来显示非表对象的权限。
223
224
225
226## 示例
227
228向表`mytable`上的所有角色授予插入权限:
229
230 ``` sql
231 GRANT INSERT ON mytable TO PUBLIC;
232 ```
233
234 将所有可用的权限授予在`topten`视图中的角色`sally`。 请注意,如果上述内容的确会由数据库管理员或`topten`的所有者执行,将会授予所有权限,当由其他人执行时,它只会授予那些授予角色具有授予选项的那些权限。
235
236 ``` sql
237 GRANT ALL PRIVILEGES ON topten TO sally;
238 ```
239
240 将角色`admins`的成员资格授予用户`joe`:
241
242 ``` sql
243 GRANT admins TO joe;
244 ```
245
246
247
248兼容性说明
249: `PRIVILEGES`关键字在SQL标准中是必需的,但在PalopgMPP数据库中是可选的。 SQL标准不支持为每个命令在多个对象上设置权限。
250
251 PalopgMPP数据库允许对象所有者撤消他们自己的普通权限:例如,表所有者可以通过撤消其自己的`INSERT`,`UPDATE`,`DELETE`和`TRUNCATE`权限使该表对自己只读。根据SQL标准,这是不可能的。 PalopgMPP数据库将所有者的权限视为由所有者授予了所有者;因此他们也可以撤销它们。在SQL标准中,所有者的权限由假定的*system*实体授予。
252
253 SQL标准为其他类型的对象提供`USAGE`权限:字符集,排序规则,翻译。
254
255 在SQL标准中,序列仅具有`USAGE`权限, 该权限控制`NEXT VALUE FOR`表达式的使用,该表达式等效于PalopgMPP数据库中的`nextval`函数。序列权限`SELECT`和`UPDATE`是PalopgMPP数据库扩展。对`currval`函数应用序列`USAGE`权限也是PalopgMPP数据库扩展(函数本身也是)。
256
257 数据库,表空间,模式和语言的权限是PalopgMPP数据库扩展。
258
259
260
261相关SQL命令
262: ` REVOKE ` ,`CREATE ROLE`, `ALTER ROLE`
评价此篇文章
