当REVOKE GRANT被称为PostgreSQL时,第二级权限会发生什么变化?

当REVOKE GRANT被称为PostgreSQL时,第二级权限会发生什么变化?,postgresql,Postgresql,假设一个用户,u1给另一个用户u2查看PostgreSQL中的表的权限,并给他们授予选项: GRANT SELECT ON t1 TO u1 WITH GRANT OPTION; 现在,u2将权限授予另一个用户,u3: -- AS u2 GRANT SELECT ON t1 TO u3; 现在,u2改变了组织中的职位,他们的权限也改变了。其中,t1的查看权限被撤销: -- As u1 REVOKE GRANT OPTION ON t1 FROM u2; u3的权限会发生什么变化 附加问题

假设一个用户,
u1
给另一个用户
u2
查看PostgreSQL中的表的权限,并给他们
授予选项

GRANT SELECT ON t1 TO u1 WITH GRANT OPTION;
现在,
u2
将权限授予另一个用户,
u3

-- AS u2
GRANT SELECT ON t1 TO u3;
现在,
u2
改变了组织中的职位,他们的权限也改变了。其中,
t1
的查看权限被撤销:

-- As u1
REVOKE GRANT OPTION ON t1 FROM u2;
u3
的权限会发生什么变化


附加问题:如果
u1
的权限被撤销,那么
u2
u3
会发生什么情况

REVOKE ALL ON t1 FROM u1;

某人授予的特权,因为他们已收到特权的
GRANT选项
,依赖于原始特权

要撤销原始特权,必须使用
CASCADE
选项,该选项将撤销级联到所有从属特权

因此,任何特权都不可能成为“孤儿”

一个简单的实验:

  • 创建表和角色并授予特权:

    test=# CREATE TABLE t1 (id integer PRIMARY KEY);
    CREATE TABLE
    test=# CREATE ROLE u1 LOGIN;
    CREATE ROLE
    test=# GRANT SELECT ON t1 TO u1 WITH GRANT OPTION;
    GRANT
    test=# CREATE ROLE u2 LOGIN;
    CREATE ROLE
    test=# CREATE ROLE u3 LOGIN;
    CREATE ROLE
    test=# SET ROLE u1;
    SET
    test=> GRANT SELECT ON t1 TO u2 WITH GRANT OPTION;
    GRANT
    test=> RESET ROLE;
    RESET
    test=# SET ROLE u2;
    SET
    test=> GRANT SELECT ON t1 TO u3 WITH GRANT OPTION;
    GRANT
    test=> RESET ROLE;
    RESET
    test=# \z t1
                                    Access privileges
     Schema | Name | Type  |     Access privileges     | Column privileges | Policies 
    --------+------+-------+---------------------------+-------------------+----------
     public | t1   | table | postgres=arwdDxt/postgres+|                   | 
            |      |       | u1=r*/postgres           +|                   | 
            |      |       | u2=r*/u1                 +|                   | 
            |      |       | u3=r*/u2                  |                   | 
    (1 row)
    
  • 现在,如
    u1
    u2
    撤销
    GRANT选项

    test=# SET ROLE u1;
    SET
    test=> REVOKE GRANT OPTION FOR SELECT ON t1 FROM u2;
    ERROR:  dependent privileges exist
    HINT:  Use CASCADE to revoke them too.
    test=> REVOKE GRANT OPTION FOR SELECT ON t1 FROM u2 CASCADE;
    REVOKE
    test=> RESET ROLE;
    RESET
    test=# \z t1
                                    Access privileges
     Schema | Name | Type  |     Access privileges     | Column privileges | Policies 
    --------+------+-------+---------------------------+-------------------+----------
     public | t1   | table | postgres=arwdDxt/postgres+|                   | 
            |      |       | u1=r*/postgres           +|                   | 
            |      |       | u2=r/u1                   |                   | 
    (1 row)
    
    u2
    已发放的所有特权都已被撤销

  • u1
    撤消所有权限:

    test=# REVOKE SELECT ON t1 FROM u1;
    ERROR:  dependent privileges exist
    HINT:  Use CASCADE to revoke them too.
    test=# REVOKE SELECT ON t1 FROM u1 CASCADE;
    REVOKE
    test=# \z t1
                                    Access privileges
     Schema | Name | Type  |     Access privileges     | Column privileges | Policies 
    --------+------+-------+---------------------------+-------------------+----------
     public | t1   | table | postgres=arwdDxt/postgres |                   | 
    (1 row)
    
    u1
    直接或间接授予的所有特权都将消失