PostgreSQL 15:如何撤销角色的GRANT OPTION权限?
解决PostgreSQL 15撤销角色GRANT OPTION权限的问题
你的原语句无效,核心原因是语法使用不当,针对不同场景的正确操作如下:
1. 撤销角色在Schema本身的GRANT OPTION权限
如果目标是收回角色对schema_name这个Schema本身(比如创建对象、使用Schema的权限)的授权能力,需使用ALL PRIVILEGES而非ALL,语法如下:
REVOKE GRANT OPTION FOR ALL PRIVILEGES ON SCHEMA schema_name FROM role_name;
若只想撤销特定权限的授权能力(比如仅USAGE或CREATE),可指定具体权限:
-- 仅撤销USAGE权限的GRANT OPTION REVOKE GRANT OPTION FOR USAGE ON SCHEMA schema_name FROM role_name; -- 仅撤销CREATE权限的GRANT OPTION REVOKE GRANT OPTION FOR CREATE ON SCHEMA schema_name FROM role_name;
2. 撤销角色在Schema下所有对象的GRANT OPTION权限
如果目标是收回角色对schema_name下所有表、视图等对象的授权能力,需针对Schema内的对象集合操作:
-- 针对所有表 REVOKE GRANT OPTION FOR ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name FROM role_name; -- 针对所有序列 REVOKE GRANT OPTION FOR ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA schema_name FROM role_name;
3. 级联撤销依赖权限
如果该角色已经将权限授予了其他用户,直接执行上述语句会报错,需添加CASCADE参数级联撤销下游的授权:
REVOKE GRANT OPTION FOR ALL PRIVILEGES ON SCHEMA schema_name FROM role_name CASCADE;
前置检查:确认角色的授权权限
执行以下查询,可明确角色当前拥有哪些带GRANT OPTION的权限,方便精准操作:
-- 查看Schema级权限 SELECT nspname, privilege_type, is_grantable FROM information_schema.schema_privileges WHERE nspname = 'schema_name' AND grantee = 'role_name'; -- 查看Schema下的表权限 SELECT table_name, privilege_type, is_grantable FROM information_schema.table_privileges WHERE table_schema = 'schema_name' AND grantee = 'role_name';
内容的提问来源于stack exchange,提问作者Krzysztof Chojnacki
相关产品推荐
相关产品推荐

