这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

数据库角色

角色是可以向一个或多个用户或其他角色授予的权限集。角色可帮助您授予和管理不同类别用户的权限集,而不是将这些权限单独授予每个用户。

例如,多个用户可能需要管理权限。您可以按如下方式向他们授予这些权限:

  1. 使用 CREATE ROLE创建管理员角色:

    CREATE ROLE administrator;
    
  2. 为适当的用户授予角色

  3. 使用一个或多个 GRANT 语句向此角色授予适当的权限。您可以在以后根据需要添加和移除权限。角色权限的更改会自动传播给拥有该角色的用户。

为用户分配角色后,他们可以亲自启用这些角色,您也可以为他们自动启用角色。

1 - 预定义的数据库角色

Vertica 具有以下预定义角色:

自动授予角色

安装时,Vertica 会自动按如下方式授予和启用预定义角色:

  • 将 DBADMIN、PSEUDOSUPERUSER 和 DBDUSER 角色不可撤销地授予 dbadmin 用户。这些角色始终会针对 dbadmin 启用,并且永远无法删除。

  • 在创建时将 PUBLIC 授予 dbadmin 以及所有其他用户。此角色始终处于启用状态,并且无法删除或撤销。

授予预定义角色

安装后,dbadmin 用户和具有 PSEUDOSUPERUSER 角色的用户可以将一个或多个预定义角色授予任何用户或非预定义角色。例如,以下一组语句创建 userdba 角色并向它授予预定义角色 DBADMIN:

=> CREATE ROLE userdba;
CREATE ROLE
=> GRANT DBADMIN TO userdba WITH ADMIN OPTION;
GRANT ROLE

如果原始 授权(角色) 语句包含 WITH ADMIN OPTION,则被授予预定义角色的用户和角色可以将该角色授予其他用户。有一个例外:如果您向某个用户授予 PSEUDOSUPERUSER 角色并省略 WITH ADMIN OPTION,则被授予者可以将任何角色(包括所有预定义角色)授予其他用户。

例如,userdba 角色以前被授予 DBADMIN 角色。因为 GRANT 语句包含 WITH ADMIN OPTION,所以被分配 userdba 角色的用户可以将 DBADMIN 角色授予其他用户:

=> GRANT userdba TO fred;
GRANT ROLE
=> \c - fred
You are now connected as user "fred".
=> SET ROLE userdba;
SET
=> GRANT dbadmin TO alice;
GRANT ROLE

修改预定义角色

您可以向除 SYSMONITOR 以外的预定义角色授予对单个数据库对象(例如表或架构)的权限。例如:

=> CREATE SCHEMA s1;
CREATE SCHEMA
=> GRANT ALL ON SCHEMA s1 to PUBLIC;
GRANT PRIVILEGE

您可以向 PUBLIC 授予任何角色,包括预定义角色。例如:


=> CREATE ROLE r1;
CREATE ROLE
=> GRANT r1 TO PUBLIC;
GRANT ROLE

对于任何其他预定义角色,不能通过向其授予其他角色来修改它。尝试这样做会导致回退错误:

=> CREATE ROLE r2;
CREATE ROLE
=> GRANT r2 TO PSEUDOSUPERUSER;
ROLLBACK 2347:  Cannot alter predefined role "pseudosuperuser"

1.1 - DBADMIN

DBADMIN 角色是在安装数据库时分配给 dbadmin 用户的预定义角色。安装后,dbadmin 用户和具有 PSEUDOSUPERUSER 角色的用户可以将任何角色授予任何用户或非预定义角色。

例如,超级用户 dbadmin 创建角色 fred 并向 fred 授予 DBADMIN 角色:

=> CREATE USER fred;
CREATE USER
=> GRANT DBADMIN TO fred WITH ADMIN OPTION;
GRANT ROLE

在用户 fred 启用DBADMIN role 后,他可以通过创建用户 alice 来行使他的 DBADMIN 权限。因为 GRANT 语句包含 WITH ADMIN OPTION,所以 fred 也可以将 DBADMIN 角色授予用户 alice


=> \c - fred
You are now connected as user "fred".
=> SET ROLE dbadmin;
SET
CREATE USER alice;
CREATE USER
=> GRANT DBADMIN TO alice;
GRANT ROLE

DBADMIN 权限

下表列出了 DBADMIN 角色支持的权限:

  • 创建用户和角色,并向他们授予角色和权限

  • 创建和删除架构

  • 查看所有系统表

  • 查看和终止用户会话

  • 访问任意用户创建的所有数据

1.2 - PSEUDOSUPERUSER

PSEUDOSUPERUSER 角色是在安装数据库时自动分配给 dbadmin 用户的预定义角色。dbadmin 可以将此角色授予任何用户角色或非预定义角色。此后,PSEUDOSUPERUSER 用户可以将任何角色(包括预定义角色)授予其他用户。

PSEUDOSUPERUSER 权限

具有 PSEUDOSUPERUSER 角色的用户有权履行管理权限(无法撤销)。角色权限包括:

  • 绕过所有 GRANT/REVOKE 身份验证

  • 创建架构和表

  • 创建用户和角色,并向他们授予权限

  • 修改用户帐户,例如,设置用户帐户的密码、锁定/解锁帐户。

  • 创建或删除 UDF 库和函数,或任何外部过程

1.3 - DBDUSER

DBDUSER 角色是在安装数据库时分配给 dbadmin 用户的预定义角色。dbadmin 和任何 PSEUDOSUPERUSER 可以将此角色授予任何用户或非预定义角色。拥有此角色并启用它的用户可以从命令行调用 Database Designer 函数

将 DBDUSER 与资源池相关联

确保将资源池与 DBDUSER 角色相关联,以方便在运行 Database Designer 时进行资源管理。多个用户可以同时运行 Database Designer,他们互相之间不会出现干扰,也不会用尽群集的所有资源。当您以编程方式或使用管理工具运行 Database Designer 时,设计执行操作通常会限制在该用户的资源池内,但不太密集的任务可能会溢出到系统资源池。

1.4 - SYSMONITOR

除了作为 DBADMIN 用户维护 Vertica 以外,组织的数据库管理员可能还有许多责任。在本例中,DBADMIN 可能希望将一些 Vertica 管理任务委托给其他 Vertica 用户。

DBADMIN 可以将任务委托给 SYSMONITOR 角色,为其授予对系统表的访问权限,而不必授予完整的 DBADMIN 访问权限。

SYSMONITOR 角色提供以下权限。

  • 查看所有标记为可监控的系统表。通过发出以下语句,您可以查看所有可监控表的列表:

    => select * from system_tables where is_monitorable='t';

  • 如果在将 SYSMONITOR 授予用户或角色时包含 WITH ADMIN OPTION,则该用户或角色可以将 SYSMONITOR 权限授予其他用户和角色。

授予 SYSMONITOR 角色

若要为用户或角色授予 SYSMONITOR 角色,您必须是以下身份之一:

  • DBADMIN 用户

  • 已分配有 SYSMONITOR 且具有 ADMIN OPTION 的用户

使用 GRANT(角色) SQL 语句为用户分配 SYSMONITOR 角色。以下示例将展示如何为 user1 授予 SYSMONITOR 角色,并通过使用 WITH ADMIN OPTION 参数包含管理权限。ADMIN OPTION 将为 SYSMONITOR 角色授予管理权限。 => GRANT SYSMONITOR TO user1 WITH ADMIN OPTION; 以下示例将展示如何为 user1 撤销 SYSMONITOR 角色的 ADMIN OPTION 权限。 => REVOKE ADMIN OPTION for SYSMONITOR FROM user1; 使用 CASCADE 为所有分配有 SYSMONITOR 角色的用户撤销 ADMIN OPTION 权限。 => REVOKE ADMIN OPTION for SYSMONITOR FROM PUBLIC CASCADE;

示例

以下示例将展示如何:

  • 创建用户

  • 创建角色

  • 为新角色授予 SYSMONITOR 权限

  • 为用户授予角色

=> CREATE USER user1; => CREATE ROLE monitor; => GRANT SYSMONITOR to monitor; => GRANT monitor to user1;

分配 SYSMONITOR 权限

以下示例将使用“授予 SYSMONITOR 角色”示例中创建的用户和角色来说明如何:

  • 创建名为 personal_data 的表

  • 以 user1 身份登录

  • 为 user1 授予 monitor 角色。(您已在“授予 SYSMONITOR 角色”示例中为 monitor 授予了 SYSMONITOR 权限。)

  • 以 user1 身份运行 SELECT 语句

操作结果取决于已授予 user1 的权限。 => CREATE TABLE personal_data (SSN varchar (256));=> \c -user1;user1=> SET ROLE monitor;user1=> SELECT COUNT(*) FROM TABLES;COUNT ------- 1 (1 row) 由于您已分配了 SYSMONITOR 角色,因此 user1 可以看到 Tables 系统表中行的数量。在这个简单的示例中,数据库中只有一个表 (personal_data),因此 SELECT COUNT 返回一行。在实际情况中,SYSMONITOR 角色将看到数据库中的所有表。

检查 SYSMONITOR 能否访问表

使用下列命令检查分配有 SYSMONITOR 角色的用户是否可以访问系统表: => select table_name, is_monitorable from system_tables where table_name='<table_name>'; 示例

以下示例将检查 SYSMONITOR 是否可以访问 current_session 系统表: => select table_name,is_monitorable from system_tables where table_name='current_session';table_name | is_monitorable -------------------------------- current_session | t Is_monitorable 列中的 t 表示 SYSMONITOR 可以访问 current_session 系统表。

1.5 - UDXDEVELOPER

UDXDEVELOPER 角色是允许用户创建和替换用户所定义库的预定义角色。dbadmin 可以将此角色授予任何用户角色或非预定义角色。

UDXDEVELOPER 权限

具有 UDXDEVELOPER 角色的用户可以执行以下操作:

要使用此角色的权限,您必须使用 SET ROLE 显式启用它。

安全注意事项

具有 UDXDEVELOPER 角色的用户可以创建库,因此可以在数据库中安装任何 UDx 函数。UDx 函数以拥有数据库的 Linux 用户身份运行,因此可以访问 Vertica 有权访问的资源。

写得不好的函数会降低数据库性能。请仅将此角色授予您相信会负责任地使用 UDx 的用户。您可以通过在隔离模式下运行 UDx 并设置 FencedUDxMemoryLimitMB 配置参数来限制 UDx 可以使用的内存。

1.6 - PUBLIC

PUBLIC 角色是自动分配给所有新用户的预定义角色。它始终处于启用状态,并且无法删除或撤销。使用此角色授予所有数据库用户相同的最低权限集。

与所有其他角色一样,可以授予 PUBLIC 角色对单个对象和其他角色的权限。以下示例授予 PUBLIC 角色对表 publicdata 的 INSERT 和 SELECT 权限。这使所有用户都可以读取该表中的数据并插入新数据:

=> CREATE TABLE publicdata (a INT, b VARCHAR);
CREATE TABLE
=> GRANT INSERT, SELECT ON publicdata TO PUBLIC;
GRANT PRIVILEGE
=> CREATE PROJECTION publicdataproj AS (SELECT * FROM publicdata);
CREATE PROJECTION
=> \c - bob
You are now connected as user "bob".
=> INSERT INTO publicdata VALUES (10, 'Hello World');
OUTPUT
--------
      1
(1 row)

以下示例向 PUBLIC 授予 employee 角色,以便所有数据库用户都具有 employee 权限:

=> GRANT employee TO public;
GRANT ROLE

2 - 角色层次结构

通过将角色授予其他角色,您可以构建角色层次结构,层次结构中较低的角色具有较窄的权限范围,而层次结构中较高的角色被授予角色及其权限的组合。当您按分层方式组织角色时,添加到较低级别角色的任何权限都会自动传播到它们上方的角色。

创建分层角色

以下示例将创建两个角色,为其分配权限,然后将这两个角色分配给另一个角色。

  1. 创建名为 applog 的表:

    => CREATE TABLE applog (id int, sourceID VARCHAR(32), data TIMESTAMP, event VARCHAR(256));
    
  2. 创建 logreader 角色并授予它对表 applog 的只读权限:

    => CREATE ROLE logreader;
    CREATE ROLE
    => GRANT SELECT ON applog TO logreader;
    GRANT PRIVILEGE
    
  3. 创建 logwriter 角色并授予它对表 applog 的写入权限:

    => CREATE ROLE logwriter;
    CREATE ROLE
    => GRANT INSERT, UPDATE ON applog to logwriter;
    GRANT PRIVILEGE
    
  4. 创建 logadmin 角色并授予它对表 applog 的删除权限:

    => CREATE ROLE logadmin;
    CREATE ROLE
    => GRANT DELETE ON applog to logadmin;
    GRANT PRIVILEGE
    
  5. logreaderlogwriter 角色授予角色 logadmin

    => GRANT logreader, logwriter TO logadmin;
    
  6. 创建用户 bob 并向他授予 logadmin 角色:

    => CREATE USER bob;
    CREATE USER
    => GRANT logadmin TO bob;
    GRANT PRIVILEGE
    
  7. 修改用户 bob 的帐户,使他的 logadmin 角色在登录时自动启用

    
    => ALTER USER bob DEFAULT ROLE logadmin;
    ALTER USER
    => \c - bob
    You are now connected as user "bob".
    => SHOW ENABLED_ROLES;
         name      | setting
    ---------------+----------
     enabled roles | logadmin
    (1 row)
    

启用分层角色

只能为用户启用已向其显式授予的角色。在前面的示例中,对于 bob,无法启用 logreaderlogwriter 角色。它们只能通过启用 logadmin 来间接启用。

分层角色授予和 WITH ADMIN OPTION

如果使用 WITH ADMIN OPTION 将一个或多个角色授予另一个角色,则被授予“较高”角色的用户将继承对下级角色的管理访问权限。

例如,您可以按如下方式,将以前授予的角色 logreaderlogwriter 修改为 logadmin

=> GRANT logreader, logwriter TO logadmin WITH ADMIN OPTION;
NOTICE 4617:  Role "logreader" was already granted to role "logadmin"
NOTICE 4617:  Role "logwriter" was already granted to role "logadmin"
GRANT ROLE

现在,用户 bob 有权通过他的 logadmin 角色将其两个下级角色授予其他用户,在本例中是将角色 logreader 授予用户 Alice


=> \c - bob;
You are now connected as user "bob".
=> GRANT logreader TO Alice;
GRANT ROLE
=> \c - alice;
You are now connected as user "alice".
=> show available_roles;
      name       |  setting
-----------------+-----------
 available roles | logreader
(1 row)

3 - 创建或删除角色

作为具有 DBADMINPSEUDOSUPERUSER 角色的超级用户,您可以使用 CREATE ROLE 创建角色,使用 DROP ROLE 删除角色。

=> CREATE ROLE administrator;
CREATE ROLE

没有为新角色授予任何权限或角色。超级用户必须向新角色授予权限访问权限

删除具有依赖关系的数据库角色

如果您尝试删除授予用户或其他角色的角色,Vertica 将返回一则回退消息:

=> DROP ROLE administrator;
NOTICE:  User Bob depends on Role administrator
ROLLBACK:  DROP ROLE failed due to dependencies
DETAIL:  Cannot drop Role administrator because other objects depend on it
HINT:  Use DROP ROLE ... CASCADE to remove granted roles from the dependent users/roles

若要强制执行删除操作,请使用 CASCADE 限定 DROP ROLE 语句:

=> DROP ROLE administrator CASCADE;
DROP ROLE

4 - 向角色授予权限

您可以使用 GRANT 语句为角色分配权限,就像您为用户分配权限一样。有关可以授予哪些权限的信息,请参阅数据库权限

为角色授予权限会立即影响到活动的用户会话。为角色授予权限时,此权限便立即可供已启用该角色的所有用户使用。

以下示例将创建两个角色,并为这两个角色分配对同一个表的不同权限。

  1. 创建名为 applog 的表:

    => CREATE TABLE applog (id int, sourceID VARCHAR(32), data TIMESTAMP, event VARCHAR(256));
    
  2. 创建名为 logreaderlogwriter 的角色:

    => CREATE ROLE logreader;
    CREATE ROLE
    => CREATE ROLE logwriter;
    CREATE ROLE
    
  3. applog 的只读权限授予 logreader,并将写入权限授予 logwriter

    => GRANT SELECT ON applog TO logreader;
    GRANT PRIVILEGE
    => GRANT INSERT ON applog TO logwriter;
    GRANT PRIVILEGE
    

撤销角色的权限

使用 REVOKE 语句撤销角色的权限。撤销角色的权限会立即影响到处于活动状态的用户会话。当您撤销某个角色的权限时,通过该角色拥有此权限的用户将无法再使用此权限。

例如:

=> REVOKE INSERT ON applog FROM logwriter;
REVOKE PRIVILEGE

5 - 授予数据库角色

您可以使用 授权(角色) 将一个或多个角色分配给用户或其他角色:

GRANT role[,...] TO grantee[,...] [ WITH ADMIN OPTION ]

例如,您可以创建三个角色(appdataapplogsappadmin)并为用户 bob 授予 appadmin

=> CREATE ROLE appdata;
CREATE ROLE
=> CREATE ROLE applogs;
CREATE ROLE
=> CREATE ROLE appadmin;
CREATE ROLE
=> GRANT appadmin TO bob;
GRANT ROLE

将角色授予另一个角色

GRANT 可以将一个或多个角色分配给另一个角色。例如,以下 GRANT 语句将角色 appdataapplogs 授予角色 appadmin

=> GRANT appdata, applogs TO appadmin;
 -- grant to other roles
GRANT ROLE

因为先前为用户 bob 分配了角色 appadmin,所以他现在拥有向角色 appdataapplogs 授予的所有权限。

当您将一个角色授予另一个角色时,Vertica 会检查循环引用。在上一个示例中,已将角色 appdata 分配给 appadmin 角色。因此,随后将 appadmin 分配给 appdata 的尝试将失败,并返回以下警告:

=> GRANT appadmin TO appdata;
WARNING:  Circular assignation of roles is not allowed
HINT:  Cannot grant appadmin to appdata
GRANT ROLE

启用角色

向用户授予角色后,必须启用该角色。您可以为当前会话启用角色:


=> SET ROLE appdata;
SET ROLE

还可以通过使用 ALTER USER...DEFAULT ROLE 修改用户的配置文件,在用户登录期间启用角色:


=> ALTER USER bob DEFAULT ROLE appdata;
ALTER USER

有关详细信息,请参阅“启用角色”和“自动启用角色”。

授予管理权限

您可以通过使用 WITH ADMIN OPTION 选项限定 授权(角色) 语句,从而将对角色的管理访问权限委托给非超级用户。具有管理访问权限的用户可以管理其他用户对该角色的访问权限,包括向他们授予管理访问权限。在以下示例中,超级用户将具有管理权限的 appadmin 角色授予用户 bobalice.

=> GRANT appadmin TO bob, alice WITH ADMIN OPTION;
GRANT ROLE

现在,两个用户都可以行使他们的管理权限来将 appadmin 角色授予其他用户或撤销该角色。例如,用户 bob 现在可以撤销用户 aliceappadmin 角色:


=> \connect - bob
You are now connected as user "bob".
=> REVOKE appadmin FROM alice;
REVOKE ROLE

示例

以下示例创建名为 commenter 的角色并将该角色授予用户 bob

  1. 创建 comments 表:

    => CREATE TABLE comments (id INT, comment VARCHAR);
    
  2. 创建 commenter 角色:

    => CREATE ROLE commenter;
    
  3. 授予 commentercomments 表的 INSERT 和 SELECT 权限:

    => GRANT INSERT, SELECT ON comments TO commenter;
    
  4. 向用户 bob 授予 commenter 角色。

    => GRANT commenter TO bob;
    
  5. 为了访问该角色及其关联权限,bob 为自己启用新授予的角色。

    => \c - bob
    => SET ROLE commenter;
    
  6. 因为 bobcomments 表具有 INSERT 和 SELECT 权限,所以他可以执行以下操作:

    => INSERT INTO comments VALUES (1, 'Hello World');
     OUTPUT
    --------
          1
    (1 row)
    => SELECT * FROM comments;
     id |   comment
    ----+-------------
      1 | Hello World
    (1 row)
    => COMMIT;
    COMMIT
    
  7. 因为 bob 的角色缺少 DELETE 权限,所以以下语句会返回错误:

    
    => DELETE FROM comments WHERE id=1;
    ERROR 4367:  Permission denied for relation comments
    

另请参阅

向 MC 用户授予数据库访问权限

6 - 撤销数据库角色

REVOKE(角色) 可以从一个或多个被授权者(即用户或角色)撤销角色:

REVOKE [ ADMIN OPTION FOR ] role[,...] FROM grantee[,...] [ CASCADE ]

例如,以下语句从用户 bob 撤销 commenter 角色:

=> \c
You are now connected as user "dbadmin".
=> REVOKE commenter FROM bob;
REVOKE ROLE

从角色撤销管理访问权限

您可以使用 ADMIN OPTION FOR 子句限定 REVOKE(角色)。该子句从被授予者撤销将指定角色授予其他用户或角色的权限(由以前的 GRANT (Role)...WITH ADMIN OPTION 语句授予)。被授予者的当前角色不受影响。

以下示例撤销用户 Alice 授予和撤销 commenter 角色的权限:

=> \c
You are now connected as user "dbadmin".
=> REVOKE ADMIN OPTION FOR commenter FROM alice;
REVOKE ROLE

7 - 启用角色

当您在会话中启用角色时,将获得分配给该角色的所有权限。您可以同时启用多个角色,从而获得这些角色的所有权限,以及已经直接授予您的任何权限。

默认情况下,对于用户,仅自动启用预定义角色。否则,在启动会话时,您必须使用 Vertica 函数 SET ROLE 显式启用分配的角色

例如,dbadmin 创建 logreader 角色并将其分配给用户 alice

=> \c
You are now connected as user "dbadmin".
=> CREATE ROLE logreader;
CREATE ROLE
=> GRANT SELECT ON TABLE applog to logreader;
GRANT PRIVILEGE
=> GRANT logreader TO alice;
GRANT ROLE

用户 alice 必须启用新角色才能查看 applog 表:


=> \c - alice
You are now connected as user "alice".
=> SELECT * FROM applog;
ERROR:  permission denied for relation applog
=> SET ROLE logreader;
SET
=> SELECT * FROM applog;
 id | sourceID |            data            |                    event
----+----------+----------------------------+----------------------------------------------
  1 | Loader   | 2011-03-31 11:00:38.494226 | Error: Failed to open source file
  2 | Reporter | 2011-03-31 11:00:38.494226 | Warning: Low disk space on volume /scratch-a
(2 rows)

启用所有用户角色

您可以使用 SET ROLE ALL 启用对您的用户帐户可用的所有角色:

=> SET ROLE ALL;
SET
=> SHOW ENABLED_ROLES;
     name      |           setting
---------------+------------------------------
 enabled roles | logreader, logwriter
(1 row)

禁用角色

用户可以使用 SET ROLE NONE 禁用所有角色。此语句禁用当前会话的除预定义角色以外的所有其他角色:

=> SET ROLE NONE;
=> SHOW ENABLED_ROLES;
     name      | setting
---------------+---------
 enabled roles |
(1 row)

8 - 自动启用角色

默认情况下,会为新用户分配 PUBLIC 角色,在新会话开始时会自动启用此角色。通常,会创建其他角色并将它们分配给用户,但不会自动启用这些角色。相反,用户必须在每个新会话中使用 SET ROLE 显式启用为他们分配的角色。

您可以通过两种方式自动为用户启用角色:

  • 在登录时为单个用户启用角色

  • 在登录时为所有用户启用所有角色

为单个用户启用角色

为用户分配角色后,您可以通过使用 ALTER USER...DEFAULT ROLE 修改每个用户的配置文件来为该用户设置一个或多个默认角色。用户默认角色在用户会话开始时自动启用。如果用户通常依赖这些角色的权限来执行日常任务,您应该考虑为用户设置默认角色。

以下示例显示了如何将 regional_manager 设置为用户 LilyCP 的默认角色:

=> \c
You are now connected as user "dbadmin".
=> GRANT regional_manager TO LilyCP;
GRANT ROLE
=> ALTER USER LilyCP DEFAULT ROLE regional_manager;
ALTER USER
=> \c - LilyCP
You are now connected as user "LilyCP".
=> SHOW ENABLED_ROLES;
     name      |     setting
---------------+------------------
 enabled roles | regional_manager
(1 row)

为所有用户启用所有角色

配置参数 EnableAllRolesOnLogin 指定是否在登录时为所有数据库用户启用所有角色。默认情况下,此参数设置为 0。如果设置为 1,Vertica 会在所有用户登录数据库时启用他们的角色。

清除默认角色

您可以使用 ALTER USER...DEFAULT ROLE NONE 清除为用户分配的所有默认角色。例如:

=> ALTER USER fred DEFAULT ROLE NONE;
ALTER USER
=> SELECT user_name, default_roles, all_roles FROM users WHERE user_name = 'fred';
 user_name | default_roles | all_roles
-----------+---------------+-----------
 fred      |               | logreader
(1 row)

9 - 查看用户角色

您可以通过三种方式获取有关角色的信息:

验证角色分配

函数 HAS_ROLE 检查是否已将 Vertica 角色授予指定的用户或角色。非超级用户可以使用此函数检查自己的角色成员资格。超级用户可以使用它来确定其他用户和角色的角色分配。您还可以使用管理控制台检查角色分配

在以下示例中,dbadmin 用户检查是否为用户 MikeL 分配了 admnistrator 角色:

=> \c
You are now connected as user "dbadmin".
=> SELECT HAS_ROLE('MikeL', 'administrator');
 HAS_ROLE
----------
 t
(1 row)

用户 MikeL 检查其是否具有 regional_manager 角色:

=> \c - MikeL
You are now connected as user "MikeL".
=> SELECT HAS_ROLE('regional_manager');
 HAS_ROLE
----------
 f
(1 row)

dbadmin 将 regional_manager 角色授予 administrator 角色。再次检查时,MikeL 会验证他现在具有 regional_manager 角色:

dbadmin=> \c
You are now connected as user "dbadmin".
dbadmin=> GRANT regional_manager to administrator;
GRANT ROLE
dbadmin=> \c - MikeL
You are now connected as user "MikeL".
dbadmin=> SELECT HAS_ROLE('regional_manager');
 HAS_ROLE
----------
 t
(1 row)

查看可用角色和已启用的角色

SHOW AVAILABLE ROLES 列出向您授予的所有角色:

=> SHOW AVAILABLE ROLES;
      name       |           setting
-----------------+-----------------------------
 available roles | logreader, logwriter
(1 row)

SHOW ENABLED ROLES 列出在会话中启用的角色:

=> SHOW ENABLED ROLES;
     name      | setting
---------------+----------
 enabled roles | logreader
(1 row)

查询系统表

您可以单独或以联接方式查询表 ROLESUSERSGRANTS,以获取有关用户角色、分配给这些角色的用户以及显式授予用户和通过角色隐式授予的权限的详细信息。

针对 ROLES 执行以下查询将返回用户可以访问的所有角色的名称,以及授予(分配)这些角色的角色。附加到角色的星号 (*) 表示用户可以将该角色授予其他用户:

=> SELECT * FROM roles;
      name       | assigned_roles
-----------------+----------------
 public          |
 dbduser         |
 dbadmin         | dbduser*
 pseudosuperuser | dbadmin*
 logreader       |
 logwriter       |
 logadmin        | logreader, logwriter
(7 rows)

针对系统表 USERS 执行以下查询将返回所有具备 DBADMIN 角色的用户。附加到角色的星号 (*) 表示用户可以将该角色授予其他用户:

=> SELECT user_name, is_super_user, default_roles, all_roles FROM v_catalog.users WHERE all_roles ILIKE '%dbadmin%';
 user_name | is_super_user |            default_roles             |              all_roles
-----------+---------------+--------------------------------------+--------------------------------------
 dbadmin   | t             | dbduser*, dbadmin*, pseudosuperuser* | dbduser*, dbadmin*, pseudosuperuser*
 u1        | f             |                                      | dbadmin*
 u2        | f             |                                      | dbadmin
(3 rows)

针对系统表 GRANTS 执行以下查询将返回向用户 Jane 或角色 R1 授予的权限。附加到权限的星号 (*) 表示用户可以将该权限授予其他用户:

=> SELECT grantor,privileges_description,object_name,object_type,grantee FROM grants WHERE grantee='Jane' OR grantee='R1';
grantor | privileges_description | object_name | object_type  |  grantee
--------+------------------------+-------------+--------------+-----------
dbadmin | USAGE                  | general     | RESOURCEPOOL | Jane
dbadmin |                        | R1          | ROLE         | Jane
dbadmin | USAGE*                 | s1          | SCHEMA       | Jane
dbadmin | USAGE, CREATE*         | s1          | SCHEMA       | R1
(4 rows)