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 有所不同,但通过这些系统视图可以获取到同等详细的信息。