PostgreSQL 中的权限视图
PostgreSQL 中的权限视图
PostgreSQL 提供了多个系统视图来查询权限信息,虽然不像 Oracle 的 DBA_SYS_PRIVS
那样集中在一个视图中,但可以通过组合以下视图获取完整的系统权限信息。
一 主要权限相关视图
Oracle 视图 | PostgreSQL 对应视图 | 描述 |
---|---|---|
DBA_SYS_PRIVS | pg_roles + pg_auth_members | 系统全局权限 |
ROLE_SYS_PRIVS | pg_roles + pg_auth_members | 角色拥有的系统权限 |
USER_SYS_PRIVS | pg_user + pg_auth_members | 用户拥有的系统权限 |
二 PostgreSQL 核心权限视图
2.1 pg_roles
/ pg_user
- 角色/用户基本信息
SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin
FROM pg_roles;-- 或简化的用户视图
SELECT * FROM pg_user;
2.2 pg_auth_members
- 角色成员关系
SELECT roleid::regrole AS role, member::regrole AS member, grantor::regrole AS grantor
FROM pg_auth_members;
2.3 自定义查询 (类似 DBA_SYS_PRIVS)
SELECT r.rolname AS grantee,CASE WHEN r.rolsuper THEN 'SUPERUSER'WHEN r.rolcreaterole THEN 'CREATE ROLE'WHEN r.rolcreatedb THEN 'CREATE DB'WHEN r.rolcanlogin THEN 'LOGIN'ELSE 'OTHER'END AS privilege,'SYSTEM' AS admin_option
FROM pg_roles r
WHERE r.rolsuper OR r.rolcreaterole OR r.rolcreatedb OR r.rolcanlogin;
三 特定权限检查查询
3.1 检查超级用户权限
SELECT usename FROM pg_user WHERE usesuper;
3.2 检查创建数据库权限
SELECT rolname FROM pg_roles WHERE rolcreatedb;
3.3 检查创建角色权限
SELECT rolname FROM pg_roles WHERE rolcreaterole;
3.4 检查登录权限
SELECT rolname FROM pg_roles WHERE rolcanlogin;
四 对象级权限视图
PostgreSQL 还提供对象级别的权限视图,类似于 Oracle 的 DBA_TAB_PRIVS
:
4.1 information_schema.role_table_grants
SELECT * FROM information_schema.role_table_grants;
4.2 information_schema.role_column_grants
SELECT * FROM information_schema.role_column_grants;
4.3 pg_namespace
- schema 权限
SELECT nspname, nspowner::regrole FROM pg_namespace;
五 权限管理对比表
功能 | Oracle | PostgreSQL |
---|---|---|
超级用户 | DBA_SYS_PRIVS 中的 SYSDBA | pg_roles.rolsuper |
创建角色 | CREATE ROLE 权限 | pg_roles.rolcreaterole |
创建数据库 | CREATE DATABASE 权限 | pg_roles.rolcreatedb |
登录权限 | CREATE SESSION 权限 | pg_roles.rolcanlogin |
角色授权 | GRANT 语句 | pg_auth_members 视图 |
六 实用权限查询示例
6.1 综合权限报告
SELECT r.rolname AS role,CASE WHEN r.rolsuper THEN 'YES' ELSE 'NO' END AS superuser,CASE WHEN r.rolcreaterole THEN 'YES' ELSE 'NO' END AS create_role,CASE WHEN r.rolcreatedb THEN 'YES' ELSE 'NO' END AS create_db,CASE WHEN r.rolcanlogin THEN 'YES' ELSE 'NO' END AS can_login,array(SELECT b.rolname FROM pg_auth_members m JOIN pg_roles b ON m.roleid = b.oid WHERE m.member = r.oid) AS member_of
FROM pg_roles r
ORDER BY 1;
6.2 查找具有特定权限的角色
-- 查找可以创建数据库的角色
SELECT rolname FROM pg_roles WHERE rolcreatedb;-- 查找可以创建其他角色的角色
SELECT rolname FROM pg_roles WHERE rolcreaterole;
PostgreSQL 的权限系统虽然与 Oracle 有所不同,但通过这些系统视图可以获取到同等详细的信息。