专家权限模型

Hologres兼容PostgreSQL,采用与标准PostgreSQL语句相同的授权体系(简称专家模式)。本文为您介绍Hologres如何使用专家权限模型对用户授权及撤销授权。

专家权限模型授权

在Hologres实例连接开发工具后,可以使用SQL语句通过专家权限模型授权,使该用户具有实例的相关权限。

  1. 创建用户。

    一个账号必须先被创建成为Hologres的用户,才能访问Hologres并进行开发。

    创建用户的语句格式如下:

    --创建具有登录Hologres实例权限的用户,如果是为RAM用户授权,账号格式请使用RAM用户的表达格式。
    CREATE USER "云账号ID/云邮箱"; 
    --创建用户并授予Superuser权限。
    CREATE USER "云账号ID/云邮箱" SUPERUSER;

    您可以参照如下示例创建用户,其中更多关于阿里云账号和RAM用户的格式说明,请参见账号概述

    --使用阿里云账号ID创建用户。
    CREATE USER "11822780xxx";
    --授予RAM用户Superuser权限。
    CREATE USER "p4_1822780xxx" SUPERUSER; 

    更多关于创建角色的说明,请参见CREATE ROLE

  2. 授予权限。

    将账号创建为Hologres的用户后,您需要授予用户一定的权限,该用户才能在权限范围内使用Hologres。在专家权限模型下可以控制用户在数据库、表、视图、列级别的权限。Hologres中常用的授权操作如下表所示。

    说明

    目前专家模式只能对现有实例对象进行授权,对授权后创建的内容不生效。例如,用户A对用户B授予了public schema中所有表的查看权限。当用户A创建一张新表,则用户B不具有对这张表的查看权限,需要重新授权。

    权限描述

    语法示例

    是否必须

    创建具有登录Hologres实例权限的用户

    CREATE USER "云账号/云邮箱";

    创建用户并授予用户Superuser的权限

    CREATE USER "云账号/云邮箱" SUPERUSER ;

    可选

    授予在Schema下创建表的权限

    GRANT CREATE ON SCHEMA schema_name  TO "云账号/云邮箱";

    可选

    授予Schema访问权限

    GRANT USAGE ON SCHEMA schema_name  TO "云账号/云邮箱";

    必须

    说明

    必须授予Schema的访问权限才能有表的查询权限。

    授予所有用户public schema中所有表的查看、写入、及修改权限

    GRANT SELECT,INSERT,UPDATE ON ALL TABLES IN SCHEMA public to PUBLIC;

    可选

    授予用户某个表的SELECT权限

    GRANT SELECT ON TABLE <tablename> TO "云账号/云邮箱";

    可选

    授予用户某个表的SELECT权限,并允许该用户授予此权限给其他用户

    GRANT SELECT ON TABLE <tablename> TO "云账号/云邮箱" WITH GRANT OPTION;

    可选

    授予用户public schema中所有表的SELECT权限

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO "云账号/云邮箱";

    可选

    设置当前授权人在publicSchema下创建的未来表对所有人可读。

    ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;

    可选

    修改普通用户为Superuser

    ALTER USER "云账号/云邮箱" SUPERUSER;

    可选

    修改Superuser为普通用户

    ALTER USER "云账号/云邮箱" NOSUPERUSER;

    可选

    授予其他用户表的Owner权限

    ALTER TABLE <tablename> OWNER TO "云账号/云邮箱";

    可选

    创建没有登录Hologres实例权限的角色

    CREATE ROLE "云账号/云邮箱";

    可选

    授予某个用户某个角色的权限

    GRANT <rolename> TO "云账号/云邮箱" ;

    可选

    授予某个用户某个表的某些列的查询权限

    GRANT SELECT (<column1>,<column2>,<column3>,...) ON TABLE <tablename> TO "云账号/云邮箱" ;

    可选

    授予某个用户某个视图的查询权限

    说明
    • 专家权限模型下访问视图需要授予视图的查询权限。

    • SPM/SLPM权限模型下访问视图需要有viewer及以上用户组的权限。

    --专家权限模型给某个用户授予view的查询权限 
    GRANT SELECT ON <viewname> TO "云账号/云邮箱" ;

    可选

    在专家模型下,您可以参照以下示例给一个新用户授予某张表的查询权限。

    CREATE USER "云账号/云邮箱";
    GRANT USAGE ON SCHEMA <schema_name>  TO "云账号/云邮箱";
    GRANT SELECT ON TABLE <tablename> TO "云账号/云邮箱";

    CREATE ROLE用于创建没有登录Hologres实例权限的角色,例如代表一类具体用户的用户组或虚拟角色等。更多关于权限的授予的说明,请参见GRANT

  3. 删除表。

    只有Superuser或表Owner才可以删除表。您可以使用如下几种方法授予某个用户或多个用户删除表的权限:

    • 替换新用户为表的Owner。

      ALTER TABLE TABLENAME OWNER TO "云账号/云邮箱";
    • 授予新用户Superuser权限。

      ALTER USER "云账号/云邮箱" SUPERUSER;
    • 添加多个用户至用户组并授予表Owner权限。

      CREATE USER "云账号ID/云邮箱";
      CREATE ROLE <rolename>;
      GRANT <rolename> TO "云账号/云邮箱";
      ALTER TABLE <tablename> OWNER TO <rolename>;

未来表授权

由于专家模式授权不包含对未来表的授权,因此需要使用ALTER DEFAULT PRIVILEGES语句对未来表进行授权。具体操作步骤如下:

说明
  • 该命令语句不影响已有的逻辑对象。

  • 该命令语句只能设置TABLE、SCHEMA、FUNCTION、SEQUENCE或TYPE的默认权限。

  1. 授权。

    • 默认执行授权语句的人,在某个Schema下新建的表对所有人或指定人进行查询。示例语句如下。

      • 执行授权的人在public schema下,新建的表可以被子账号p4_123xxx查询。

        ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO "p4_123xxx";
      • 执行授权的人在test schema下,新建的表可以被子账号p4_123xxx查询。

        ALTER DEFAULT PRIVILEGES IN SCHEMA test GRANT SELECT ON TABLES TO "p4_123xxx";
      • 执行授权的人在public schema下,新建的表可以被所有人查询。

        ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;
    • 默认授权后,其他人新建表时可被指定所有人或指定人进行查询。示例语句如下。

      • 授权后,p4_id1新建的表可以被public schema下的所有用户访问。

        ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;
      • 授权后,p4_id1新建的表可以被public schema下的子账号p4_id2访问。

        ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO "p4_id2";
      • 授权后,p4_id1新建的表可以被test schema下的所有用户访问。

        ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA test GRANT SELECT ON TABLES TO PUBLIC;
    • 撤销设置的默认授权,有的场景您需要撤销您设置的默认授权,示例语句如下。

      --撤销执行授权的人在public schema下未来新建的表可以被子账号p4_123xxx查询的默认授权
      ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM "p4_123xxx";
      
      --撤销执行授权的人在test schema下未来新建的表可以被子账号p4_123xxx查询的默认授权
      ALTER DEFAULT PRIVILEGES IN SCHEMA test REVOKE SELECT ON TABLES FROM "p4_123xxx";
      
      --撤销执行授权的人在public schema下未来新建的表可以被所有人查询的默认授权
      ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM PUBLIC;
  2. 查看默认权限是否设置成功。

    • 使用\ddp命令在Psql客户端查看ALTER DEFAULT PRIVILEGES是否设置成功。

    • 使用如下SQL命令在Hologres中直接查询。

      SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS "Owner",
        n.nspname AS "Schema",
        CASE d.defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'function' WHEN 'T' THEN 'type' WHEN 'n' THEN 'schema' END AS "Type",
        pg_catalog.array_to_string(d.defaclacl, E'\n') AS "Access privileges"
      FROM pg_catalog.pg_default_acl d
           LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace
      ORDER BY 1, 2, 3;

    创建新表时,Hologres会使用当前用户和模式去匹配系统表pg_catalog.pg_default_acl。如果检查到匹配项ALTER DEFAULT PRIVILEGES,则为用户添加匹配项规则。当前用户说明如下:

    • 如果当前用户是User,则创建表时使用User进行匹配。

    • 如果用户User创建表之前执行了SET SESSION ROLE GROUP1;语句,此时当前用户就变为GROUP1,则创建表时使用GROUP1进行匹配。

    匹配规则只在创建表时执行,在创建表之后执行ALTER TABLE SET OWNER TO语句修改表Owner,不会触发对应匹配项规则。

专家模式撤销授权

使用REVOKE语句撤销用户权限的示例如下,更多关于权限的撤销操作,请参见REVOKE

REVOKE SELECT ON TABLE tablename FROM "云账号ID/云邮箱" ; --如果是RAM用户,账号格式请使用RAM用户的表达格式。

查看权限

通过以下SQL命令查看用户的角色及权限。

SELECT ROLNAME FROM pg_roles;
SELECT user_display_name(ROLNAME) FROM pg_roles;

删除用户

若您的实例已经连接开发工具,您可以使用SQL语句进行删除子账号,分为如下两种情况。

  • 删除普通用户

    如果是删除普通用户,并且该账号没有创建其他对象(如表、视图、extension等),可以执行以下命令语句或者直接在HoloWeb删除用户。

    drop user "云账号ID/云邮箱";
  • 删除Superuser等管理员

    若是要删除Superuser、Admin等管理员,但是该账号创建过表、视图、extension等实例内对象,并且是这些对象的管理员(尤其是专家权限模型下),若是直接删除用户会报错,需要先将该账号下的对象进行转移,执行以下命令语句。

    -- 将A账号下的对象转给B
    reassign owned by "A云账号ID" to "B云账号ID";     
    -- 删除A账号
    drop user "A云账号ID";

您可以使用以下方式删除实例中的RAM用户:

DROP USER "云账号ID/云邮箱";
重要

RAM用户被删除后,将不能连接实例并访问实例内的任何对象,请您谨慎操作。

标准的PostgreSQL对于权限有着非常严格的划分,对此我们提供最佳实践供您根据业务需求选择和参考,详情请参见基于PostgreSQL标准权限模型授权