当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