Hologres兼容PostgreSQL,采用与标准PostgreSQL语句相同的授权体系(简称专家模式)。本文为您介绍Hologres如何使用专家权限模型对用户授权及撤销授权。
专家权限模型授权
在Hologres实例连接开发工具后,可以使用SQL语句通过专家权限模型授权,使该用户具有实例的相关权限。
- 创建用户。 - 一个账号必须先被创建成为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。 
- 授予权限。 - 将账号创建为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。 
- 删除表。 - 只有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的默认权限。 
- 授权。 - 默认授权后,某个用户在某个Schema下未来新建的表可以被指定的用户或所有用户查询。示例语句如下。 - 授权后,用户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;
 
- 若需要撤销已设置的默认授权,您可以使用以下SQL。 - 撤销用户p4_id1在public schema未来新建的表可以被所有用户查询的默认授权。 - ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public REVOKE SELECT ON TABLES FROM PUBLIC;
- 撤销用户p4_id1在public schema未来新建的表可以被用户p4_id2查询的默认授权。 - ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public REVOKE SELECT ON TABLES FROM "p4_id2";
- 撤销用户p4_id1在test schema未来新建的表可以被所有用户查询的默认授权。 - ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA test REVOKE SELECT ON TABLES FROM PUBLIC;
 
 
- 查看默认权限是否设置成功。 - 使用\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用户的表达格式。系统表权限
从Hologres V3.0版本起,在Postgres中,当用户连接上DB时,可通过pg_class、pg_attribute和pg_namespace这三张系统表查看实例中的所有Schema、Table的信息。尤其是当使用BI工具、开发工具连接时,会自动通过这三张系统表获取Schema list、Table list和Table column的信息,无论该用户是否有表的访问权限,都能通过系统表获取元数据信息。针对该场景,从Hologres V3.0.23版本开始,pg_class、pg_attribute、pg_namespace这三张系统表支持行级权限,使得只有访问权限的用户才能看到对应的元数据信息。通过如下GUC开启行级权限:
- 该GUC仅控制pg_class、pg_attribute、pg_namespace 这三张系统表。 
- 需要使用Superuser设置,一个DB执行一次。 
- 设置完成后,仅Superuser、有对象(Table/Schema) Owner 权限、有对象(Table/Schema)的任意 Privilege权限的用户可以看到对应的元数据,其余用户没有权限查看。 
--Superuser 设置
ALTER DATABASE <database_name> SET hg_experimental_enable_catalog_rls = on;关于系统表介绍详情,请参见系统表。
查看权限
通过以下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标准权限模型授权。