GRANT
功能描述及注意事项
对角色和用户进行授权操作。
使用GRANT命令进行用户授权包括以下三种场景:
权限分类
参数 |
描述 |
---|---|
SELECT |
允许对指定的表、视图、序列执行SELECT语句。 |
INSERT |
允许对指定的表执行INSERT语句。 |
UPDATE |
允许对声明的表中任意字段执行UPDATE语句。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。 |
DELETE |
允许执行DELETE语句删除指定表中的数据。 |
TRUNCATE |
允许执行TRUNCATE语句删除指定表中的所有记录。 |
REFERENCES |
创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。 |
TRIGGER |
创建一个触发器,必须拥有表或视图的TRIGGER权限。 |
ANALYZE | ANALYSE |
对表执行ANALYZE | ANALYSE操作来收集表的统计信息,必须拥有表的ANALYZE | ANALYSE权限。 |
CREATE |
|
CONNECT |
允许用户连接到指定的数据库。 |
TEMPORARY | TEMP |
允许在使用指定数据库时创建临时表。 |
EXECUTE |
允许使用指定的函数,以及利用这些函数实现的操作符。 |
USAGE |
|
COMPUTE |
针对计算子集群,允许用户在具有compute权限的计算子集群上进行弹性计算。 |
ALTER |
允许修改表、模式或函数。 |
DROP |
允许删除表、模式或函数。 |
VACUUM |
允许对表执行VACUUM。 |
ALL PRIVILEGES |
一次赋予指定用户/角色所有可赋予的权限。只有系统管理员有权执行GRANT ALL PRIVILEGES。 |
WITH GRANT OPTION |
如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。
|
WITH ADMIN OPTION |
指定权限是否允许转授。如果声明了WITH ADMIN OPTION,角色的成员又可以将角色的成员身份授予其他人。 |
语法格式
- 将表或视图的访问权限赋予指定的用户或角色。不允许对表分区进行GRANT操作,对表分区进行GRANT操作会引起告警。
1 2 3 4 5 6
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ANALYZE | ANALYSE | VACUUM | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
避免对同一张表或视图(包括ON TABLE和ON ALL TABLES IN SCHEMA)执行并发GRANT/REVOKE操作,或者对同一张表或视图同时执行GRANT/REVOKE操作和DDL操作,否则会出现类似报错“tuple concurrently updated.”。
- 将表中字段的访问权限赋予指定的用户或角色。
1 2 3 4 5
GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )} [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
- 将模式的访问权限赋予指定的用户或角色。
1 2 3 4
GRANT { { CREATE | USAGE | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,若没有该权限,则只能看到这些对象的名字,并不能实际进行对象访问。
- 将数据库的访问权限赋予指定的用户或角色。
1 2 3 4 5
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
- 将角色的权限赋予其他用户或角色的语法。
1 2 3
GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ];
- 将所有权限赋予指定的角色。
1 2
GRANT ALL { PRIVILEGES | PRIVILEGE } TO role_name;
- 将域的访问权限赋予指定的用户或角色。
1 2 3 4
GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
当前版本暂时不支持赋予域的访问权限。
- 将外部数据源的访问权限赋予给指定的用户或角色。
1 2 3 4
GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
- 将外部服务器的访问权限赋予给指定的用户或角色。
1 2 3 4
GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
- 将函数的访问权限赋予给指定的用户或角色。
1 2 3 4 5
GRANT { { EXECUTE | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
- 将过程语言的访问权限赋予给指定的用户或角色。
1 2 3 4
GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
当前版本暂时不支持过程语言。
- 将大对象的访问权限赋予指定的用户或角色。
1 2 3 4
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
当前版本暂时不支持大对象。
- 将序列的访问权限赋予指定的用户或角色。
1 2 3 4 5
GRANT { { SELECT | UPDATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCE sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
- 将子集群的访问权限赋予指定的用户或角色。普通用户不能执行针对Node Group的GRANT/REVOKE操作。
1 2 3 4
GRANT { CREATE | USAGE | COMPUTE | ALL [ PRIVILEGES ] } ON NODE GROUP group_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
- 将类型的访问权限赋予指定的用户或角色。
1 2 3 4
GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
当前版本暂时不支持赋予类型的访问权限。
参数说明
参数 |
描述 |
取值范围 |
||
---|---|---|---|---|
role_name |
已存在用户名称,可通过PG_USER视图查询用户列表。 |
字符串,要符合标识符命名规范。最多为63个字符。 |
||
table_name |
已存在表名称,可通过PG_TABLES查询表名称 |
字符串,长度不超过63个字符,以字母或下划线开头,可包含字母、数字、下划线、$、#。 |
||
column_name |
已存在字段名称,可通过以下语句查询表字段名称。
|
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
schema_name |
已存在模式名称,可通过PG_NAMESPACE系统表查询模式名称。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
database_name |
已存在数据库名称,可通过PG_DATABASE系统表查询数据库名称。 |
字符串,要符合标识符的命名规范:数据库名称是由大小写英文字母、数字、_和$组合而成,并且不能以数字和$开头。 |
||
function_name |
已存在函数名称,可通过PG_PROC系统表查询函数名称。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
sequence_name |
已存在序列名称,可通PG_SEQUENCES系统视图(仅9.1.0及以上集群支持)查询序列名称。 |
字符串,仅可以使用小写字母(a~z)、 大写字母(A~Z),数字和特殊字符"#","_","$"的组合。 |
||
domain_name |
已存在域类型名称。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
fdw_name |
已存在外部数据包名称。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
lang_name |
已存在语言名称。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
type_name |
已存在类型名称。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
group_name |
已存在的子集群名称。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
argmode |
函数的参数模式。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
arg_name |
函数的参数名称。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
arg_type |
函数的参数类型。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
||
loid |
包含本页的大对象的标识符。 |
字符串,要符合标识符命名规范。详情请参见标识符命名规范。 |
示例
- 将系统权限授权给用户或者角色。
- 将sysadmin所有可用权限授权给joe用户:
1
GRANT ALL PRIVILEGES TO joe;
授权成功后,用户joe会拥有sysadmin的所有权限。
- 将sysadmin所有可用权限授权给joe用户:
- 将对象权限授权给用户或者角色。
- 将表tpcds.reason的SELECT权限授权给用户joe:
1
GRANT SELECT ON TABLE tpcds.reason TO joe;
- 将表tpcds.reason的所有权限授权给用户kim:
1
GRANT ALL PRIVILEGES ON tpcds.reason TO kim;
授权成功后,kim用户就拥有了tpcds.reason表的所有权限,包括增删改查等权限。
- 将模式tpcds的使用权限授权给用户joe:
1
GRANT USAGE ON SCHEMA tpcds TO joe;
授权成功后,joe用户就拥有了模式schema的USAGE权限,允许访问包含在指定模式schema中的对象。
- 将tpcds.reason表中r_reason_sk、r_reason_id、r_reason_desc列的查询权限,r_reason_desc的更新权限授权给joe:
1
GRANT select (r_reason_sk,r_reason_id,r_reason_desc),update (r_reason_desc) ON tpcds.reason TO joe;
授权成功后,用户joe对tpcds.reason表中r_reason_sk,r_reason_id的查询权限会立即生效。
1
GRANT select (r_reason_sk, r_reason_id) ON tpcds.reason TO joe ;
- 将函数func_add_sql的EXECUTE权限授权给用户joe。
1 2 3 4 5 6
CREATE FUNCTION func_add_sql(f1 integer,f2 integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; GRANT EXECUTE ON FUNCTION func_add_sql(integer, integer) TO joe;
- 将序列serial的UPDATE权限授权给joe用户。
1
GRANT UPDATE ON SEQUENCE serial TO joe;
- 将数据库gaussdb的连接权限授权给用户joe,并给予其在gaussdb中创建schema的权限:
1
GRANT create,connect on database gaussdb TO joe ;
- 将模式tpcds的访问权限授权给角色tpcds_manager,并授予该角色在tpcds下创建对象的权限,不允许该角色中的用户将权限授权给其他人:
1
GRANT USAGE,CREATE ON SCHEMA tpcds TO tpcds_manager;
- 将表tpcds.reason的SELECT权限授权给用户joe:
- 将用户或者角色的权限授权给其他用户或角色。
- 将用户joe的权限授权给用户manager,并允许该角色将权限授权给其他人:
1
GRANT joe TO manager WITH ADMIN OPTION;
- 将用户manager的权限授权给senior_manager用户:
1
GRANT manager TO senior_manager;
- 将用户joe的权限授权给用户manager,并允许该角色将权限授权给其他人:
常见问题
- 如何给DWS指定用户赋予某张表的权限
- 如何给DWS指定用户赋予某个SCHEMA的权限
- 如何创建DWS数据库只读用户
- 如何查看DWS某个用户有哪些表的权限
- 将Schema中的表的查询权限赋给其他用户,赋权后仍无法查询Schema中的表
- 某张表执行过grant select on table t1 to public,如何针对某用户回收权限
- 普通用户创建或删除GDS/OBS外表语句时报错,提示没有权限或权限不足
- 赋予用户schema的all权限后建表仍然报错ERROR: current user does not have privilege to role tom
- 执行语句过程中报错:无权限操作