平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“查询Oracle 数据库用户权限的做法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
一、Oracle 权限体系说明
实际处理时,Oracle 权限分为三大类,且兼容角色嵌套继承(用户→角色→子角色→权限),查询时要区分直接权限和间接权限(借助角色继承获得):
- 系统权限:数据库级别的操作权限,如
CREATE TABLE(建表)、CREATE SESSION(登录)、UNLIMITED TABLESPACE(无限表空间)等。 - 对象权限:针对具体数据库对象(表、视图、存储过程、序列等)的操作权限,如某张表的
SELECT、UPDATE、EXECUTE等。 - 角色权限:权限的集合,能够把多个权限 / 子角色打包成角色授予用户,兼容多层嵌套(最常用的如
CONNECT、RESOURCE、DBA角色)。
二、查询当前登录用户的权限(普通用户可执行)
无需 DBA 权限,登录后直接运行,可查自己拥有的全部权限。
1. 直接授予的系统权限
SELECT privilege, admin_option
FROM user_sys_privs
ORDER BY privilege;
privilege:权限名称admin_option:是否可将该权限转授给其他用户
2. 直接授予的对象权限
SELECT owner, table_name, privilege, grantable
FROM user_tab_privs_recd
ORDER BY owner, table_name, privilege;
owner:对象所属的用户table_name:对象名称(表 / 视图 / 存储过程等)grantable:是否可将该对象权限转授给他人
3. 被授予的所有角色
SELECT granted_role, admin_option, default_role
FROM user_role_privs
ORDER BY granted_role;
default_role:是否为默认角色(登录后自动生效)
4. 所有系统权限(含角色继承的全部权限)
SELECT DISTINCT privilege
FROM (
-- 直接授予的系统权限
SELECT privilege FROM user_sys_privs
UNION ALL
-- 角色携带的系统权限
SELECT rp.privilege
FROM role_sys_privs rp
WHERE rp.role IN (SELECT granted_role FROM user_role_privs)
)
ORDER BY privilege;
5. 汇总版(看全权限)
SELECT '系统权限' AS 权限类型, privilege AS 权限名称 FROM user_sys_privs
UNION ALL
SELECT '所属角色' AS 权限类型, granted_role AS 权限名称 FROM user_role_privs
UNION ALL
SELECT '对象权限' AS 权限类型, owner||'.'||table_name||'('||privilege||')' AS 权限名称
FROM user_tab_privs_recd
ORDER BY 权限类型, 权限名称;
落到代码里,总的来说,Oracle 用户权限适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。
