postgresql - 当REVOKE GRANT被称为PostgreSQL时,二级权限会发生什么?

标签 postgresql

假设一个用户,u1 授予另一个用户 u2 权限以查看 PostgreSQL 中的表,并授予他们GRANT OPTION:

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 的权限被撤销,u2u3 会发生什么情况?

REVOKE ALL ON t1 FROM u1;

最佳答案

某人因收到权限的GRANT OPTION而授予的权限依赖于原始权限。

要撤销原始权限,您必须使用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 撤销 u2GRANT OPTION:

    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直接或间接授予的所有权限都消失了。

关于postgresql - 当REVOKE GRANT被称为PostgreSQL时,二级权限会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59099705/

相关文章:

python - 如何跨 SQL Server 和 Postgres 比较两个表列哈希的哈希值?

python - 模型中 django dateTime 的正确格式是什么?

java - 如何使用 hibernate 和 postrgresql 跨程序的多个实例锁定记录?

postgresql - 使用登录名(用户)创建 PostgreSQL 9 角色只是为了执行功能

ruby-on-rails - 为什么我不能在 Rails 中将任何模型保存到 PostgreSQL 数据库?

ruby-on-rails - Heroku 数据库 :push error (rails)

ruby-on-rails - 无法加载 Rails 服务器甚至无法在任何来源中找到 pg-0.17.1

postgresql - 求PostgreSQL中每个X由Y组成的比例?

sql - PostgreSQL - 将底部的 N 个结果切片并将它们移动到顶部

sql - Postgresql 运算符类 "varchar_pattern_ops"不接受数据类型整数