文档首页 > > 开发指南> SQL参考> SQL语法> GRANT

GRANT

分享
更新时间: 2019/11/12 GMT+08:00

功能描述

对角色和用户进行授权操作。

使用GRANT命令进行用户授权包括以下三种场景:

  • 将系统权限授权给角色或用户

    系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。

    系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。

  • 将数据库对象授权给角色或用户

    将数据库对象(表和视图、指定字段、数据库、函数、模式等)的相关权限授予特定角色或用户;

    GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。

    DWS会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC,而以下这些对象的权限会授予PUBLIC:数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型(包括域)的USAGE特权。当然,对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。另外,这些初始的默认权限可以使用ALTER DEFAULT PRIVILEGES命令修改。

  • 将角色或用户的权限授权给其他角色或用户

    将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。

    当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。

    数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以赋予或者撤销任何非系统管理员角色的权限。

注意事项

无。

为了权限的隔离,DWS禁用了WITH GRANT OPTION语法和TO PUBLIC语法。

语法格式

  • 将表或视图的访问权限赋予指定的用户或角色。不允许对表分区进行GRANT操作,对表分区进行GRANT操作会引起告警。
    GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES } [, ...] 
          | 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 { [ 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 ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
           | 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 { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
        ON LARGE OBJECT loid [, ...]
        TO { [ GROUP ] role_name | PUBLIC } [, ...]
        [ WITH GRANT OPTION ];

    本版本暂时不支持大对象。

  • 将子集群的访问权限赋予指定的用户或角色。普通用户不能执行针对Node Group的GRANT/REVOKE操作。
    GRANT { CREATE | USAGE | COMPUTE | ALL [ PRIVILEGES ] }
        ON NODE GROUP group_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 ];

    将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,若没有该权限,则只能看到这些对象的名字,并不能实际进行对象访问。

  • 将类型的访问权限赋予指定的用户或角色。
    GRANT { USAGE | ALL [ PRIVILEGES ] }
        ON TYPE type_name [, ...]
        TO { [ GROUP ] role_name | PUBLIC } [, ...]
        [ WITH GRANT OPTION ];

    本版本暂时不支持赋予类型的访问权限。

  • 将角色的权限赋予其他用户或角色的语法。
    GRANT role_name [, ...]
       TO role_name [, ...]
       [ WITH ADMIN OPTION ];
  • 将sysadmin权限赋予指定的角色。
    GRANT ALL { PRIVILEGES | PRIVILEGE }
       TO role_name;

参数说明

GRANT的权限分类如下所示。

  • SELECT

    允许对指定的表、视图、序列执行SELECT语句。

  • INSERT

    允许对指定的表执行INSERT语句。

  • UPDATE

    允许对声明的表中任意字段执行UPDATE语句。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。

  • DELETE

    允许执行DELETE语句删除指定表中的数据。

  • TRUNCATE

    允许执行TRUNCATE语句删除指定表中的所有记录。

  • REFERENCES

    创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。

  • CREATE
    • 对于数据库,允许在数据库里创建新的模式。
    • 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的CREATE权限。
    • 对于子集群,允许在子集群中创建表对象。
  • CONNECT

    允许用户连接到指定的数据库。

  • EXECUTE

    允许使用指定的函数,以及利用这些函数实现的操作符。

  • USAGE
    • 对于过程语言,允许用户在创建函数的时候指定过程语言。
    • 对于模式,USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名字。
    • 对于序列,USAGE允许使用nextval函数。
    • 对于子集群, 对包含在指定模式中的对象有访问权限时,USAGE允许访问指定子集群下的表对象。
  • COMPUTE

    针对计算子集群,允许用户在具有compute权限的计算子集群上进行弹性计算。

  • ALL PRIVILEGES

    一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行GRANT ALL PRIVILEGES。

GRANT的参数说明如下所示。

  • role_name

    已存在用户名称。

  • table_name

    已存在表名称。

  • column_name

    已存在字段名称。

  • schema_name

    已存在模式名称。

  • database_name

    已存在数据库名称。

  • funcation_name

    已存在函数名称。

  • sequence_name

    已存在序列名称。

  • domain_name

    已存在域类型名称。

  • fdw_name

    已存在外部数据包名称。

  • lang_name

    已存在语言名称。

  • type_name

    已存在类型名称。

  • group_name

    已存在的子集群名称。

  • argmode

    参数模式。

    取值范围:字符串,要符合标识符命名规范。

  • arg_name

    参数名称。

    取值范围:字符串,要符合标识符命名规范。

  • arg_type

    参数类型。

    取值范围:字符串,要符合标识符命名规范。

  • loid

    包含本页的大对象的标识符。

    取值范围:字符串,要符合标识符命名规范。

示例

示例:将系统权限授权给用户或者角色。

创建名为joe的用户,并将sysadmin权限授权给他。

CREATE USER joe PASSWORD 'Bigdata123@';
GRANT ALL PRIVILEGES TO joe;

授权成功后,用户joe会拥有sysadmin的所有权限。

示例:将对象权限授权给用户或者角色

  1. 撤销joe用户的sysadmin权限,然后将模式tpcds的使用权限和表tpcds.reason的所有权限授权给用户joe。
    REVOKE ALL PRIVILEGES FROM joe;
    GRANT USAGE ON SCHEMA tpcds TO joe;
    GRANT ALL PRIVILEGES ON tpcds.reason TO joe;

    授权成功后,joe用户就拥有了tpcds.reason表的所有权限,包括增删改查等权限。

  2. tpcds.reason表中r_reason_sk、r_reason_id、r_reason_desc列的查询权限,r_reason_desc的更新权限授权给joe。
    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的查询权限会立即生效。

    GRANT select (r_reason_sk, r_reason_id) ON tpcds.reason TO joe ;

    将数据库postgres的连接权限授权给用户joe,并给予其在postgres中创建schema的权限。

    GRANT create,connect on database postgres TO joe ;

    创建角色tpcds_manager,将模式tpcds的访问权限授权给角色tpcds_manager,并授予该角色在tpcds下创建对象的权限,不允许该角色中的用户将权限授权给其他人。

    CREATE ROLE tpcds_manager PASSWORD 'Bigdata123@';
    GRANT USAGE,CREATE ON SCHEMA tpcds TO tpcds_manager;

示例:将用户或者角色的权限授权给其他用户或角色。

  1. 创建角色manager,将joe的权限授权给manager,并允许该角色将权限授权给其他人。
    CREATE ROLE manager PASSWORD 'Bigdata123@';
    GRANT joe TO manager WITH ADMIN OPTION;
  2. 创建用户senior_manager,将用户manager的权限授权给该用户。
    CREATE ROLE senior_manager PASSWORD 'Bigdata123@';
    GRANT manager TO senior_manager;
  3. 撤销权限,并清理用户。
    REVOKE manager FROM joe;
    REVOKE senior_manager FROM manager;
    DROP USER manager;

示例:撤销上述授予的权限,并清理角色和用户。

REVOKE USAGE,CREATE ON SCHEMA tpcds FROM tpcds_manager;
DROP ROLE tpcds_manager;
DROP ROLE senior_manager;
DROP USER joe CASCADE;
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区