权限所有权链
撤销对于对象的权限可能会在整个组织内产生级联影响。如果为用户撤销了授予选项,则此用户授予其他用户的权限也会被撤销。
如果权限是由多个授予者授予用户或角色的,则要为被授予者完全撤销此权限,每个最初授予者都必须撤销该权限。唯一例外是超级用户可以撤销对象所有者授予的权限,反之亦然。
在以下示例中,对表 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)