查当前用户直接拥有的对象权限应使用user_tab_privs,仅返回显式授予的权限,不含角色继承权限;需以目标用户登录执行,grantable='yes'表示可转授,table_name包括表、视图等对象。

查当前用户直接拥有的对象权限用 USER_TAB_PRIVS
只返回你以该用户身份登录后、被**显式授予**的对象权限,不含角色继承来的权限。执行这条语句前,必须用目标用户连库:
SELECT owner, table_name, privilege, grantable FROM user_tab_privs;
grantable = 'YES' 表示该权限带 WITH GRANT OPTION,你能再授给别人;table_name 可能是表、视图、序列或同义词(指向的对象)。常见误操作是用 ALL_TAB_PRIVS 查自己——它会混入“你有访问权但不是授给你的”记录(比如 SELECT ANY TABLE),干扰判断。
查其他用户对象权限必须用 DBA_TAB_PRIVS,且注意大小写和权限
需要你有 DBA 角色或 SELECT_CATALOG_ROLE 权限。查 SCOTT 的权限时,WHERE grantee = 'SCOTT' 必须大写,小写 'scott' 查不到结果。
-
DBA_TAB_PRIVS只记录“谁把什么权限授给了谁”,不体现角色链(比如 SCOTT 通过 CONNECT 角色获得的权限不会出现) - 物化视图权限不在这个视图里,得查
DBA_MVIEW_PRIVS - 如果权限来自角色,要去
DBA_ROLE_PRIVS+ROLE_TAB_PRIVS追踪角色链
为什么有权限还报 ORA-00942 或 ORA-01031?重点看依赖对象
对象权限不是孤立生效的。典型例子:你授了 v_emp 的 SELECT 权限,但该视图定义里查的是 schema_a.emp。如果用户没被授 schema_a.emp 的 SELECT 权限,查询仍失败。
- 先用
SELECT text FROM ALL_VIEWS WHERE owner = 'SCHEMA_A' AND view_name = 'V_EMP';看视图 SQL - 人工列出所有被引用的基表、函数、同义词
- 逐个确认用户是否拥有对应对象的必要权限(
SELECT、EXECUTE等) - 若底层对象属他人,对方需加
WITH GRANT OPTION才能让你转授
批量查某用户对指定 Schema 下所有对象的权限
比如确认 APP_USER 对 HR 下所有表是否有 SELECT 权限:
SELECT table_name, privilege FROM dba_tab_privs WHERE grantee = 'APP_USER' AND owner = 'HR' AND privilege = 'SELECT';
注意两点:第一,这个结果只含显式授权,SELECT ANY TABLE 不会出现;第二,table_name 是视图名本身,不是它背后的基表名——如果 HR 下大量是视图,得额外检查它们的定义。
权限链越长,越容易漏掉中间某层的基表权限。别只盯着 DBA_TAB_PRIVS 一条路,角色、视图嵌套、同义词指向都得一层层剥开看。











