假设一个用户,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
的权限被撤销,u2
和 u3
会发生什么情况?
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
撤销u2
的GRANT 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/