授予数据库角色

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

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 用户授予数据库访问权限