账号和权限管理函数

本文介绍Hologres支持的账号和权限管理函数。

类型

函数

功能

账号管理函数

HG_DISPLAY_NAME_TO_ID

将邮箱形式或RAM形式的阿里云账号转换为阿里云账号ID。

USER_DISPLAY_NAME

将阿里云账号ID转换为邮箱形式或RAM形式的阿里云账号。

授权函数

APPLY_PRIVILEGES

用于在专家权限模型下,将源表给用户授予的权限复制到目标表,目标表保持与源表一致的权限。

权限查询函数

HAS_ANY_COLUMN_PRIVILEGE

确认当前用户或指定用户是否有指定表的任意列的特定权限。

HAS_COLUMN_PRIVILEGE

确认当前用户是否有指定列的特定权限。

HAS_DATABASE_PRIVILEGE

确认当前用户或指定用户是否有指定数据库的特定权限。

HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE

确认当前用户或指定用户是否有外部数据包装器的特定权限。

HAS_FUNCTION_PRIVILEGE

确认当前用户或指定用户是否有指定函数的特定权限。

HAS_LANGUAGE_PRIVILEGE

确认当前用户或指定用户是否有指定语言的特定权限。

HAS_SCHEMA_PRIVILEGE

确认当前用户或指定用户是否有指定的Schema的特定权限。

HAS_SERVER_PRIVILEGE

确认当前用户或指定用户是否有指定外部服务器的特定权限。

HAS_TABLE_PRIVILEGE

确认当前用户或指定用户是否有指定表的特定权限。

HAS_TABLESPACE_PRIVILEGE

确认当前用户或指定用户是否有指定表空间的特定权限。

HAS_TYPE_PRIVILEGE

确认当前用户或指定用户是否有特定类型(‌如表、‌视图、‌序列等)‌的特定权限。

账号管理函数

USER_DISPLAY_NAME

  • 描述:将阿里云账号ID转换为邮箱形式或RAM形式的阿里云账号。

    SELECT USER_DISPLAY_NAME (user_name);
  • 参数说明

    user_name:必填,阿里云账号ID。通常为数字形式,例如13532241323xxx或RAM用户p4_23402030200xxx

  • 返回值说明

    返回值为邮箱形式或RAM形式的阿里云账号,例如xx@aliyun.comRAM$mainaccount:subuserRAM$public

  • 示例

    --将指定账号转换为邮箱形式或RAM形式的阿里云账号
    SELECT USER_DISPLAY_NAME ('13532241323xxx');

HG_DISPLAY_NAME_TO_ID

  • 描述:将邮箱形式或RAM形式的阿里云账号转换为阿里云账号ID。

    SELECT HG_DISPLAY_NAME_TO_ID (aliyun_id);
  • 参数说明

    aliyun_id:必填,阿里云账号。通常为邮箱形式或RAM形式,例如xx@aliyun.comRAM$mainaccount:subuserRAM$public

  • 返回值说明

    返回值为阿里云账号ID,通常为数字形式,例如13532241323xxxp4_23402030200xxx

  • 示例

    SELECT HG_DISPLAY_NAME_TO_ID ('RAM$main:subuser');

授权函数

APPLY_PRIVILEGES

  • 描述:用于在专家权限模型下,将源表给用户授予的权限复制到目标表,目标表保持与源表一致的权限。

    -- 将源表的权限复制给目标表,并且不回收目标表的权限,即不删除目标表之前具有的权限规则
    CALL APPLY_PRIVILEGES('<old_table>','<new_table>', false);
    
    
    -- 将源表的权限复制给目标表,并且回收目标表的权限,即删除目标表之前具有的权限规则
    CALL APPLY_PRIVILEGES('<old_table>','<new_table>');
    说明

    专家权限模型下,当使用CREATE TABLE LIKEINSERT OVERWRITE 、自动分区等创建新表时,新表的权限还需要重新再授予给用户,通过APPLY_PRIVILEGES函数可以复制源表的所有用户权限至新表,简化授权操作。

  • 使用限制

    • 仅Hologres V1.1.48及以上版本支持APPLY_PRIVILEGES函数,如果您的实例是V1.1.48以下版本,请您使用自助升级或加入Hologres钉钉交流群反馈,详情请参见如何获取更多的在线支持?

    • 需要数据库开启专家权限模型,如果您开启的是SPM或者SLPM请转换为专家权限模型,详情请参见权限模型转换

    • 调用函数需要具有目标表的GRANT、REVOKE权限。

    • APPLY_PRIVILEGES的目标表是分区表时,只对父表复制权限,不影响子表访问控制权限。

  • 参数说明

    • old_table:必填,源表名称,即被复制权限的表名称。

    • new_table:必填,目标表名称,即获得权限的表名称。

  • 示例

    -- 将test_table1 ACL授权信息、owner信息应用到test_table2上, false代表不对test_table2之前具有的权限规则进行删除
    CALL APPLY_PRIVILEGES('test_table1','test_table2', false);
    
    -- 将test_table1 ACL授权信息、owner信息应用到test_table2上,对test_table2之前具有的权限规则进行删除,保持两表的权限完全一致
    CALL APPLY_PRIVILEGES('test_table1','test_table2');

权限查询函数

示例数据

权限查询函数相关的示例均基于test示例数据。以下是创建表test并添加数据的命令示例。

CREATE TABLE test (
    a INT
);
INSERT INTO test (a) VALUES (1);
INSERT INTO test (a) VALUES (2);
INSERT INTO test (a) VALUES (3);

HAS_ANY_COLUMN_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有指定表的任意列的特定权限。

    HAS_ANY_COLUMN_PRIVILEGE([user, ]table, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • table:必填,表名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:SELECT、INSERT、UPDATE、REFERENCES。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有访问表任何列的权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_ANY_COLUMN_PRIVILEGE('139699392458****', 'test' , 'SELECT,INSERT,UPDATE,REFERENCES');

    返回结果如下。

     has_any_column_privilege
    --------------------------
     t

HAS_COLUMN_PRIVILEGE

  • 描述:确认当前用户是否有指定列的特定权限。

    HAS_COLUMN_PRIVILEGE(table, column, privilege)
  • 参数说明

    • table:必填,表名称。

    • column:必填,列名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:SELECT、INSERT、UPDATE、REFERENCES。

  • 返回值说明

    返回BOOLEAN类型,若当前用户有访问列的权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_COLUMN_PRIVILEGE('test' , 'a', 'SELECT,INSERT,UPDATE,REFERENCES');

    返回结果如下。

     has_column_privilege
    ----------------------
     t

HAS_DATABASE_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有指定数据库的特定权限。

    HAS_DATABASE_PRIVILEGE([user, ]database, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • database:必填,数据库名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值如下:CREATE、TEMPORARY、TEMP。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有指定数据库的权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_DATABASE_PRIVILEGE('glz', 'CREATE,TEMPORARY,TEMP');---替换为自己创建的数据库名称

    返回结果如下。

     has_database_privilege
    ------------------------
     t

HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有外部数据包装器的特定权限。

    HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE([user, ]fdw, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • fdw:必填,外部数据封装器名字或ID。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:USAGE。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有外部数据包装器的权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE('dlf_fdw', 'USAGE');--将dlf_fdw替换为自己已创建外部数据封装器。

    返回结果如下。

     has_foreign_data_wrapper_privilege
    ------------------------------------
     t

HAS_FUNCTION_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有指定函数的特定权限。

    has_function_privilege([user, ]function, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • function:必填,函数名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:EXECUTE。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有指定函数的操作权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT has_function_privilege('now()', 'EXECUTE');

    返回结果如下。

     has_function_privilege
    ------------------------
     t

HAS_LANGUAGE_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有指定语言的特定权限。

    HAS_LANGUAGE_PRIVILEGE([user, ]language, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • language:必填,语言名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:USAGE。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有语言权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_LANGUAGE_PRIVILEGE('plpgsql', 'USAGE');

    返回结果如下。

     has_language_privilege
    ------------------------
     t

HAS_SCHEMA_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有指定的Schema的特定权限。

    HAS_SCHEMA_PRIVILEGE([user, ]schema, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • schema:必填,Schema名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:CREATE、USAGE。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有指定的Schema权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_SCHEMA_PRIVILEGE('public', 'CREATE,USAGE');

    返回结果如下。

     has_schema_privilege
    ----------------------
     t

HAS_SERVER_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有指定外部服务器的特定权限。

    HAS_SERVER_PRIVILEGE([user, ]server, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • server:必填,外部服务器名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:USAGE。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有外部服务器的权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_SERVER_PRIVILEGE('meta_warehouse_server', 'USAGE');

    返回结果如下。

     has_server_privilege
    ----------------------
     t

HAS_TABLE_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有指定表的特定权限。

    HAS_TABLE_PRIVILEGE([user, ]table, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • table:必填,表名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:SELECT、INSERT、UPDATE、DELETE、TRUNCATE。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有指定表的操作权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_TABLE_PRIVILEGE('test', 'SELECT,INSERT');

    返回结果如下。

     has_table_privilege
    ---------------------
     t

HAS_TABLESPACE_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有指定表空间的特定权限。

    HAS_TABLESPACE_PRIVILEGE([user, ]tablespace, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • tablespace:必填,表空间名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。取值为:CREATE。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有表空间权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_TABLESPACE_PRIVILEGE('pg_default', 'CREATE');

    返回结果如下。

     has_table_privilege
    ---------------------
     t

HAS_TYPE_PRIVILEGE

  • 描述:确认当前用户或指定用户是否有特定类型(‌如表、‌视图、‌序列等)‌的特定权限。

    HAS_TYPE_PRIVILEGE([user, ]type, privilege)
  • 参数说明

    • user:可选,账号名称或账号ID。

    • type:必填,类型名称。

    • privilege:必填,权限类型,也可以用逗号分隔列出的多个权限类型。

  • 返回值说明

    返回BOOLEAN类型,若当前用户或指定用户有特定类型(‌如表、‌视图、‌序列等)‌的权限,则返回true(t);反之返回false(f)。

  • 示例

    SELECT HAS_TYPE_PRIVILEGE('test', 'USAGE');

    返回结果如下。

     has_type_privilege
    --------------------
     t