如何在Oracle中查找分配给用户的特权和角色?

93
我正在使用Linux和Oracle10g。 我创建了一个名为test的用户,并授予该用户创建会话和选择任意字典权限。 我还将sysdba和sysoper角色授予相同的用户。
现在我想显示授予该用户的所有特权和角色。 我发现以下查询仅显示创建会话和选择字典权限。
select privilege 
from dba_sys_privs 
where grantee='SAMPLE' 
order by 1;

请帮忙解决这个问题。
谢谢。

你可以使用数据字典文档 - Slava Babin
9个回答

87

除了 VAV 的回答,第一个在我的环境中最有用。

select * from USER_ROLE_PRIVS where USERNAME='SAMPLE';
select * from USER_TAB_PRIVS where Grantee = 'SAMPLE';
select * from USER_SYS_PRIVS where USERNAME = 'SAMPLE';

8
非常完整。将“样本”替换为“用户”以获取有关当前登录用户的信息。 - daitangio
4
注意:如果您正在使用 dba_XXX_privs,则列名为 grantee 而不是 username - Mr. Llama

73

39
换句话说,对那些表执行“SELECT * FROM”语句。不要偷懒...我看不到代码会很生气。并非每个人都能完全理解您的语法,而且文档链接可能会被移动。 - vapcguy
12
懒人福利:SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS;以上为需要查询的SQL语句。 - Victor Romano
1
如果你像我一样是在寻找“数据库中的任何角色”授权的人,那么 USER_ROLE_PRIVS 对你来说不起作用,因为正如 Oracle 文档所说,“USER_ROLE_PRIVS 描述了授予当前用户的角色”。相反,你应该在 DBA_ROLE_PRIVS 视图中查找信息。为什么呢?因为“DBA_ROLE_PRIVS 描述了授予数据库中所有用户和角色的角色”。 - Adrián Jaramillo

72

其他的答案都对我没用,所以我写了自己的解决方案:

适用于Oracle 11g。

将USER替换为所需的用户名

授予的角色:

SELECT * 
  FROM DBA_ROLE_PRIVS 
 WHERE GRANTEE = 'USER';

直接授予用户的特权:

SELECT * 
  FROM DBA_TAB_PRIVS 
 WHERE GRANTEE = 'USER';

授予给用户的角色所授予的特权:

SELECT * 
  FROM DBA_TAB_PRIVS  
 WHERE GRANTEE IN (SELECT granted_role 
                     FROM DBA_ROLE_PRIVS 
                    WHERE GRANTEE = 'USER');

已授予的系统特权:

SELECT * 
  FROM DBA_SYS_PRIVS 
 WHERE GRANTEE = 'USER';

如果你想查找当前连接的用户,可以将表名中的 DBA 替换为 USER 并删除 WHERE 子句。


2
这是最好的答案。谢谢。 - Baodad
这里再补充一个 - 授予角色的系统特权授予给用户:SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE IN (SELECT granted_role FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'DWMGR'); - em_bo

16

将之前的建议结合起来确定您的个人权限(即“用户”权限),然后使用此代码:

-- your permissions
select * from USER_ROLE_PRIVS where USERNAME= USER;
select * from USER_TAB_PRIVS where Grantee = USER;
select * from USER_SYS_PRIVS where USERNAME = USER;

-- granted role permissions
select * from ROLE_ROLE_PRIVS where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * from ROLE_TAB_PRIVS  where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * from ROLE_SYS_PRIVS  where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);

2
太好了!这应该是真正的答案! - vapcguy
我认为这个是最好的答案。它对我非常有效。 - Diego Romero

10

如果某个用户通过一些角色获得了权限,则可以使用以下SQL语句

select * from ROLE_ROLE_PRIVS where ROLE = 'ROLE_NAME';
select * from ROLE_TAB_PRIVS  where ROLE = 'ROLE_NAME';
select * from ROLE_SYS_PRIVS  where ROLE = 'ROLE_NAME';

当您通过角色获得权限时,深入挖掘非常有帮助。第二个查询对我很有帮助,可以检查是否向我提供了我们表的访问权限。 - nanosoft

3
SELECT * 
FROM DBA_ROLE_PRIVS 
WHERE UPPER(GRANTEE) LIKE '%XYZ%';

1
select * 
from ROLE_TAB_PRIVS 
where role in (
    select granted_role
    from dba_role_privs 
    where granted_role in ('ROLE1','ROLE2')
)

0

始终使 SQL 可重复使用:-)

-- ===================================================
-- &role_name will be "enter value for 'role_name'".
-- Date:  2015 NOV 11.

-- sample code:   define role_name=&role_name
-- sample code:   where role like '%&&role_name%'
-- ===================================================


define role_name=&role_name

select * from ROLE_ROLE_PRIVS where ROLE = '&&role_name';
select * from ROLE_SYS_PRIVS  where ROLE = '&&role_name';


select role, privilege,count(*)
 from ROLE_TAB_PRIVS
where ROLE = '&&role_name'
group by role, privilege
order by role, privilege asc
;

仅检查给定角色的ROLES组。如果我们谈论可重用性,它应该1)循环遍历USER组并从USER_ROLE_PRIVSUSER_TAB_PRIVSUSER_SYS_PRIVS中输出*,对于给定用户,然后2)为输入的给定用户提供角色(就像在ShamrockCS的答案中)。我认为鉴于OP的问题,这是我们想要知道给定用户的属性,而不是具有给定角色的用户。 - vapcguy

0

我能理解的唯一可见结果是首先与我想要获取权限的用户建立连接,然后使用以下查询:

SELECT GRANTEE, PRIVILEGE, TABLE_NAME FROM USER_TAB_PRIVS;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接