权限所有权链

撤销对于对象的权限可能会在整个组织内产生级联影响。如果为用户撤销了授予选项,则此用户授予其他用户的权限也会被撤销。

如果权限是由多个授予者授予用户或角色的,则要为被授予者完全撤销此权限,每个最初授予者都必须撤销该权限。唯一例外是超级用户可以撤销对象所有者授予的权限,反之亦然。

在以下示例中,对表 t1 的 SELECT 权限是通过一个从超级用户到 User3 的用户链授予的。

  • 超级用户为 User1 授予对架构 s1 的 CREATE 权限:

    => \c - dbadmin
    You are now connected as user "dbadmin".
    => CREATE USER User1;
    CREATE USER
    => CREATE USER User2;
    CREATE USER
    => CREATE USER User3;
    CREATE USER
    => CREATE SCHEMA s1;
    CREATE SCHEMA
    => GRANT USAGE on SCHEMA s1 TO User1, User2, User3;
    GRANT PRIVILEGE
    => CREATE ROLE reviewer;
    CREATE ROLE
    => GRANT CREATE ON SCHEMA s1 TO User1;
    GRANT PRIVILEGE
    
  • User1 在架构 s1 中创建新表 t1,然后为 User2 授予对 s1.t1 的 SELECT WITH GRANT OPTION 权限:

    => \c - User1
    You are now connected as user "User1".
    => CREATE TABLE s1.t1(id int, sourceID VARCHAR(8));
    CREATE TABLE
    => GRANT SELECT on s1.t1 to User2 WITH GRANT OPTION;
    GRANT PRIVILEGE
    
  • User2 为 User3 授予对 s1.t1 的 SELECT WITH GRANT OPTION 权限。

    => \c - User2
    You are now connected as user "User2".
    => GRANT SELECT on s1.t1 to User3 WITH GRANT OPTION;
    GRANT PRIVILEGE
    
  • User3 为查看者角色授予对 s1.t1 的 SELECT 权限:

    => \c - User3
    You are now connected as user "User3".
    => GRANT SELECT on s1.t1 to reviewer;
    GRANT PRIVILEGE
    

用户不能撤销处于链上游的权限。例如,User2 没有为 User1 授予权限,因此当 User1 运行以下 REVOKE 命令时,Vertica 会回退命令:

=> \c - User2
You are now connected as user "User2".
=> REVOKE CREATE ON SCHEMA s1 FROM User1;
ROLLBACK 0:  "CREATE" privilege(s) for schema "s1" could not be revoked from "User1"

用户可以间接地为通过级联链接受权限的用户撤销权限,如上例所示。这里,用户可以使用 CASCADE 选项为链“下游”的所有用户撤销权限。超级用户或 User1 可以使用 CASCADE 选项为所有用户撤销对表 s1.t1 的 SELECT 权限。例如,超级用户或 User1 可以执行以下语句为链中的所有用户和角色撤销 SELECT 权限:

=> \c - User1
You are now connected as user "User1".
=> REVOKE SELECT ON s1.t1 FROM User2 CASCADE;
REVOKE PRIVILEGE

当超级用户或 User1 执行上述语句时,会为 User2、User3 和查看者角色撤销对表 s1.t1 的 SELECT 权限。同时也会为 User2 和 User3 撤销 GRANT 权限,超级用户可以通过查询 V_CATALOG.GRANTS 系统表进行验证。

=> SELECT * FROM grants WHERE object_name = 's1' AND grantee ILIKE 'User%';
 grantor | privileges_description | object_schema | object_name | grantee
---------+------------------------+---------------+-------------+---------
 dbadmin | USAGE                  |               | s1          | User1
 dbadmin | USAGE                  |               | s1          | User2
 dbadmin | USAGE                  |               | s1          | User3
(3 rows)