如何在PSQL/PGAdmin4中检查特定角色对指定Schema的权限?
替代的权限检查方法
1. 查询Schema级别的直接权限
使用PostgreSQL底层系统表pg_namespace和pg_privs,可以直接获取角色对Schema的USAGE、CREATE等权限,信息更完整:
SELECT n.nspname AS schema_name, r.rolname AS role_name, p.privilege_type, p.is_grantable FROM pg_namespace n JOIN pg_privs p ON n.oid = p.objoid JOIN pg_roles r ON p.grantee = r.oid WHERE r.rolname IN ('gerent','administratiu','metge','tecnic') AND n.nspname IN ('laboratori','administracio','clinica');
2. 查询Schema下表/视图的权限(含继承权限)
如果角色通过父角色继承了权限,information_schema.role_table_grants可能无法显示,这个查询可以包含所有权限(直接授予+继承):
SELECT n.nspname AS table_schema, c.relname AS table_name, r.rolname AS grantee, array_agg(DISTINCT p.privilege_type) AS privileges FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_privs p ON c.oid = p.objoid JOIN pg_roles r ON p.grantee = r.oid WHERE c.relkind IN ('r', 'v') -- 仅查询表和视图 AND r.rolname IN ('gerent','administratiu','metge','tecnic') AND n.nspname IN ('laboratori','administracio','clinica') GROUP BY n.nspname, c.relname, r.rolname;
3. 检查角色的权限继承关系
如果你的角色是某个父角色的成员,父角色的权限会被继承,这个查询可以查看角色从哪些父角色继承了Schema权限:
SELECT child.rolname AS role_name, parent.rolname AS inherited_from, n.nspname AS schema_name, p.privilege_type FROM pg_auth_members am JOIN pg_roles child ON am.member = child.oid JOIN pg_roles parent ON am.roleid = parent.oid JOIN pg_privs p ON parent.oid = p.grantee JOIN pg_namespace n ON p.objoid = n.oid WHERE child.rolname IN ('gerent','administratiu','metge','tecnic') AND n.nspname IN ('laboratori','administracio','clinica');
4. 使用psql元命令快速查看
如果你用psql客户端连接数据库,直接执行以下命令可以直观查看指定Schema下所有对象的权限:
\dp laboratori.* administratiu.* clinica.*
这个命令会输出每个表/视图的权限详情,包括各个角色拥有的权限以及是否可授予。
补充说明
information_schema.role_table_grants返回信息受限的原因通常是:该视图仅显示直接授予给目标角色的表权限,不包含通过角色组继承的权限;同时部分底层权限信息会被视图过滤,而使用pg_catalog下的系统表可以获取更完整的权限数据。
内容的提问来源于stack exchange,提问作者Berta A
相关产品推荐
相关产品推荐

