如何查询pg账号权限 能否创建模式 删表建表
在 PostgreSQL 中,要查询一个账号(角色)是否具备「创建模式(Schema)」「删除表」「创建表」等权限,可以分两步:
✅ 第一步:确认角色本身是否有权限
1. 查看角色是否具备 CREATE
权限(能否建表、建 Schema)
-- 查看角色是否具备数据库级的 CREATE 权限(影响能否建 Schema)
SELECT has_database_privilege('your_role_name', 'your_database_name', 'CREATE');-- 查看角色是否具备某个 Schema 的 CREATE 权限(影响能否在该 Schema 中建表)
SELECT has_schema_privilege('your_role_name', 'your_schema_name', 'CREATE');
2. 查看角色是否具备 USAGE
权限(能否访问 Schema)
SELECT has_schema_privilege('your_role_name', 'your_schema_name', 'USAGE');
3. 查看角色是否具备表级的权限(如 SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER)
-- 查看对某张表的权限
SELECT has_table_privilege('your_role_name', 'your_table_name', 'DELETE');
✅ 第二步:查看角色是否通过「角色成员身份」继承权限
如果角色是通过「属于某个组角色」来继承权限的,你还需要查它所属的组角色:
-- 查看某角色属于哪些组角色
SELECT roleid::regrole, member::regrole, admin_option
FROM pg_auth_members
WHERE member = 'your_role_name'::regrole;
然后对组角色重复第一步的权限检查。
✅ 第三步:用系统视图快速扫一遍权限
查看角色在所有 Schema 上的权限:
SELECT n.nspname AS schema_name,r.rolname AS role_name,p.perm AS privilege_type
FROM pg_namespace n
JOIN aclexplode(n.nspacl) p ON true
JOIN pg_roles r ON p.grantee = r.oid
WHERE r.rolname = 'your_role_name';
查看角色在所有表上的权限:
SELECT schemaname, tablename, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'your_role_name';
✅ 总结:判断逻辑
操作 | 所需权限 |
---|---|
创建 Schema | 数据库级的 CREATE 权限 |
在某 Schema 中建表 | Schema 的 CREATE + USAGE 权限 |
删除表 | 表的 DELETE 权限(或表的所有者) |
创建表 | Schema 的 CREATE + USAGE 权限 |
✅ 示例:检查用户 app_user
能否在 public
中建表
SELECT has_schema_privilege('app_user', 'public', 'CREATE') AS can_create_table;
如需更细粒度控制(如判断是否是超级用户、是否拥有 CREATEDB
/CREATEROLE
等),可查:
SELECT *
FROM pg_roles
WHERE rolname = 'your_role_name';